public async Task ProtoContextAccessor_GettingProtoContextDoesNotFlowIfExecutionContextDoesNotFlow() { var accessor = new ProtoContextAccessor(); var context = new DefaultProtoContext(); accessor.ProtoContext = context; var checkAsyncFlowTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); ThreadPool.UnsafeQueueUserWorkItem(_ => { try { // The ProtoContext flows with the execution context Assert.Null(accessor.ProtoContext); checkAsyncFlowTcs.SetResult(null); } catch (Exception ex) { checkAsyncFlowTcs.SetException(ex); } }, null); await checkAsyncFlowTcs.Task; }
public void ConstructorWithoutServiceScopeFactoryThrows() { // Arrange var accessor = new ProtoContextAccessor(); var exception1 = Assert.Throws <ArgumentNullException>(() => new ProtoContextFactory(Options.Create(new FormOptions()), accessor)); var exception2 = Assert.Throws <ArgumentNullException>(() => new ProtoContextFactory(Options.Create(new FormOptions()))); Assert.Equal("serviceScopeFactory", exception1.ParamName); Assert.Equal("serviceScopeFactory", exception2.ParamName); }
public void CreateProtoContextSetsProtoContextAccessor() { // Arrange var accessor = new ProtoContextAccessor(); var contextFactory = new ProtoContextFactory(Options.Create(new FormOptions()), new MyServiceScopeFactory(), accessor); // Act var context = contextFactory.Create(new FeatureCollection()); // Assert Assert.Same(context, accessor.ProtoContext); }
public async Task ProtoContextAccessor_GettingProtoContextReturnsProtoContext() { var accessor = new ProtoContextAccessor(); var context = new DefaultProtoContext(); context.TraceIdentifier = "1"; accessor.ProtoContext = context; await Task.Delay(100); Assert.Same(context, accessor.ProtoContext); }
public async Task ProtoContextAccessor_GettingProtoContextReturnsNullProtoContextIfChanged() { var accessor = new ProtoContextAccessor(); var context = new DefaultProtoContext(); accessor.ProtoContext = context; var checkAsyncFlowTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); var waitForNullTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); var afterNullCheckTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); ThreadPool.QueueUserWorkItem(async _ => { // The ProtoContext flows with the execution context Assert.Same(context, accessor.ProtoContext); checkAsyncFlowTcs.SetResult(null); await waitForNullTcs.Task; try { Assert.Null(accessor.ProtoContext); afterNullCheckTcs.SetResult(null); } catch (Exception ex) { afterNullCheckTcs.SetException(ex); } }); await checkAsyncFlowTcs.Task; // Set a new http context var context2 = new DefaultProtoContext(); accessor.ProtoContext = context2; waitForNullTcs.SetResult(null); Assert.Same(context2, accessor.ProtoContext); await afterNullCheckTcs.Task; }
public void ProtoContextAccessor_GettingProtoContextWithOutSettingReturnsNull() { var accessor = new ProtoContextAccessor(); Assert.Null(accessor.ProtoContext); }