From 4a261e2c58a81b7ffa34e98c0c4740f05ac8cb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6llner?= Date: Mon, 19 Aug 2019 22:46:58 +0200 Subject: [PATCH] Test stability improvements --- Capnp.Net.Runtime.Tests/TcpRpcInterop.cs | 62 ++++++++++++------------ Capnp.Net.Runtime/Rpc/Impatient.cs | 11 +++++ CapnpCompatTest/CapnpCompatTest.cpp | 8 +-- appveyor.yml | 6 ++- 4 files changed, 53 insertions(+), 34 deletions(-) diff --git a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs index 949ea75..f19ac4b 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs @@ -349,7 +349,7 @@ namespace Capnp.Net.Runtime.Tests { AssertOutput(stdout, "ReleaseOnCancel test start"); AssertOutput(stdout, "ReleaseOnCancel test end"); - Assert.IsTrue(SpinWait.SpinUntil(() => counters.HandleCount == 0, MediumNonDbgTimeout)); + Assert.IsTrue(SpinWait.SpinUntil(() => counters.HandleCount == 0, MediumNonDbgTimeout), $"Handle count stuck at {counters.HandleCount}"); }); } } @@ -773,42 +773,44 @@ namespace Capnp.Net.Runtime.Tests } var cap = new TestCallOrderImpl(); - - var earlyCall = main.GetCallSequence(0, default); - - var echo = main.Echo(cap, default); - - using (var pipeline = echo.Eager()) + using (Skeleton.Claim(cap)) { - var call0 = pipeline.GetCallSequence(0, default); - var call1 = pipeline.GetCallSequence(1, default); + var earlyCall = main.GetCallSequence(0, default); - Assert.IsTrue(earlyCall.Wait(MediumNonDbgTimeout), "early call returns"); + var echo = main.Echo(cap, default); - var call2 = pipeline.GetCallSequence(2, default); - - Assert.IsTrue(echo.Wait(MediumNonDbgTimeout)); - using (var resolved = echo.Result) + using (var pipeline = echo.Eager()) { - var call3 = pipeline.GetCallSequence(3, default); - var call4 = pipeline.GetCallSequence(4, default); - var call5 = pipeline.GetCallSequence(5, default); + var call0 = pipeline.GetCallSequence(0, default); + var call1 = pipeline.GetCallSequence(1, default); - Assert.IsTrue(call0.Wait(MediumNonDbgTimeout), "call 0 returns"); - Assert.IsTrue(call1.Wait(MediumNonDbgTimeout), "call 1 returns"); - Assert.IsTrue(call2.Wait(MediumNonDbgTimeout), "call 2 returns"); - Assert.IsTrue(call3.Wait(MediumNonDbgTimeout), "call 3 returns"); - Assert.IsTrue(call4.Wait(MediumNonDbgTimeout), "call 4 returns"); - Assert.IsTrue(call5.Wait(MediumNonDbgTimeout), "call 5 returns"); + Assert.IsTrue(earlyCall.Wait(MediumNonDbgTimeout), "early call returns"); + + var call2 = pipeline.GetCallSequence(2, default); + + Assert.IsTrue(echo.Wait(MediumNonDbgTimeout)); + using (var resolved = echo.Result) + { + var call3 = pipeline.GetCallSequence(3, default); + var call4 = pipeline.GetCallSequence(4, default); + var call5 = pipeline.GetCallSequence(5, default); + + Assert.IsTrue(call0.Wait(MediumNonDbgTimeout), "call 0 returns"); + Assert.IsTrue(call1.Wait(MediumNonDbgTimeout), "call 1 returns"); + Assert.IsTrue(call2.Wait(MediumNonDbgTimeout), "call 2 returns"); + Assert.IsTrue(call3.Wait(MediumNonDbgTimeout), "call 3 returns"); + Assert.IsTrue(call4.Wait(MediumNonDbgTimeout), "call 4 returns"); + Assert.IsTrue(call5.Wait(MediumNonDbgTimeout), "call 5 returns"); + + Assert.AreEqual(0u, call0.Result); + Assert.AreEqual(1u, call1.Result); + Assert.AreEqual(2u, call2.Result); + Assert.AreEqual(3u, call3.Result); + Assert.AreEqual(4u, call4.Result); + Assert.AreEqual(5u, call5.Result); + } - Assert.AreEqual(0u, call0.Result); - Assert.AreEqual(1u, call1.Result); - Assert.AreEqual(2u, call2.Result); - Assert.AreEqual(3u, call3.Result); - Assert.AreEqual(4u, call4.Result); - Assert.AreEqual(5u, call5.Result); } - } } } diff --git a/Capnp.Net.Runtime/Rpc/Impatient.cs b/Capnp.Net.Runtime/Rpc/Impatient.cs index e49d8e0..dc278ae 100644 --- a/Capnp.Net.Runtime/Rpc/Impatient.cs +++ b/Capnp.Net.Runtime/Rpc/Impatient.cs @@ -30,7 +30,18 @@ namespace Capnp.Rpc } var rtask = AwaitAnswer(); + + // Really weird: We'd expect AwaitAnswer() to initialize a new Task instance upon each invocation. + // However, this does not seem to be always true (as indicated by CI test suite). An explanation might be + // that the underlying implementation recycles Task instances. Let's work around it. + +#if NETSTANDARD2_0 + _taskTable.Remove(rtask); _taskTable.Add(rtask, promise); +#else + _taskTable.AddOrUpdate(rtask, promise); +#endif + return rtask; } diff --git a/CapnpCompatTest/CapnpCompatTest.cpp b/CapnpCompatTest/CapnpCompatTest.cpp index 84259ce..a3bc50b 100644 --- a/CapnpCompatTest/CapnpCompatTest.cpp +++ b/CapnpCompatTest/CapnpCompatTest.cpp @@ -821,9 +821,11 @@ void ReleaseOnCancelTest(capnp::EzRpcClient& rpc) // // TODO(cleanup): This is fragile, but I'm not sure how else to write it without a ton // of scaffolding. - kj::evalLater([]() {}).wait(waitScope); - kj::evalLater([]() {}).wait(waitScope); - waitScope.poll(); + //kj::evalLater([]() {}).wait(waitScope); + //kj::evalLater([]() {}).wait(waitScope); + //waitScope.poll(); + + promise.wait(waitScope); } for (uint i = 0; i < 16; i++) kj::evalLater([]() {}).wait(waitScope); diff --git a/appveyor.yml b/appveyor.yml index eb6a430..c1bb8ca 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,4 +48,8 @@ test_script: - cmd: vstest.console /logger:Appveyor /inIsolation Capnp.Net.Runtime.Tests.Core21\bin\Release\netcoreapp2.2\Capnp.Net.Runtime.Tests.Core21.dll on_finish : # any cleanup in here -deploy: off \ No newline at end of file +deploy: + - provider: Environment + name: GitHub + on: + APPVEYOR_REPO_TAG: true