This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 9ba717a670 IGNITE-20266 .NET: Fix MetricsTests flakiness (#2516)
9ba717a670 is described below

commit 9ba717a670927c785c12a640e899367e2bc8103f
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Wed Aug 30 16:19:27 2023 +0300

    IGNITE-20266 .NET: Fix MetricsTests flakiness (#2516)
    
    Add `AssertMetric` for reliable and succinct checks.
---
 .../dotnet/Apache.Ignite.Tests/MetricsTests.cs     | 167 ++++++++++-----------
 1 file changed, 79 insertions(+), 88 deletions(-)

diff --git a/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs 
b/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
index 501fb2e362..95d6fba8f1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
@@ -20,7 +20,6 @@ namespace Apache.Ignite.Tests;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
 using System.Diagnostics.Metrics;
 using System.Linq;
 using System.Runtime.CompilerServices;
@@ -42,18 +41,9 @@ public class MetricsTests
     [TearDown]
     public void TearDown()
     {
-        // ReSharper disable AccessToDisposedClosure
-        TestUtils.WaitForCondition(
-            () => _listener.GetMetric("requests-active") == 0,
-            3000,
-            () => "requests-active: " + 
_listener.GetMetric("requests-active"));
-
-        TestUtils.WaitForCondition(
-            () => _listener.GetMetric("connections-active") == 0,
-            3000,
-            () => "connections-active: " + 
_listener.GetMetric("connections-active"));
+        AssertMetric("requests-active", 0);
+        AssertMetric("connections-active", 0);
 
-        // ReSharper restore AccessToDisposedClosure
         _listener.Dispose();
     }
 
@@ -65,20 +55,20 @@ public class MetricsTests
     {
         using var server = new FakeServer();
 
-        Assert.AreEqual(0, _listener.GetMetric("connections-established"));
-        Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+        AssertMetric("connections-established", 0);
+        AssertMetric("connections-active", 0);
 
         using (await server.ConnectClientAsync())
         {
-            Assert.AreEqual(1, _listener.GetMetric("connections-established"));
-            Assert.AreEqual(1, _listener.GetMetric("connections-active"));
+            AssertMetric("connections-established", 1);
+            AssertMetric("connections-active", 1);
         }
 
-        Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+        AssertMetric("connections-active", 0);
 
         (await server.ConnectClientAsync()).Dispose();
-        Assert.AreEqual(2, _listener.GetMetric("connections-established"));
-        Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+        AssertMetric("connections-established", 2);
+        AssertMetric("connections-active", 0);
     }
 
     [Test]
@@ -86,53 +76,43 @@ public class MetricsTests
     {
         using var server = new FakeServer();
 
-        Assert.AreEqual(0, _listener.GetMetric("bytes-sent"));
-        Assert.AreEqual(0, _listener.GetMetric("bytes-received"));
+        AssertMetric("bytes-sent", 0);
+        AssertMetric("bytes-received", 0);
 
         using var client = await server.ConnectClientAsync();
 
-        Assert.AreEqual(11, _listener.GetMetric("bytes-sent"));
-        Assert.AreEqual(63, _listener.GetMetric("bytes-received"));
+        AssertMetric("bytes-sent", 11);
+        AssertMetric("bytes-received", 63);
 
         await client.Tables.GetTablesAsync();
 
-        Assert.AreEqual(17, _listener.GetMetric("bytes-sent"));
-        Assert.AreEqual(73, _listener.GetMetric("bytes-received"));
+        AssertMetric("bytes-sent", 17);
+        AssertMetric("bytes-received", 73);
     }
 
     [Test]
-    [SuppressMessage("ReSharper", "AccessToDisposedClosure", Justification = 
"Reviewed.")]
     public async Task TestConnectionsLost()
     {
         using var server = new FakeServer();
         using var client = await server.ConnectClientAsync(GetConfig());
 
-        Assert.AreEqual(0, _listener.GetMetric("connections-lost"));
-        Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
+        AssertMetric("connections-lost", 0);
+        AssertMetric("connections-lost-timeout", 0);
 
         server.Dispose();
 
-        TestUtils.WaitForCondition(
-            () => _listener.GetMetric("connections-lost") == 1,
-            1000,
-            () => "connections-lost: " + 
_listener.GetMetric("connections-lost"));
-
-        Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
+        AssertMetric("connections-lost", 1);
+        AssertMetric("connections-lost-timeout", 0);
     }
 
     [Test]
-    [SuppressMessage("ReSharper", "AccessToDisposedClosure", Justification = 
"Reviewed.")]
     public async Task TestConnectionsLostTimeout()
     {
         using var server = new FakeServer { HeartbeatDelay = 
TimeSpan.FromSeconds(3) };
         using var client = await 
server.ConnectClientAsync(GetConfigWithDelay());
 
-        Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
-
-        TestUtils.WaitForCondition(
-            () => _listener.GetMetric("connections-lost-timeout") == 1,
-            10000,
-            () => "connections-lost-timeout: " + 
_listener.GetMetric("connections-lost-timeout"));
+        AssertMetric("connections-lost-timeout", 0);
+        AssertMetric("connections-lost-timeout", 1, timeoutMs: 10_000);
     }
 
     [Test]
@@ -141,8 +121,8 @@ public class MetricsTests
         using var server = new FakeServer { SendInvalidMagic = true };
 
         Assert.ThrowsAsync<IgniteClientConnectionException>(async () => await 
server.ConnectClientAsync(GetConfig()));
-        Assert.AreEqual(1, _listener.GetMetric("handshakes-failed"));
-        Assert.AreEqual(0, _listener.GetMetric("handshakes-failed-timeout"));
+        AssertMetric("handshakes-failed", 1);
+        AssertMetric("handshakes-failed-timeout", 0);
     }
 
     [Test]
@@ -151,8 +131,8 @@ public class MetricsTests
         using var server = new FakeServer { HandshakeDelay = 
TimeSpan.FromSeconds(1) };
 
         Assert.ThrowsAsync<IgniteClientConnectionException>(async () => await 
server.ConnectClientAsync(GetConfigWithDelay()));
-        Assert.AreEqual(0, _listener.GetMetric("handshakes-failed"));
-        Assert.AreEqual(1, _listener.GetMetric("handshakes-failed-timeout"));
+        AssertMetric("handshakes-failed", 0);
+        AssertMetric("handshakes-failed-timeout", 1);
     }
 
     [Test]
@@ -161,21 +141,21 @@ public class MetricsTests
         using var server = new FakeServer();
         using var client = await server.ConnectClientAsync();
 
-        Assert.AreEqual(0, _listener.GetMetric("requests-sent"));
-        Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
-        Assert.AreEqual(0, _listener.GetMetric("requests-completed"));
+        AssertMetric("requests-sent", 0);
+        AssertMetric("requests-failed", 0);
+        AssertMetric("requests-completed", 0);
 
         await client.Tables.GetTablesAsync();
 
-        Assert.AreEqual(1, _listener.GetMetric("requests-sent"));
-        Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
-        Assert.AreEqual(1, _listener.GetMetric("requests-completed"));
+        AssertMetric("requests-sent", 1);
+        AssertMetric("requests-failed", 0);
+        AssertMetric("requests-completed", 1);
 
         Assert.ThrowsAsync<IgniteException>(async () => await 
client.Tables.GetTableAsync("bad-table"));
 
-        Assert.AreEqual(2, _listener.GetMetric("requests-sent"));
-        Assert.AreEqual(1, _listener.GetMetric("requests-failed"));
-        Assert.AreEqual(1, _listener.GetMetric("requests-completed"));
+        AssertMetric("requests-sent", 2);
+        AssertMetric("requests-failed", 1);
+        AssertMetric("requests-completed", 1);
     }
 
     [Test]
@@ -184,14 +164,14 @@ public class MetricsTests
         using var server = new FakeServer { OperationDelay = 
TimeSpan.FromSeconds(1) };
         using var client = await server.ConnectClientAsync();
 
-        Assert.AreEqual(0, _listener.GetMetric("requests-active"));
+        AssertMetric("requests-active", 0);
 
         _ = client.Tables.GetTablesAsync();
 
-        Assert.AreEqual(1, _listener.GetMetric("requests-active"));
-        Assert.AreEqual(1, _listener.GetMetric("requests-sent"));
-        Assert.AreEqual(0, _listener.GetMetric("requests-completed"));
-        Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
+        AssertMetric("requests-active", 1);
+        AssertMetric("requests-sent", 1);
+        AssertMetric("requests-completed", 0);
+        AssertMetric("requests-failed", 0);
     }
 
     [Test]
@@ -201,10 +181,10 @@ public class MetricsTests
         using var client = await server.ConnectClientAsync();
 
         await client.Tables.GetTablesAsync();
-        Assert.AreEqual(0, _listener.GetMetric("requests-retried"));
+        AssertMetric("requests-retried", 0);
 
         await client.Tables.GetTablesAsync();
-        Assert.AreEqual(3, _listener.GetMetric("requests-retried"));
+        AssertMetric("requests-retried", 3);
     }
 
     [Test]
@@ -213,41 +193,40 @@ public class MetricsTests
         using var server = new FakeServer();
         using var client = await server.ConnectClientAsync();
 
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-sent"), 
"streamer-batches-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-sent"), 
"streamer-items-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+        AssertMetric("streamer-batches-sent", 0);
+        AssertMetric("streamer-items-sent", 0);
+        AssertMetric("streamer-batches-active", 0);
+        AssertMetric("streamer-items-queued", 0);
 
         var table = await 
client.Tables.GetTableAsync(FakeServer.ExistingTableName);
         var view = table!.RecordBinaryView;
 
         await view.StreamDataAsync(GetTuples().ToAsyncEnumerable(), 
DataStreamerOptions.Default with { BatchSize = 2 });
 
-        Assert.AreEqual(1, _listener.GetMetric("streamer-batches-sent"), 
"streamer-batches-sent");
-        Assert.AreEqual(2, _listener.GetMetric("streamer-items-sent"), 
"streamer-items-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+        AssertMetric("streamer-batches-sent", 1);
+        AssertMetric("streamer-items-sent", 2);
+        AssertMetric("streamer-batches-active", 0);
+        AssertMetric("streamer-items-queued", 0);
 
         IEnumerable<IIgniteTuple> GetTuples()
         {
-            Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-            Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+            AssertMetric("streamer-batches-active", 0);
+            AssertMetric("streamer-items-queued", 0);
 
             yield return new IgniteTuple { ["ID"] = 1 };
 
-            Assert.AreEqual(1, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-            Assert.AreEqual(1, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+            AssertMetric("streamer-batches-active", 1);
+            AssertMetric("streamer-items-queued", 1);
 
             yield return new IgniteTuple { ["ID"] = 2 };
 
-            Assert.AreEqual(2, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-            Assert.AreEqual(2, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
-
-            TestUtils.WaitForCondition(() => 
_listener.GetMetric("streamer-batches-sent") == 1);
+            AssertMetric("streamer-batches-active", 2);
+            AssertMetric("streamer-items-queued", 2);
 
-            Assert.AreEqual(1, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-            Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
-            Assert.AreEqual(2, _listener.GetMetric("streamer-items-sent"), 
"streamer-items-sent");
+            AssertMetric("streamer-batches-sent", 1);
+            AssertMetric("streamer-batches-active", 1);
+            AssertMetric("streamer-items-queued", 0);
+            AssertMetric("streamer-items-sent", 2);
         }
     }
 
@@ -257,10 +236,10 @@ public class MetricsTests
         using var server = new FakeServer();
         using var client = await server.ConnectClientAsync();
 
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-sent"), 
"streamer-batches-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-sent"), 
"streamer-items-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+        AssertMetric("streamer-batches-sent", 0);
+        AssertMetric("streamer-items-sent", 0);
+        AssertMetric("streamer-batches-active", 0);
+        AssertMetric("streamer-items-queued", 0);
 
         var table = await 
client.Tables.GetTableAsync(FakeServer.ExistingTableName);
         var view = table!.RecordBinaryView;
@@ -268,13 +247,13 @@ public class MetricsTests
 
         var task = view.StreamDataAsync(GetTuples(), 
DataStreamerOptions.Default with { BatchSize = 10 }, cts.Token);
 
-        TestUtils.WaitForCondition(() => 
_listener.GetMetric("streamer-batches-sent") > 0);
+        AssertMetricGreaterOrEqual("streamer-batches-sent", 1);
         cts.Cancel();
         Assert.CatchAsync<OperationCanceledException>(async () => await task);
 
-        Assert.GreaterOrEqual(_listener.GetMetric("streamer-batches-sent"), 1, 
"streamer-batches-sent");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"), 
"streamer-batches-active");
-        Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"), 
"streamer-items-queued");
+        AssertMetricGreaterOrEqual("streamer-batches-sent", 2);
+        AssertMetric("streamer-batches-active", 0);
+        AssertMetric("streamer-items-queued", 0);
 
         static async IAsyncEnumerable<IIgniteTuple> 
GetTuples([EnumeratorCancellation] CancellationToken ct = default)
         {
@@ -305,6 +284,18 @@ public class MetricsTests
             RetryPolicy = new RetryNonePolicy()
         };
 
+    private void AssertMetric(string name, int value, int timeoutMs = 1000) =>
+        TestUtils.WaitForCondition(
+            condition: () => _listener.GetMetric(name) == value,
+            timeoutMs: timeoutMs,
+            messageFactory: () => $"{name}: expected '{value}', but was 
'{_listener.GetMetric(name)}'");
+
+    private void AssertMetricGreaterOrEqual(string name, int value, int 
timeoutMs = 1000) =>
+        TestUtils.WaitForCondition(
+            condition: () => _listener.GetMetric(name) >= value,
+            timeoutMs: timeoutMs,
+            messageFactory: () => $"{name}: expected '>= {value}', but was 
'{_listener.GetMetric(name)}'");
+
     private sealed class Listener : IDisposable
     {
         private readonly MeterListener _listener = new();

Reply via email to