コード例 #1
0
        public async Task AddRemoveMixedEventHandlersTest()
        {
            var serverBuilder = new RpcServiceDefinitionsBuilder();

            serverBuilder.RegisterService <ISimpleServiceWithEvents>();

            var(host, connection) = this.CreateServerAndConnection(serverBuilder);
            var servicePublisher = host.ServicePublisher;

            host.Start();

            try
            {
                var serviceImpl = new TestServiceWithEventsImpl();
                using (var publishScope = servicePublisher.PublishInstance(serviceImpl))
                {
                    var objectId = publishScope.Value.ObjectId;

                    var clientService = connection.GetServiceInstance <ISimpleServiceWithEvents>(objectId);

                    _ = await TestMixedEventHandlers(clientService).DefaultTimeout();

                    Assert.IsFalse(serviceImpl.HasDetailedValueChangedHandler);
                    Assert.IsFalse(serviceImpl.HasValueChangedHandler);

                    _ = await TestMixedEventHandlers(clientService);

                    Assert.IsFalse(serviceImpl.HasDetailedValueChangedHandler);
                    Assert.IsFalse(serviceImpl.HasValueChangedHandler);
                }
            }
            finally
            {
                await host.ShutdownAsync();
            }
        }
コード例 #2
0
        public async Task PlainEventHandlerTest()
        {
            var serverBuilder = new RpcServiceDefinitionsBuilder();

            serverBuilder.RegisterService <ISimpleServiceWithEvents>();

            var(host, connection) = this.CreateServerAndConnection(serverBuilder);
            var servicePublisher = host.ServicePublisher;

            host.Start();

            try
            {
                var serviceImpl1 = new TestServiceWithEventsImpl();
                var serviceImpl2 = new TestServiceWithEventsImpl();

                using (var publishScope1 = servicePublisher.PublishInstance(serviceImpl1))
                    using (var publishScope2 = servicePublisher.PublishInstance(serviceImpl2))
                    {
                        var objectId1 = publishScope1.Value.ObjectId;
                        var objectId2 = publishScope2.Value.ObjectId;

                        var clientService1 = connection.GetServiceInstance <ISimpleServiceWithEvents>(objectId1);
                        var clientService2 = connection.GetServiceInstance <ISimpleServiceWithEvents>(objectId2);

                        var          valueChangedTcs1     = new TaskCompletionSource <EventArgs>();
                        EventHandler valueChangedHandler1 = (s, e) =>
                        {
                            valueChangedTcs1.SetResult(e);
                        };

                        var          valueChangedTcs2     = new TaskCompletionSource <EventArgs>();
                        EventHandler valueChangedHandler2 = (s, e) =>
                        {
                            valueChangedTcs2.SetResult(e);
                        };

                        clientService1.ValueChanged += valueChangedHandler1;
                        clientService2.ValueChanged += valueChangedHandler2;

                        await((IRpcProxy)clientService1).WaitForPendingEventHandlersAsync();
                        await((IRpcProxy)clientService2).WaitForPendingEventHandlersAsync();

                        clientService1.SetValueAsync(12).Forget();
                        clientService2.SetValueAsync(24).Forget();

                        try
                        {
                            await Task.WhenAll(valueChangedTcs1.Task, valueChangedTcs2.Task).DefaultTimeout();
                        }
                        catch (TimeoutException)
                        {
                            System.Threading.Thread.Sleep(1);
                        }
                        Assert.IsTrue(valueChangedTcs1.Task.IsCompletedSuccessfully());
                        Assert.IsTrue(valueChangedTcs2.Task.IsCompletedSuccessfully());

                        clientService1.ValueChanged -= valueChangedHandler1;
                        await((IRpcProxy)clientService1).WaitForPendingEventHandlersAsync();
                        clientService1.SetValueAsync(13).Forget();

                        // Wait a little to make sure that the event handler has been removed on the server side as well.
                        await Task.Delay(200);

                        Assert.IsFalse(serviceImpl1.HasDetailedValueChangedHandler);
                        Assert.IsFalse(serviceImpl1.HasValueChangedHandler);

                        clientService2.ValueChanged -= valueChangedHandler2;
                        await((IRpcProxy)clientService2).WaitForPendingEventHandlersAsync();
                        clientService2.SetValueAsync(25).Forget();

                        // Wait a little to make sure that the event handler has been removed on the server side as well.
                        await Task.Delay(200);

                        Assert.IsFalse(serviceImpl2.HasDetailedValueChangedHandler);
                        Assert.IsFalse(serviceImpl2.HasValueChangedHandler);
                    }
            }
            finally
            {
                await host.ShutdownAsync();
            }
        }
コード例 #3
0
        public async Task GenericEventHandlerTest()
        {
            var serverBuilder = new RpcServiceDefinitionsBuilder();

            serverBuilder.RegisterService <ISimpleServiceWithEvents>();

            var(host, connection) = this.CreateServerAndConnection(serverBuilder);
            var servicePublisher = host.ServicePublisher;

            host.Start();

            try
            {
                var serviceImpl1 = new TestServiceWithEventsImpl();
                var serviceImpl2 = new TestServiceWithEventsImpl();
                using (var publishScope1 = servicePublisher.PublishInstance(serviceImpl1))
                    using (var publishScope2 = servicePublisher.PublishInstance(serviceImpl2))
                    {
                        var objectId1      = publishScope1.Value.ObjectId;
                        var objectId2      = publishScope2.Value.ObjectId;
                        var clientService1 = connection.GetServiceInstance <ISimpleServiceWithEvents>(objectId1);
                        var clientService2 = connection.GetServiceInstance <ISimpleServiceWithEvents>(objectId2);

                        var detailedTcs1 = new TaskCompletionSource <ValueChangedEventArgs>();
                        EventHandler <ValueChangedEventArgs> detailedHandler1 = (s, e) =>
                        {
                            detailedTcs1.SetResult(e);
                        };
                        clientService1.DetailedValueChanged += detailedHandler1;

                        var detailedTcs2 = new TaskCompletionSource <ValueChangedEventArgs>();
                        EventHandler <ValueChangedEventArgs> detailedHandler2 = (s, e) =>
                        {
                            detailedTcs2.SetResult(e);
                        };
                        clientService2.DetailedValueChanged += detailedHandler2;

                        //var delayTask = Task.Delay(5000);

                        //Task t = await Task.WhenAny( ((IRpcProxy)clientService1).WaitForPendingEventHandlers(), delayTask);
                        //if (t == delayTask)

                        await((IRpcProxy)clientService1).WaitForPendingEventHandlersAsync().DefaultTimeout();
                        //var delayTask2 = Task.Delay(5000);

                        //Task t2 = await Task.WhenAny(((IRpcProxy)clientService2).WaitForPendingEventHandlers(), delayTask);
                        //if (t2 == delayTask)

                        await((IRpcProxy)clientService2).WaitForPendingEventHandlersAsync().DefaultTimeout();

                        clientService1.SetValueAsync(12).Forget();
                        clientService2.SetValueAsync(24).Forget();

                        var detailedArgs1 = await detailedTcs1.Task.DefaultTimeout();

                        var detailedArgs2 = await detailedTcs2.Task.DefaultTimeout();

                        clientService1.DetailedValueChanged -= detailedHandler1;
                        await((IRpcProxy)clientService1).WaitForPendingEventHandlersAsync().DefaultTimeout();
                        await clientService1.SetValueAsync(13).DefaultTimeout();

                        // Verify 1
                        Assert.AreEqual(12, detailedArgs1.NewValue);
                        Assert.AreEqual(0, detailedArgs1.OldValue);

                        // Wait a little to make sure that the event handler has been removed on the server side as well.
                        await Task.Delay(200);

                        Assert.IsFalse(serviceImpl1.HasDetailedValueChangedHandler);
                        Assert.IsFalse(serviceImpl1.HasValueChangedHandler);

                        clientService2.DetailedValueChanged -= detailedHandler2;
                        await((IRpcProxy)clientService2).WaitForPendingEventHandlersAsync().DefaultTimeout();
                        await clientService1.SetValueAsync(25).DefaultTimeout();

                        // Verify 2
                        Assert.AreEqual(24, detailedArgs2.NewValue);
                        Assert.AreEqual(0, detailedArgs2.OldValue);

                        // Wait a little to make sure that the event handler has been removed on the server side as well.
                        await Task.Delay(200);

                        Assert.IsFalse(serviceImpl2.HasDetailedValueChangedHandler);
                        Assert.IsFalse(serviceImpl2.HasValueChangedHandler);
                    }
            }
            finally
            {
                await host.ShutdownAsync().DefaultTimeout();
            }
        }