in rd-net/Test.RdFramework/RdTaskTest.cs [75:145]
public void TestCancellation()
{
ClientWire.AutoTransmitMode = true;
ServerWire.AutoTransmitMode = true;
var serverEntity = BindToServer(LifetimeDefinition.Lifetime, NewRdCall<Unit, string>(), ourKey);
var clientEntity = BindToClient(LifetimeDefinition.Lifetime, CreateEndpoint<Unit, string>(x => x.ToString()), ourKey);
bool handlerFinished = false;
bool handlerCompletedSuccessfully = false;
clientEntity.Set(async (lf, req) =>
{
try
{
await Task.Delay(500, lf);
handlerCompletedSuccessfully = true;
}
finally
{
handlerFinished = true;
}
return "";
});
//1. explicit cancellation
{
var ld = new LifetimeDefinition();
var task = serverEntity.Start(ld.Lifetime, Unit.Instance).AsTask();
ld.Terminate();
SpinWaitEx.SpinUntil(() => task.IsCompleted);
Assert.True(task.IsOperationCanceled());
SpinWaitEx.SpinUntil(() => handlerFinished);
Assert.False(handlerCompletedSuccessfully);
}
//2. no cancellation
{
handlerFinished = false;
handlerCompletedSuccessfully = false;
var task = serverEntity.Start(new LifetimeDefinition().Lifetime, Unit.Instance).AsTask();
SpinWaitEx.SpinUntil(() => task.IsCompleted);
Assert.False(task.IsOperationCanceled());
SpinWaitEx.SpinUntil(() => handlerFinished);
Assert.True(handlerCompletedSuccessfully);
}
//3. terminatedLifetime
{
var task = serverEntity.Start(Lifetime.Terminated, Unit.Instance).AsTask();
Assert.IsTrue(task.IsCanceled);
}
//4. cancellation from parent lifetime
{
handlerFinished = false;
handlerCompletedSuccessfully = false;
var task = serverEntity.Start(new LifetimeDefinition().Lifetime, Unit.Instance).AsTask();
LifetimeDefinition.Terminate();
SpinWaitEx.SpinUntil(() => task.IsCompleted);
Assert.True(task.IsOperationCanceled());
SpinWaitEx.SpinUntil(() => handlerFinished);
Assert.False(handlerCompletedSuccessfully);
}
}