コード例 #1
0
        public Task <Unit> Publish(SomeNotif inp)
        {
            _trace.RegisterServiceInvocation(typeof(IServerSentEventsService), nameof(Publish), inp);

            _subs.SendMessage(inp);
            return(Task.FromResult(Unit.Instance));
        }
コード例 #2
0
        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
            });
        }