public Func <SomeNotif, bool> RegisterListener(SomeNotifFilter inp) { _trace.RegisterServiceInvocation( typeof(IServerSentEventsService), nameof(RegisterListener), inp); if (inp.DontAcceptMe) { return(null); } //when true message is forwarded to particular client return(x => { _trace.RegisterServiceInvocation( typeof(IServerSentEventsService), nameof(RegisterListener), inp, x); if (x.Num > 0 && !inp.AcceptPositive) { return false; } if (x.Num < 0 && !inp.AcceptNegative) { return false; } if (x.Num % 2 == 0 && !inp.AcceptEven) { return false; } if (x.Num % 2 == 1 && !inp.AcceptOdd) { return false; } return true; }); }
public void ServerSentEvents_FullCycle() { var flow = MagicsForTests.ClientSideFlows.ServerSentEvents; new HeavyTestRunner(_logger).RunServerAndBrowserAndExecute( flow, (assertX, server, browser) => { // //subscribe to notifications // var reqSubsCtx = new SomeNotifFilter { DontAcceptMe = false, AcceptEven = true, AcceptOdd = true, AcceptNegative = true, AcceptPositive = true }; browser.Url = HeavyTestRunnerExtensions.GenerateUrl( flow, (MagicsForTests.ValueToSend, JsonConvert.SerializeObject(reqSubsCtx ))); Poll.WaitForSuccessOrFail( () => browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text .Then(string.IsNullOrWhiteSpace)); assertX.NoServiceCallsMadeOnServer(); browser .FindElementById(MagicsForTests.RunClientSideTestConnectId) .Click(); Poll.WaitForSuccessOrFail( () => browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text .Then(x => x == "connected")); FilterInvocation onNewClient = null; assertX.InvocationsMadeOnServerAre(_ => true, () => { onNewClient = FilterInvocation .OfMethod((IServerSentEventsService x) => x.RegisterListener(reqSubsCtx)) .With(x => x.ResType = ResourceType.ServerSentEventListener); var actualCall = ServiceCall.OfMethod( (IServerSentEventsService x) => x.RegisterListener(reqSubsCtx)); return(new CsChoice <ServiceCall, FilterInvocation>[] { onNewClient, actualCall }); }); // // echo message #1 // var msg1 = new SomeNotif { Num = 5 }; browser.Url = HeavyTestRunnerExtensions.GenerateUrl( flow, (MagicsForTests.ValueToSend, JsonConvert.SerializeObject(msg1))); browser .FindElementById(MagicsForTests.RunClientSideTestSendBtnId) .Click(); Poll.WaitForSuccessOrFail( () => browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text .Then(x => x.EndsWith("\nreceived: <SomeNotif Num=5 Prop=>"))); assertX.ServiceCallsMadeOnServerAre( ServiceCall.OfMethod((IServerSentEventsService x) => x.Publish(msg1)), new ServiceCall { FullInterfaceName = typeof(IServerSentEventsService).FullName, MethodName = nameof(IServerSentEventsService.RegisterListener), Params = new object[] { reqSubsCtx, msg1 } }); // // echo message #2 // var msg2 = new SomeNotif { Num = 7 }; browser.Url = HeavyTestRunnerExtensions.GenerateUrl( flow, (MagicsForTests.ValueToSend, JsonConvert.SerializeObject(msg2))); browser .FindElementById(MagicsForTests.RunClientSideTestSendBtnId) .Click(); Poll.WaitForSuccessOrFail( () => browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text .Then(x => x.EndsWith("\nreceived: <SomeNotif Num=7 Prop=>"))); assertX.ServiceCallsMadeOnServerAre( ServiceCall.OfMethod((IServerSentEventsService x) => x.Publish(msg2)), new ServiceCall { FullInterfaceName = typeof(IServerSentEventsService).FullName, MethodName = nameof(IServerSentEventsService.RegisterListener), Params = new object[] { reqSubsCtx, msg2 } }); // // disconnecting // browser .FindElementById(MagicsForTests.RunClientSideTestDisconnectId) .Click(); Thread.Sleep(500); //wait for disconnect being acknowledged or the server side assertX.InvocationsMadeOnServerAre( _ => true, () => { return(new CsChoice <ServiceCall, FilterInvocation>[] { FilterInvocation.ExpectOnConnectionAfterFor(onNewClient) }); }); // // should not receive message now // var logContent = browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text; browser.Url = HeavyTestRunnerExtensions.GenerateUrl( flow, (MagicsForTests.ValueToSend, JsonConvert.SerializeObject( new SomeNotif { Num = 27 }))); browser .FindElementById(MagicsForTests.RunClientSideTestSendBtnId) .Click(); Thread.Sleep(500); //process message forwarding on server Poll.WaitForSuccessOrFail( () => browser .FindElementById(MagicsForTests.RunClientSideTestLogSpanId) .Text .Then(x => x == logContent)); //expects to not receive message }); }