Пример #1
0
        public void HelloWorldTest_CyclesThroughWholeProgram()
        {
            new HeavyTestRunner(_logger).RunServerAndBrowserAndExecute(
                MagicsForTests.ClientSideFlows.HelloWorld, (assertX, server, browser) => {
                assertX.DialogIsVisibleInBrowser("Hello there");

                browser
                .FindElementByXPath(XPathBuilder.Dialog("Hello there").InBody("/input[@type='text']"))
                .SendKeys(someName);

                assertX.NoServiceCallsMadeOnServer();

                browser
                .FindElementByXPath(XPathBuilder.Dialog("Hello there").HasEnabledButtonAction("OK"))
                .Click();

                assertX.DialogIsVisibleInBrowser("Server reply");

                assertX.InvocationsMadeOnServerAre(x => x.ResType == ResourceType.RegularPostService, () => {
                    var onBefore   = FilterInvocation.OfMethod((IHelloWorldService x) => x.SayHello(someName));
                    var actualCall = ServiceCall.OfMethod((IHelloWorldService x) => x.SayHello(someName));
                    var onAfter    = FilterInvocation.ExpectOnConnectionAfterFor(onBefore);

                    return(new CsChoice <ServiceCall, FilterInvocation>[] { onBefore, actualCall, onAfter });
                });

                assertX.MatchesXPathInBrowser(
                    XPathBuilder
                    .Dialog("Server reply")
                    .HasReadOnlyLabel($"Hello {someName}. How are you?"));
            });
        }
        public FSharpAsync <ConnectionAction> OnConnectionBeforeHandler(
            IDiResolveReleaseOnlyContainer di, string url, object serviceInstanceOrNull,
            MethodInfo methodOrNull, object[] parms, ResourceType res)
        {
            var ci   = di.Resolve <ClientConnectionInfo>();
            var guid = Guid.NewGuid().ToString();

            LogAsReply($"OnConnectionBeforeHandler() ip={ci.ClientIpAddress} guid={guid} url={url} resourceType={res.ToString()} serviceImpl={serviceInstanceOrNull} method={methodOrNull} parms={parms}");

            var ctx = new FilterInvocation {
                Url     = url,
                ResType = res,
                InvType = FilterInvocationType.BeforeConnection,
                FullInterfaceNameOrNull = serviceInstanceOrNull == null ?
                                          null
                    :
                                          FindServiceInterfaceType(serviceInstanceOrNull).FullName,
                MethodNameOrNull = methodOrNull?.Name,
                Guid             = guid
            };

            SendFilterInvocation(ctx);

            return(FSharpAsyncUtil.FromResult(ConnectionAction.CreateNonFiltered(ctx)));
        }
Пример #3
0
 public static CommandReply AsCommandReply(this FilterInvocation self, ICodec codec)
 {
     return(new CommandReply {
         Type = ReplyType.FilterInvoked,
         ReplyData = codec.Encode(self)
     });
 }
Пример #4
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
            });
        }
 private void SendFilterInvocation(FilterInvocation inv)
 {
     Send(inv.AsCommandReply(_codec));
 }