示例#1
0
        public UserInterfaceThreadSynchronizerTest()
        {
            this.synchronizationContext = new TestSynchronizationContext();
            this.logExtensionMock       = new Mock <IUserInterfaceThreadSynchronizerLogExtension>();

            this.testee = new UserInterfaceThreadSynchronizer(this.synchronizationContext, this.logExtensionMock.Object);
        }
        public void TestConcurrencyInThreadsAndMicrothreads()
        {
            var scheduler       = new Scheduler();
            var microThreadLock = new MicroThreadLock();
            var counter         = 0;

            for (var j = 0; j < ThreadCount; ++j)
            {
                var microThread = scheduler.Create();
                microThread.Start(async() =>
                {
                    using (await microThreadLock.LockAsync())
                    {
                        var initialValue = counter;
                        for (var i = 0; i < IncrementCount; ++i)
                        {
                            Assert.AreEqual(initialValue + i, counter);
                            await Task.Yield();
                            ++counter;
                        }
                    }
                });
            }
            var threads = new List <Thread>();

            for (var j = 0; j < ThreadCount; ++j)
            {
                var thread = new Thread(() =>
                {
                    var sc = new TestSynchronizationContext();
                    SynchronizationContext.SetSynchronizationContext(sc);
                    sc.Post(async x =>
                    {
                        using ((await microThreadLock.ReserveSyncLock()).Lock())
                        {
                            var initialValue = counter;
                            for (var i = 0; i < IncrementCount; ++i)
                            {
                                Assert.AreEqual(initialValue + i, counter);
                                Thread.Sleep(1);
                                ++counter;
                            }
                        }
                        sc.SignalEnd();
                    }, null);
                    sc.RunUntilEnd();
                })
                {
                    Name = $"Thread {j}"
                };
                thread.Start();
                threads.Add(thread);
            }
            while (scheduler.MicroThreads.Count > 0)
            {
                scheduler.Run();
            }
            threads.ForEach(x => x.Join());
            Assert.AreEqual(2 * ThreadCount * IncrementCount, counter);
        }
        public static void WaitTest()
        {
            var tsc = new TestSynchronizationContext();

            Assert.Throws <ArgumentNullException>(() => tsc.Wait(null, false, 0));

            var    e           = new ManualResetEvent(false);
            IntPtr eventHandle = e.SafeWaitHandle.DangerousGetHandle();
            var    handles     = new IntPtr[] { eventHandle, eventHandle };

            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, false, 0));
            Assert.Throws <DuplicateWaitObjectException>(() => tsc.Wait(handles, true, 0));

            var e2 = new ManualResetEvent(false);

            handles = new IntPtr[] { eventHandle, e2.SafeWaitHandle.DangerousGetHandle() };
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, false, 0));
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, true, 0));

            e.Set();
            Assert.Equal(0, tsc.Wait(handles, false, 0));
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, true, 0));

            e2.Set();
            Assert.Equal(0, tsc.Wait(handles, false, 0));
            Assert.Equal(0, tsc.Wait(handles, true, 0));
        }
示例#4
0
        public UserInterfaceThreadSynchronizerTest()
        {
            this.synchronizationContext = new TestSynchronizationContext();
            this.logExtension           = A.Fake <IUserInterfaceThreadSynchronizerLogExtension>();

            this.testee = new UserInterfaceThreadSynchronizer(this.synchronizationContext, this.logExtension);
        }
        public UserInterfaceThreadSynchronizerTest()
        {
            this.synchronizationContext = new TestSynchronizationContext();
            this.logExtension = A.Fake<IUserInterfaceThreadSynchronizerLogExtension>();

            this.testee = new UserInterfaceThreadSynchronizer(this.synchronizationContext, this.logExtension);
        }
 public void SetUp()
 {
     _context                   = new TestSynchronizationContext();
     _target                    = new SynchronizationContextCollection <string>(_context);
     _collectionChanged         = new List <NotifyCollectionChangedEventArgs>();
     _target.CollectionChanged += (_, e) => _collectionChanged.Add(e);
 }
        public void Teardown()
        {
            this.subscriptionLogger     = null;
            this.synchronizationContext = null;

            this.eventAggregator = null;
        }
        public UserInterfaceThreadSynchronizerTest()
        {
            this.synchronizationContext = new TestSynchronizationContext();
            this.logExtensionMock = new Mock<IUserInterfaceThreadSynchronizerLogExtension>();

            this.testee = new UserInterfaceThreadSynchronizer(this.synchronizationContext, this.logExtensionMock.Object);
        }
        public void Setup()
        {
            this.subscriptionLogger     = new NullLogger <ISubscription>();
            this.synchronizationContext = new TestSynchronizationContext();

            this.eventAggregator = new EventAggregatorService(this.subscriptionLogger);
            this.eventAggregator.SetMainThreadSynchronizationContext(this.synchronizationContext);
        }
		public void Should_properly_wrap_the_channel_as_synchronized()
		{
			Assert.IsNull(SynchronizationContext.Current);

			var fiber = new PoolFiber();

			var input = new ChannelAdapter();

			var context = new TestSynchronizationContext();

			var future = new Future<TestMessage>();

			SynchronizationContext.SetSynchronizationContext(context);

			Assert.IsNotNull(SynchronizationContext.Current);

			using (input.Connect(x =>
				{
					x.AddConsumerOf<TestMessage>()
						.OnCurrentSynchronizationContext()
						.UsingConsumer(message =>
							{
								Trace.WriteLine("Received on Thread: " + Thread.CurrentThread.ManagedThreadId);

								Assert.IsNotNull(SynchronizationContext.Current);
								Assert.AreEqual(context, SynchronizationContext.Current);

								future.Complete(message);
							});
				}))
			{
				Trace.WriteLine("Subscribed on Thread: " + Thread.CurrentThread.ManagedThreadId);

				SynchronizationContext.SetSynchronizationContext(null);

				input.Flatten().Select(c => c.GetType()).ShouldEqual(new[]
					{
						typeof(ChannelAdapter),
						typeof(BroadcastChannel),
						typeof(TypedChannelAdapter<TestMessage>),
						typeof(SynchronizedChannel<TestMessage>),
						typeof(ConsumerChannel<TestMessage>),
					});

				fiber.Add(() =>
					{
						Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId);
						Assert.IsNull(SynchronizationContext.Current);

						input.Send(new TestMessage());
					});

				Assert.IsNull(SynchronizationContext.Current);

				future.WaitUntilCompleted(2.Seconds()).ShouldBeTrue();
			}
		}
        public void Should_properly_wrap_the_channel_as_synchronized()
        {
            Assert.IsNull(SynchronizationContext.Current);

            var fiber = new ThreadPoolFiber();

            var input = new ChannelAdapter();

            var context = new TestSynchronizationContext();

            var future = new Future <TestMessage>();

            SynchronizationContext.SetSynchronizationContext(context);

            Assert.IsNotNull(SynchronizationContext.Current);

            using (input.Connect(x =>
            {
                x.AddConsumerOf <TestMessage>()
                .OnCurrentSynchronizationContext()
                .UsingConsumer(message =>
                {
                    Trace.WriteLine("Received on Thread: " + Thread.CurrentThread.ManagedThreadId);

                    Assert.IsNotNull(SynchronizationContext.Current);
                    Assert.AreEqual(context, SynchronizationContext.Current);

                    future.Complete(message);
                });
            }))
            {
                Trace.WriteLine("Subscribed on Thread: " + Thread.CurrentThread.ManagedThreadId);

                SynchronizationContext.SetSynchronizationContext(null);

                input.Flatten().Select(c => c.GetType()).ShouldEqual(new[]
                {
                    typeof(ChannelAdapter),
                    typeof(BroadcastChannel),
                    typeof(TypedChannelAdapter <TestMessage>),
                    typeof(SynchronizedChannel <TestMessage>),
                    typeof(ConsumerChannel <TestMessage>),
                });

                fiber.Add(() =>
                {
                    Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId);
                    Assert.IsNull(SynchronizationContext.Current);

                    input.Send(new TestMessage());
                });

                Assert.IsNull(SynchronizationContext.Current);

                future.WaitUntilCompleted(2.Seconds()).ShouldBeTrue();
            }
        }
示例#12
0
        public void Teardown()
        {
            this.handleCounter               = 0;
            this.subscribeStatus             = true;
            this.publisherThreadSubscription = null;
            this.passedEvent            = null;
            this.synchronizationContext = null;

            SynchronizationContext.SetSynchronizationContext(null);
        }
示例#13
0
    public async Task SwallowCancellation_ShouldNotCaptureContext()
    {
        var context = new TestSynchronizationContext();

        SynchronizationContext.SetSynchronizationContext(context);

        await Task.Run(() => throw new OperationCanceledException())
        .SwallowCancellationAsync()
        .ConfigureAwait(false);

        Assert.False(context.IsPostCalled);
    }
示例#14
0
    public async Task HandleCancellation_ShouldCaptureContextWhenSpecified()
    {
        var context = new TestSynchronizationContext();

        SynchronizationContext.SetSynchronizationContext(context);

        await Task.Run(() => throw new OperationCanceledException())
        .HandleCancellationAsync(exception => { }, true)
        .ConfigureAwait(false);

        Assert.True(context.IsPostCalled);
    }
示例#15
0
        public void Setup()
        {
            this.synchronizationContext = new TestSynchronizationContext();
            this.handleAction           = () => { };
            this.logger = new NullLogger <ISubscription>();

            SynchronizationContext.SetSynchronizationContext(this.synchronizationContext);

            this.publisherThreadSubscription = new Subscription <TestEvent>(
                this.logger,
                e =>
            {
                this.passedEvent = e;
                this.handleCounter++;

                this.handleAction();
            },
                false,
                EventPriority.Normal,
                ThreadTarget.PublisherThread,
                this.synchronizationContext,
                () => this.subscribeStatus = false);

            this.mainThreadSubscription = new Subscription <TestEvent>(
                this.logger,
                e =>
            {
                this.passedEvent = e;
                this.handleCounter++;

                this.handleAction();
            },
                false,
                EventPriority.Normal,
                ThreadTarget.MainThread,
                this.synchronizationContext,
                () => this.subscribeStatus = false);

            this.backgroundThreadSubscription = new Subscription <TestEvent>(
                this.logger,
                e =>
            {
                this.passedEvent = e;
                this.handleCounter++;

                this.handleAction();
            },
                false,
                EventPriority.Normal,
                ThreadTarget.BackgroundThread,
                this.synchronizationContext,
                () => this.subscribeStatus = false);
        }
        public void CanSpecifySynchronizationContextForObservationsOnAsyncObservable()
        {
            var synchronizationContext = new TestSynchronizationContext();

            var observable = CreateIntAsyncEnumerable().CreateAsyncObservable().ObserveOn(synchronizationContext);
            var observer   = CreateIntAsyncObserver();

            using (observable.Subscribe(observer))
                observer.WaitForCompletion();

            synchronizationContext.NotifiedCount.Should().Be(StreamLength);
        }
示例#17
0
    public async Task HandleException_ShouldNotCaptureContextByDefault()
    {
        var context = new TestSynchronizationContext();

        SynchronizationContext.SetSynchronizationContext(context);

        await Task.Run(() => throw new InvalidOperationException())
        .HandleExceptionAsync <InvalidOperationException>(exception => { })
        .ConfigureAwait(false);

        Assert.False(context.IsPostCalled);
    }
示例#18
0
        private static void CreateSetAndTest(int expectedId)
        {
            Assert.IsNull(SynchronizationContext.Current);

            var testSyncContext = new TestSynchronizationContext();

            SynchronizationContext.SetSynchronizationContext(testSyncContext);

            var currSyncContext = SynchronizationContext.Current;

            Assert.IsNotNull(currSyncContext);
            Assert.AreSame(testSyncContext, currSyncContext);
            Assert.AreEqual(expectedId, testSyncContext.id);
        }
        public void TestReentrancyInThreads()
        {
            var microThreadLock = new MicroThreadLock();
            var counter         = 0;
            var threads         = new List <Thread>();

            for (var j = 0; j < ThreadCount; ++j)
            {
                var thread = new Thread(() =>
                {
                    var sc = new TestSynchronizationContext();
                    SynchronizationContext.SetSynchronizationContext(sc);
                    sc.Post(async x =>
                    {
                        using ((await microThreadLock.ReserveSyncLock()).Lock())
                        {
                            var initialValue = counter;
                            using ((await microThreadLock.ReserveSyncLock()).Lock())
                            {
                                for (var i = 0; i < IncrementCount; ++i)
                                {
                                    using ((await microThreadLock.ReserveSyncLock()).Lock())
                                    {
                                        Assert.AreEqual(initialValue + i, counter);
                                    }
                                    using ((await microThreadLock.ReserveSyncLock()).Lock())
                                    {
                                        Thread.Sleep(1);
                                    }
                                    using ((await microThreadLock.ReserveSyncLock()).Lock())
                                    {
                                        ++counter;
                                    }
                                }
                            }
                        }
                        sc.SignalEnd();
                    }, null);
                    sc.RunUntilEnd();
                })
                {
                    Name = $"Thread {j}"
                };
                thread.Start();
                threads.Add(thread);
            }
            threads.ForEach(x => x.Join());
            Assert.AreEqual(ThreadCount * IncrementCount, counter);
        }
        public async Task TestExecuteAsync_DoesNotExecuteMethodFromSameThreadWhenRunningInSynchronizationContext()
#endif
        {
            var reader  = new Mock <IDataReader>();
            var command = new Mock <IDbCommand>();
            var ctx     = new TestSynchronizationContext();

            SynchronizationContext.SetSynchronizationContext(ctx);

            command.Setup(d => d.ExecuteReader())
            .Returns(reader.Object);

            reader.SetupGet(r => r.FieldCount)
            .Returns(1);

            var results = new[] { "Hello", ", ", "World!" };

            int index = -1;

            reader.Setup(r => r.Read())
            .Callback(() => ++ index)
            .Returns(() => index < results.Length);

            reader.Setup(r => r.GetName(0))
            .Returns("Id");
            reader.Setup(r => r.GetString(0)).Returns((int _) => results[index]);
            reader.Setup(r => r.GetFieldType(0)).Returns(typeof(string));

            var connection = new Mock <IDbConnection>();

            connection.Setup(c => c.CreateCommand())
            .Callback(() => ctx.Worker.Should().NotBeSameAs(Thread.CurrentThread, "Command called from the same thread as the reentrant Task."))
            .Returns(command.Object);

            var sp  = new StoredProcedure <InterfaceImpl>("foo");
            var res = await sp.ExecuteAsync(connection.Object);

            var idx = 0;

            foreach (var toTest in res)
            {
                toTest.ShouldBeEquivalentTo(new InterfaceImpl {
                    Id = results[idx++]
                });
            }

            SynchronizationContext.SetSynchronizationContext(null);
        }
示例#21
0
        public void GlobalAddressResolverUpdateAsyncSynchronizationTest()
        {
            SynchronizationContext prevContext = SynchronizationContext.Current;

            try
            {
                TestSynchronizationContext syncContext = new TestSynchronizationContext();
                SynchronizationContext.SetSynchronizationContext(syncContext);
                syncContext.Post(_ =>
                {
                    UserAgentContainer container      = new UserAgentContainer(clientId: 0);
                    FakeMessageHandler messageHandler = new FakeMessageHandler();

                    AccountProperties databaseAccount = new AccountProperties();
                    Mock <IDocumentClientInternal> mockDocumentClient = new Mock <IDocumentClientInternal>();
                    mockDocumentClient.Setup(owner => owner.ServiceEndpoint).Returns(new Uri("https://blabla.com/"));
                    mockDocumentClient.Setup(owner => owner.GetDatabaseAccountInternalAsync(It.IsAny <Uri>(), It.IsAny <CancellationToken>())).ReturnsAsync(databaseAccount);

                    GlobalEndpointManager globalEndpointManager = new GlobalEndpointManager(mockDocumentClient.Object, new ConnectionPolicy());
                    GlobalPartitionEndpointManager partitionKeyRangeLocationCache = new GlobalPartitionEndpointManagerCore(globalEndpointManager);

                    ConnectionPolicy connectionPolicy = new ConnectionPolicy
                    {
                        RequestTimeout = TimeSpan.FromSeconds(10)
                    };

                    GlobalAddressResolver globalAddressResolver = new GlobalAddressResolver(
                        endpointManager: globalEndpointManager,
                        partitionKeyRangeLocationCache: partitionKeyRangeLocationCache,
                        protocol: Documents.Client.Protocol.Tcp,
                        tokenProvider: this.mockTokenProvider.Object,
                        collectionCache: null,
                        routingMapProvider: null,
                        serviceConfigReader: this.mockServiceConfigReader.Object,
                        connectionPolicy: connectionPolicy,
                        httpClient: MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler)));

                    ConnectionStateListener connectionStateListener = new ConnectionStateListener(globalAddressResolver);
                    connectionStateListener.OnConnectionEvent(ConnectionEvent.ReadEof, DateTime.Now, new Documents.Rntbd.ServerKey(new Uri("https://endpoint.azure.com:4040/")));
                }, state: null);
            }
            finally
            {
                SynchronizationContext.SetSynchronizationContext(prevContext);
            }
        }
示例#22
0
        public async Task ContextualAsyncTest()
        {
            var syncContext = new TestSynchronizationContext();
            var scheduler   = FutureScheduler.FromSynchronizationContext(syncContext);

            async ContextualFuture LocalTest()
            {
                syncContext.AssertCurrentContext();

                await LocalTest2();
            }

            async Future LocalTest2()
            {
                await FutureScheduler.ThreadPool;

                Assert.Null(SynchronizationContext.Current);
            }

            await scheduler.Run(() => LocalTest());
        }
		public void Calls_WhenError_via_SynchronizationContext()
		{
			var sc = new TestSynchronizationContext();
			var whenErrorWasCalled = false;

			var workerAction = WorkerAction.Define()
				.DoWork(delegate
				        	{
				        		throw new ApplicationException("Test exception");
				        	})
				.WhenError(delegate
				           	{
				           		Assert.IsTrue(sc.IsInSend);
				           		whenErrorWasCalled = true;
				           	})
				.Create();

			workerAction.SynchronizationContext = sc;
			workerAction.Run();

			Assert.IsTrue(whenErrorWasCalled, "WhenError was not called");
		}
        public static void WaitNotificationTest()
        {
            ThreadTestHelpers.RunTestInBackgroundThread(() =>
            {
                var tsc = new TestSynchronizationContext();
                SynchronizationContext.SetSynchronizationContext(tsc);
                Assert.Same(tsc, SynchronizationContext.Current);

                var e          = new ManualResetEvent(false);
                tsc.WaitAction = () => e.Set();
                Assert.False(tsc.IsWaitNotificationRequired());
                Assert.False(e.WaitOne(0));
                tsc.SetWaitNotificationRequired();
                Assert.True(tsc.IsWaitNotificationRequired());
                Assert.True(e.WaitOne(0));

                var mres       = new ManualResetEventSlim();
                tsc.WaitAction = () => mres.Set();
                mres.Reset();
                mres.CheckedWait();

                e.Reset();
                tsc.WaitAction = () => e.Set();
                SynchronizationContext.SetSynchronizationContext(new TestSynchronizationContext());
                Assert.False(e.WaitOne(0));
                SynchronizationContext.SetSynchronizationContext(tsc);
                Assert.True(e.WaitOne(0));
                e.Reset();
                e.CheckedWait();

                e.Reset();
                var lockObj = new object();
                var lockAcquiredFromBackground = new AutoResetEvent(false);
                Action waitForThread;
                Thread t =
                    ThreadTestHelpers.CreateGuardedThread(out waitForThread, () =>
                {
                    lock (lockObj)
                    {
                        lockAcquiredFromBackground.Set();
                        e.CheckedWait();
                    }
                });
                t.IsBackground = true;
                t.Start();
                lockAcquiredFromBackground.CheckedWait();
                Assert.True(Monitor.TryEnter(lockObj, ThreadTestHelpers.UnexpectedTimeoutMilliseconds));
                Monitor.Exit(lockObj);
                waitForThread();

                e.Reset();
                var m = new Mutex();
                t     = ThreadTestHelpers.CreateGuardedThread(out waitForThread, () =>
                {
                    m.CheckedWait();
                    try
                    {
                        lockAcquiredFromBackground.Set();
                        e.CheckedWait();
                    }
                    finally
                    {
                        m.ReleaseMutex();
                    }
                });
                t.IsBackground = true;
                t.Start();
                lockAcquiredFromBackground.CheckedWait();
                m.CheckedWait();
                m.ReleaseMutex();
                waitForThread();
            });
        }
示例#25
0
 public ScreenViewTests()
 {
     _terminal = new TestTerminal();
     _renderer = new ConsoleRenderer(_terminal);
     _synchronizationContext = new TestSynchronizationContext();
 }
 public void TearDown()
 {
     _target  = null;
     _context = null;
 }
 [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] // desktop framework does not check for null and crashes
 public static void WaitTest_ChangedInDotNetCore()
 {
     Assert.Throws <ArgumentNullException>(() => TestSynchronizationContext.WaitHelper(null, false, 0));
 }
示例#28
0
 public ScreenViewTests()
 {
     _console  = new TestConsole();
     _renderer = new ConsoleRenderer(_console);
     _synchronizationContext = new TestSynchronizationContext();
 }
示例#29
0
        public void VerifySynchronizationContextDoesNotLock()
        {
            string databaseId = Guid.NewGuid().ToString();
            SynchronizationContext prevContext = SynchronizationContext.Current;

            try
            {
                TestSynchronizationContext syncContext = new TestSynchronizationContext();
                SynchronizationContext.SetSynchronizationContext(syncContext);
                syncContext.Post(_ =>
                {
                    using (CosmosClient client = TestCommon.CreateCosmosClient())
                    {
                        Cosmos.Database database = client.CreateDatabaseAsync(databaseId).GetAwaiter().GetResult();
                        database = client.CreateDatabaseIfNotExistsAsync(databaseId).GetAwaiter().GetResult();

                        database.ReadStreamAsync().ConfigureAwait(false).GetAwaiter().GetResult();
                        database.ReadAsync().ConfigureAwait(false).GetAwaiter().GetResult();

                        QueryDefinition databaseQuery = new QueryDefinition("select * from T where T.id = @id").WithParameter("@id", databaseId);
                        FeedIterator <DatabaseProperties> databaseIterator = client.GetDatabaseQueryIterator <DatabaseProperties>(databaseQuery);
                        while (databaseIterator.HasMoreResults)
                        {
                            databaseIterator.ReadNextAsync().GetAwaiter().GetResult();
                        }

                        Container container = database.CreateContainerAsync(Guid.NewGuid().ToString(), "/pk").GetAwaiter().GetResult();
                        container           = database.CreateContainerIfNotExistsAsync(container.Id, "/pk").GetAwaiter().GetResult();

                        ToDoActivity testItem = ToDoActivity.CreateRandomToDoActivity();
                        ItemResponse <ToDoActivity> response = container.CreateItemAsync <ToDoActivity>(item: testItem).ConfigureAwait(false).GetAwaiter().GetResult();
                        Assert.IsNotNull(response);
                        string diagnostics = response.Diagnostics.ToString();
                        Assert.IsTrue(diagnostics.Contains("SynchronizationContext"));

                        using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

                        try
                        {
                            ToDoActivity tempItem = ToDoActivity.CreateRandomToDoActivity();
                            CancellationToken cancellationToken = cancellationTokenSource.Token;
                            cancellationTokenSource.Cancel();
                            container.CreateItemAsync <ToDoActivity>(item: tempItem, cancellationToken: cancellationToken).ConfigureAwait(false).GetAwaiter().GetResult();
                            Assert.Fail("Should have thrown a cancellation token");
                        }catch (CosmosOperationCanceledException oe)
                        {
                            string exception = oe.ToString();
                            Assert.IsTrue(exception.Contains("SynchronizationContext"));
                        }

                        // Test read feed
                        container.GetItemLinqQueryable <ToDoActivity>(
                            allowSynchronousQueryExecution: true,
                            requestOptions: new QueryRequestOptions()
                        {
                        }).ToList();

                        FeedIterator feedIterator = container.GetItemLinqQueryable <ToDoActivity>()
                                                    .ToStreamIterator();

                        while (feedIterator.HasMoreResults)
                        {
                            feedIterator.ReadNextAsync().GetAwaiter().GetResult();
                        }

                        FeedIterator <ToDoActivity> feedIteratorTyped = container.GetItemLinqQueryable <ToDoActivity>()
                                                                        .ToFeedIterator <ToDoActivity>();

                        while (feedIteratorTyped.HasMoreResults)
                        {
                            feedIteratorTyped.ReadNextAsync().GetAwaiter().GetResult();
                        }

                        // Test query
                        container.GetItemLinqQueryable <ToDoActivity>(
                            allowSynchronousQueryExecution: true,
                            requestOptions: new QueryRequestOptions()
                        {
                        }).Where(item => item.id != "").ToList();

                        FeedIterator queryIterator = container.GetItemLinqQueryable <ToDoActivity>()
                                                     .Where(item => item.id != "").ToStreamIterator();

                        while (queryIterator.HasMoreResults)
                        {
                            queryIterator.ReadNextAsync().GetAwaiter().GetResult();
                        }

                        FeedIterator <ToDoActivity> queryIteratorTyped = container.GetItemLinqQueryable <ToDoActivity>()
                                                                         .Where(item => item.id != "").ToFeedIterator <ToDoActivity>();

                        while (queryIteratorTyped.HasMoreResults)
                        {
                            queryIteratorTyped.ReadNextAsync().GetAwaiter().GetResult();
                        }

                        double costAsync = container.GetItemLinqQueryable <ToDoActivity>()
                                           .Select(x => x.cost).SumAsync().GetAwaiter().GetResult();

                        double cost = container.GetItemLinqQueryable <ToDoActivity>(
                            allowSynchronousQueryExecution: true).Select(x => x.cost).Sum();

                        ItemResponse <ToDoActivity> deleteResponse = container.DeleteItemAsync <ToDoActivity>(partitionKey: new Cosmos.PartitionKey(testItem.pk), id: testItem.id).ConfigureAwait(false).GetAwaiter().GetResult();
                        Assert.IsNotNull(deleteResponse);
                    }
                }, state: null);
            }
            finally
            {
                SynchronizationContext.SetSynchronizationContext(prevContext);
                using (CosmosClient client = TestCommon.CreateCosmosClient())
                {
                    client.GetDatabase(databaseId).DeleteAsync().GetAwaiter().GetResult();
                }
            }
        }
		public void Uses_synchronization_context_for_response()
		{
			int result = 0;
			bool wasInSend = false;

			var sc = new TestSynchronizationContext();

			_client1.SynchronizationContext = sc;

			_client2.CreateSubscriber<Request>()
				.WithAction(request => _client2.Reply(new Response1 {Number = request.Number}))
				.AddTo(_disposables);

			var channel = _client1.CreateChannel()
				.HandleResponse<Response1>(response =>
				                           	{
				                           		wasInSend = sc.IsInSend;
				                           		result = response.Number;
				                           		_waitEvent.Set();
				                           	})
				.AddTo(_disposables);

			// This is lame -- need to have an action when the subscription is ready
			Thread.Sleep(500);

			channel.Send(new Request {Number = 42});

			_waitEvent.WaitOne();

			Assert.AreEqual(42, result);
			Assert.IsTrue(wasInSend);
		}
        public static void WaitNotificationTest()
        {
            ThreadTestHelpers.RunTestInBackgroundThread(() =>
            {
                var tsc = new TestSynchronizationContext();
                SynchronizationContext.SetSynchronizationContext(tsc);
                Assert.Same(tsc, SynchronizationContext.Current);

                var e = new ManualResetEvent(false);
                tsc.WaitAction = () => e.Set();
                Assert.False(tsc.IsWaitNotificationRequired());
                Assert.False(e.WaitOne(0));
                tsc.SetWaitNotificationRequired();
                Assert.True(tsc.IsWaitNotificationRequired());
                Assert.True(e.WaitOne(0));

                var mres = new ManualResetEventSlim();
                tsc.WaitAction = () => mres.Set();
                mres.Reset();
                mres.CheckedWait();

                e.Reset();
                tsc.WaitAction = () => e.Set();
                SynchronizationContext.SetSynchronizationContext(new TestSynchronizationContext());
                Assert.False(e.WaitOne(0));
                SynchronizationContext.SetSynchronizationContext(tsc);
                Assert.True(e.WaitOne(0));
                e.Reset();
                e.CheckedWait();

                e.Reset();
                var lockObj = new object();
                var lockAcquiredFromBackground = new AutoResetEvent(false);
                Action waitForThread;
                Thread t =
                    ThreadTestHelpers.CreateGuardedThread(out waitForThread, () =>
                    {
                        lock (lockObj)
                        {
                            lockAcquiredFromBackground.Set();
                            e.CheckedWait();
                        }
                    });
                t.IsBackground = true;
                t.Start();
                lockAcquiredFromBackground.CheckedWait();
                Assert.True(Monitor.TryEnter(lockObj, ThreadTestHelpers.UnexpectedTimeoutMilliseconds));
                Monitor.Exit(lockObj);
                waitForThread();

                e.Reset();
                var m = new Mutex();
                t = ThreadTestHelpers.CreateGuardedThread(out waitForThread, () =>
                {
                    m.CheckedWait();
                    try
                    {
                        lockAcquiredFromBackground.Set();
                        e.CheckedWait();
                    }
                    finally
                    {
                        m.ReleaseMutex();
                    }
                });
                t.IsBackground = true;
                t.Start();
                lockAcquiredFromBackground.CheckedWait();
                m.CheckedWait();
                m.ReleaseMutex();
                waitForThread();
            });
        }
        public static void WaitTest()
        {
            var tsc = new TestSynchronizationContext();
            Assert.Throws<ArgumentNullException>(() => tsc.Wait(null, false, 0));

            var e = new ManualResetEvent(false);
            IntPtr eventHandle = e.SafeWaitHandle.DangerousGetHandle();
            var handles = new IntPtr[] { eventHandle, eventHandle };
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, false, 0));
            Assert.Throws<DuplicateWaitObjectException>(() => tsc.Wait(handles, true, 0));

            var e2 = new ManualResetEvent(false);
            handles = new IntPtr[] { eventHandle, e2.SafeWaitHandle.DangerousGetHandle() };
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, false, 0));
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, true, 0));

            e.Set();
            Assert.Equal(0, tsc.Wait(handles, false, 0));
            Assert.Equal(WaitHandle.WaitTimeout, tsc.Wait(handles, true, 0));

            e2.Set();
            Assert.Equal(0, tsc.Wait(handles, false, 0));
            Assert.Equal(0, tsc.Wait(handles, true, 0));
        }
 private void SetupSynchronizationContext()
 {
     _synchronizationContext = new TestSynchronizationContext();
     SynchronizationContext.SetSynchronizationContext(_synchronizationContext);
     this._testInstance = new FileUploadController();
 }
		public void Uses_synchronization_context_for_timeout()
		{
			bool timedOut = false;
			var sc = new TestSynchronizationContext();

			_client1.SynchronizationContext = sc;

			var channel = _client1.CreateChannel()
				.HandleTimeout(1, () =>
				                  	{
				                  		Assert.IsTrue(sc.IsInSend);
				                  		timedOut = true;
				                  		_waitEvent.Set();
				                  	})
				.AddTo(_disposables);

			channel.Send(new Request {Number = 999});

			_waitEvent.WaitOne(3000);

			Assert.IsTrue(timedOut);
		}
示例#35
0
		public void Starting_and_Stopped_event_called_with_two_actions_and_with_SynchronizationContext()
		{
			var sc = new TestSynchronizationContext();
			_worker.SynchronizationContext = sc;

			var counter = 0;
			var startingRaised = 0;
			var stoppedRaised = 0;

			var doWork1Called = 0;
			var whenComplete1Called = 0;
			var doWorkWaitHandle1 = new ManualResetEvent(false);

			var doWork2Called = 0;
			var whenComplete2Called = 0;
			var doWorkWaitHandle2 = new ManualResetEvent(false);

			var completeWaitHandle = new ManualResetEvent(false);
			var stoppedRaisedWaitHandle = new ManualResetEvent(false);

			_worker.Starting += delegate
			                    	{
			                    		Assert.IsTrue(sc.IsInSend);
			                    		startingRaised = Interlocked.Increment(ref counter);
			                    	};
			_worker.Stopped += delegate
			                   	{
									Assert.IsTrue(sc.IsInSend);
			                   		stoppedRaised = Interlocked.Increment(ref counter);
			                   		stoppedRaisedWaitHandle.Set();
			                   		completeWaitHandle.WaitOne();
			                   	};

			// start one worker
			WorkerAction.Define()
				.DoWork(delegate
				        	{
				        		doWork1Called = Interlocked.Increment(ref counter);
				        		doWorkWaitHandle1.Set();
				        		completeWaitHandle.WaitOne();
				        	})
				.WhenComplete(delegate
				              	{
									Assert.IsTrue(sc.IsInSend);
				              		whenComplete1Called = ++counter;
				              	})
				.Run(_worker);

			// wait for the worker to start
			doWorkWaitHandle1.WaitOne();

			Assert.AreEqual(1, startingRaised);
			Assert.AreEqual(2, doWork1Called);
			Assert.AreEqual(0, stoppedRaised);

			// start another work action while the first one is still running
			WorkerAction.Define()
				.DoWork(delegate
				{
					doWork2Called = Interlocked.Increment(ref counter);
					doWorkWaitHandle2.Set();
				})
				.WhenComplete(delegate
				              	{
									Assert.IsTrue(sc.IsInSend);
				              		whenComplete2Called = ++counter;
				              	})
				.Run(_worker);

			doWorkWaitHandle2.WaitOne();

			Assert.AreEqual(1, startingRaised); // did not get called again
			Assert.AreEqual(2, doWork1Called);
			Assert.AreEqual(3, doWork2Called);
			Assert.AreEqual(0, stoppedRaised);

			completeWaitHandle.Set();
			stoppedRaisedWaitHandle.WaitOne();

			Assert.AreEqual(1, startingRaised); // did not get called again
			Assert.AreEqual(2, doWork1Called);
			Assert.AreEqual(3, doWork2Called);
			// one should be 4 and one should be 5, but they could be either order
			Assert.AreEqual(9, whenComplete1Called + whenComplete2Called);
			Assert.AreEqual(6, stoppedRaised);
		}
		public void Calls_WhenComplete_via_SynchronizationContext()
		{
			var sc = new TestSynchronizationContext();
			bool doWorkWasRun = false;
			bool whenCompleteWasRun = false;

			var action = WorkerAction.Define()
				.DoWork(delegate
				{
					// Verifies that this is not being called
					// via the SynchronizationContext
					Assert.IsFalse(sc.IsInSend);
					doWorkWasRun = true;
					return 2 + 2;
				})
				.WhenComplete(delegate(int n)
				{
					Assert.IsTrue(sc.IsInSend);
					Assert.AreEqual(4, n);
					whenCompleteWasRun = true;
				})
				.WhenError(ex => Assert.Fail("When error called"))
				.Create();


			action.SynchronizationContext = sc;

			action.Run();

			Assert.IsTrue(doWorkWasRun);
			Assert.IsTrue(whenCompleteWasRun);
		}