예제 #1
0
        public async Task JsonServerHandlesDeserializationErrors()
        {
            // fake transport and serializer
            var server           = new StubServer();
            var client           = new StubClient(server);
            var provider         = new StubMessageTypeProvider();
            var serverSerializer = new BrokenSerializer();
            var clientSerializer = new Serializer();
            var executor         = new StubExecutor();

            using (var js = new JsonServer(server, provider, serverSerializer, executor))
                using (var jc = new JsonClient(client, provider, clientSerializer))
                {
                    js.Start();

                    var tcs = new TaskCompletionSource <bool>();
                    js.UnhandledException += (s, e) => tcs.TrySetException(e.Exception);

                    // TODO: can we have something better than a timeout here?
                    await Assert_TimedOut(jc.ConnectAsync(), timeout : Task.Delay(200));

                    // the server should have got an unhandled exception
                    Assert.ThrowsAsync <NotImplementedException>(async() => await Assert_NotTimedOut(tcs.Task));
                }
        }
예제 #2
0
        public void JsonClientCallsUnhandledException()
        {
            var server           = new StubServer();
            var client           = new StubClient(server);
            var clientProvider   = new StubMessageTypeProvider();
            var clientSerializer = new Serializer();
            var jc        = new JsonClient(client, clientProvider, clientSerializer);
            var exception = default(Exception);

            jc.UnhandledException += (s, e) => exception = e.Exception;

            // simulate JsonServicesException
            jc.HandleClientMessage(this, new MessageEventArgs());
            Assert.IsInstanceOf <JsonServicesException>(exception);

            exception = null;
            jc.HandleClientMessage(this, new MessageEventArgs {
                Data = string.Empty
            });
            Assert.IsInstanceOf <JsonServicesException>(exception);

            // simulate NullReferenceException
            exception     = null;
            jc.Serializer = null;
            jc.HandleClientMessage(this, new MessageEventArgs {
                Data = "Goofy"
            });
            Assert.IsInstanceOf <NullReferenceException>(exception);
        }
예제 #3
0
        public async Task JsonClientSupportsFilteredSubscriptionsAndUnsubscriptionsUsingFleckServer()
        {
            // fake transport and serializer
            var server           = new StubServer();
            var serverSerializer = new Serializer();
            var serverProvider   = new StubMessageTypeProvider();
            var executor         = new StubExecutor();

            var client           = new StubClient(server, "jc");
            var clientProvider   = new StubMessageTypeProvider();
            var clientSerializer = new Serializer();

            var secondClient           = new StubClient(server, "sc");
            var secondClientProvider   = new StubMessageTypeProvider();
            var secondClientSerializer = new Serializer();

            // json server and client
            using (var js = new JsonServer(server, serverProvider, serverSerializer, executor, AuthProvider))
                using (var jc = new JsonClient(client, clientProvider, clientSerializer))
                    using (var sc = new JsonClient(secondClient, secondClientProvider, secondClientSerializer))
                    {
                        // set names for easier debugging
                        jc.DebugName = "First";
                        sc.DebugName = "Second";

                        // execute core test
                        await TestFilteredSubscriptionsAndUnsubscriptionsCore(js, jc, sc, Credentials);
                    }
        }
예제 #4
0
        public void SrpAuthenticationFailsOnBadCredentials()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            // json server and client
            using (var js = new JsonServer(server, provider, serializer, executor, AuthProvider))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    // default credentials
                    var ex = Assert.ThrowsAsync <AuthFailedException>(async() =>
                                                                      await CallGetVersionServiceCore(js, jc));
                    Assert.AreEqual("No credentials specified", ex.Message);

                    // invalid credentials
                    ex = Assert.ThrowsAsync <AuthFailedException>(async() =>
                                                                  await CallGetVersionServiceCore(js, jc, new SrpCredentials("root", "beer")));
                    Assert.AreEqual("Authentication failed", ex.Message);

                    // invalid credentials
                    ex = Assert.ThrowsAsync <AuthFailedException>(async() =>
                                                                  await CallGetVersionServiceCore(js, jc, new SrpCredentials("hacker", "password")));
                    Assert.AreEqual("Authentication failed", ex.Message);
                }
        }
예제 #5
0
        protected override JsonClient CreateClient(JsonServer server)
        {
            var client     = new StubClient(server.Server as StubServer);
            var serializer = new Serializer();
            var provider   = new StubMessageTypeProvider();

            return(new JsonClient(client, provider, serializer));
        }
예제 #6
0
        protected override JsonServer CreateServer()
        {
            // fake transport
            var server     = new StubServer();
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            return(new JsonServer(server, provider, serializer, executor, AuthProvider));
        }
예제 #7
0
        protected virtual JsonClient CreateClient(JsonServer server)
        {
            // fake transport and serializer
            var client     = new StubClient((StubServer)server.Server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            return(new JsonClient(client, provider, serializer));
        }
예제 #8
0
        protected virtual int MaxClientsWithExceptions => 100;         // exceptions slow things down considerably

        protected virtual JsonServer CreateServer()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            return(new JsonServer(server, provider, serializer, executor));
        }
예제 #9
0
        public void JsonClientCallAndNotifyThrowOnNullArguments()
        {
            var server           = new StubServer();
            var client           = new StubClient(server);
            var clientProvider   = new StubMessageTypeProvider();
            var clientSerializer = new Serializer();
            var jc = new JsonClient(client, clientProvider, clientSerializer);

            Assert.Throws <ArgumentNullException>(() => jc.Notify(null));
            Assert.ThrowsAsync <ArgumentNullException>(() => jc.Call(null));
            Assert.ThrowsAsync <ArgumentNullException>(() => jc.Call <string>(null));
        }
예제 #10
0
        public async Task CallGetVersionService()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            using (var js = new JsonServer(server, provider, serializer, executor))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    await CallGetVersionServiceCore(js, jc);
                }
        }
예제 #11
0
        public async Task JsonClientRejectsPendingMessagesWhenConnectionIsAborted()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            // json server and client
            using (var js = new JsonServer(server, provider, serializer, executor))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    await CallDelayServiceAndAbortConnectionCore(js, jc);
                }
        }
예제 #12
0
        public async Task JsonServerAwaitsTasks()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            // json server and client
            using (var js = new JsonServer(server, provider, serializer, executor))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    await CallDelayServiceCore(js, jc);
                }
        }
예제 #13
0
        public async Task CallCalculateServiceUsingSrpAuthentication()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            // json server and client
            using (var js = new JsonServer(server, provider, serializer, executor, AuthProvider))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    await CallCalculateServiceCore(js, jc, Credentials);
                }
        }
예제 #14
0
        public async Task JsonServerHasEvents()
        {
            var server     = new StubServer();
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();
            var js         = new JsonServer(server, provider, serializer, executor);

            var connectCounter = 0;

            void connectEventHandler(object sender, MessageEventArgs e) => connectCounter++;

            js.ClientConnected    += connectEventHandler;
            js.ClientDisconnected += connectEventHandler;

            var serviceCounter = 0;

            void serviceEventHandler(object sender, EventArgs e) => serviceCounter++;

            js.InitializeRequestContext += serviceEventHandler;
            js.BeforeExecuteService     += serviceEventHandler;
            js.AfterExecuteService      += serviceEventHandler;

            var client = new StubClient(server);
            var jc     = new JsonClient(client, provider, serializer);

            Assert.AreEqual(1, connectCounter);
            Assert.AreEqual(0, serviceCounter);

            // connect makes one service call and fires three events:
            // InitializeRequestContext, BeforeExecuteService, AfterExecuteService
            await jc.ConnectAsync();

            Assert.AreEqual(3, serviceCounter);

            js.Dispose();
            Assert.AreEqual(2, connectCounter);

            // unsubscribe
            js.ClientDisconnected       -= connectEventHandler;
            js.ClientConnected          -= connectEventHandler;
            js.AfterExecuteService      -= serviceEventHandler;
            js.BeforeExecuteService     -= serviceEventHandler;
            js.InitializeRequestContext -= serviceEventHandler;
        }
예제 #15
0
        public void SrpAuthenticationFailsOnIncompatibleAuthProvider()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            // json server without authentication vs SRP client
            using (var js = new JsonServer(server, provider, serializer, executor))
                using (var jc = new JsonClient(client, provider, serializer))
                {
                    var ex = Assert.ThrowsAsync <AuthFailedException>(async() =>
                                                                      await CallGetVersionServiceCore(js, jc, Credentials));
                    Assert.AreEqual("Server doesn't support SRP authentication protocol", ex.Message);
                }
        }
예제 #16
0
        public async Task CallServiceBeforeConnectingShouldFail()
        {
            // fake transport and serializer
            var server     = new StubServer();
            var client     = new StubClient(server);
            var serializer = new Serializer();
            var executor   = new StubExecutor();
            var provider   = new StubMessageTypeProvider();

            var js = new JsonServer(server, provider, serializer, executor);
            var jc = new JsonClient(client, provider, serializer);

            js.Start();

            Assert.ThrowsAsync <AuthRequiredException>(async() =>
                                                       await Assert_NotTimedOut(jc.Call(new GetVersion()), "jc.Call(GetVersion) before Connect"));

            await Assert_NotTimedOut(jc.ConnectAsync(), "jc.ConnectAsync()");
            await Assert_NotTimedOut(jc.Call(new GetVersion()), "jc.Call(GetVersion) after connect");
        }
예제 #17
0
        static void Main()
        {
            HostFactory.Run(config =>
            {
                config.SetDescription("JsonServices Sample Server");
                config.SetServiceName(ServiceName);
                config.Service <JsonServer>(sc =>
                {
                    var logger = HostLogger.Get <Program>();
                    sc.ConstructUsing(() =>
                    {
                        // websocket transport
                        var server     = new FleckServer(Url);
                        var serializer = new Serializer();
                        var executor   = new StubExecutor();
                        var provider   = new StubMessageTypeProvider();
                        var jsonServer = new JsonServer(server, provider, serializer, executor);

                        // optional: set product name and version information
                        jsonServer.ProductName    = ServiceName;
                        jsonServer.ProductVersion = "0.0.1-beta";
                        return(jsonServer);
                    });

                    sc.WhenStarted(js =>
                    {
                        logger.Info($"{js.ProductName} starts listening: {Url}");
                        js.Start();
                    });

                    sc.WhenStopped(js =>
                    {
                        logger.Info($"{js.ProductName} is stopping...");
                        js.Dispose();
                    });
                });
            });
        }
예제 #18
0
        public async Task JsonClientSupportsSubscriptionsAndUnsubscriptions()
        {
            // fake transport and serializer
            var server           = new StubServer();
            var serverSerializer = new Serializer();
            var serverProvider   = new StubMessageTypeProvider();
            var executor         = new StubExecutor();

            var client           = new StubClient(server, "jc");
            var clientProvider   = new StubMessageTypeProvider();
            var clientSerializer = new Serializer();

            // json server and client
            var js = new JsonServer(server, serverProvider, serverSerializer, executor);
            var jc = new JsonClient(client, clientProvider, clientSerializer);

            // second client
            var secondClientProvider   = new StubMessageTypeProvider();
            var secondClientSerializer = new Serializer();
            var sc = new JsonClient(new StubClient(server, "sc"), secondClientProvider, secondClientSerializer);

            // test core
            await TestSubscriptionsAndUnsubscriptionsCore(js, jc, sc);
        }
        public async Task AuthenticationProviderIsCalledOnConnectAsync()
        {
            // fake transport and serializer
            var server           = new StubServer();
            var serverSerializer = new Serializer();
            var serverProvider   = new StubMessageTypeProvider();
            var executor         = new StubExecutor();
            var authProvider     = new StubAuthProvider("root", "s3cr3t");

            var client           = new StubClient(server, "jc");
            var clientProvider   = new StubMessageTypeProvider();
            var clientSerializer = new Serializer();

            // json server and client
            var js = new JsonServer(server, serverProvider, serverSerializer, executor, authProvider).Start();
            var jc = new JsonClient(client, clientProvider, clientSerializer);

            Assert.IsFalse(authProvider.IsCalled);

            // connect
            await jc.ConnectAsync(new CredentialsBase("root", "s3cr3t"));

            Assert.IsTrue(authProvider.IsCalled);
        }