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(); } }
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(); } }
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(); } }