public async Task Can_resume_state()
        {
            ////Arrange
            int counter = 0;
            var builder = new WebHostBuilder()
                          .ConfigureTestServices(x => x.AddSingleton <ICitylineProducer, PingProducer>())
                          .UseStartup <Startup>();

            using (var _server = new TestServer(builder))
                using (var client = new CitylineClient(new Uri("/cityline", UriKind.Relative), () => _server.CreateClient()))
                {
                    client.Subscribe("ping", frame =>
                    {
                        counter = frame.As <PingResponse>().CallCount;
                    });

                    ////Act
                    // we will force client to break connection but then resume where it left.
                    // With no state whis will run forever
                    while (counter <= 8)
                    {
                        await client.StartListening(new CancellationTokenSource(200).Token);
                    }

                    ////Assert
                    Assert.IsTrue(counter >= 8); // we expect counter to reach at least 8 in 1 second
                }
        }
        public async Task Can_pass_header_to_producer()
        {
            ////Arrange
            var    sampleHeaderValue = Guid.NewGuid().ToString();
            string actualHeaderValue = null;
            var    builder           = new WebHostBuilder()
                                       .ConfigureTestServices(x => x.AddSingleton <ICitylineProducer, PingProducer>())
                                       .UseStartup <Startup>();

            using (CancellationTokenSource source = new CancellationTokenSource(2000)) // max run time
                using (var _server = new TestServer(builder))
                    using (var client = new CitylineClient(new Uri("/cityline", UriKind.Relative), () => _server.CreateClient(), msg => msg.Headers.Add("sample", sampleHeaderValue)))
                    {
                        client.Subscribe("ping", frame =>
                        {
                            actualHeaderValue = frame.As <PingResponse>().SampleHeader;
                            source.Cancel(); // we are done, cancel
                        });

                        ////Act
                        await client.StartListening(source.Token);

                        ////Assert
                        Assert.AreEqual(sampleHeaderValue, actualHeaderValue);
                    }
        }
        public async Task Can_get_ping()
        {
            ////Arrange
            var pingFlag = false;
            var builder  = new WebHostBuilder()
                           .ConfigureTestServices(x => x.AddSingleton <ICitylineProducer, PingProducer>())
                           .UseStartup <Startup>();

            using (CancellationTokenSource source = new CancellationTokenSource(2000)) // max run time
                using (var _server = new TestServer(builder))
                    using (var client = new CitylineClient(new Uri("/cityline", UriKind.Relative), () => _server.CreateClient()))
                    {
                        client.Subscribe("ping", frame =>
                        {
                            pingFlag = true;
                            source.Cancel(); // we are done, cancel
                        });

                        ////Act
                        await client.StartListening(source.Token);

                        ////Assert
                        Assert.IsTrue(pingFlag);
                    }
        }
Beispiel #4
0
        public async Task Can_subscribe()
        {
            // ignore ssl errors
            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

            var client = new CitylineClient(new Uri("https://localhost:5001/api/cityline"));

            client.Subscribe("user-account", frame => HandleUserAccount(frame));
            client.Subscribe("sentences", frame => HandleChat(frame));
            client.Subscribe("channels", frame => HandleChannel(frame));

            await client.StartListening();

            await Task.Delay(30000);
        }
        public async Task Will_retry_on_error()
        {
            ////Arrange
            bool wasCalled = false;
            var  builder   = new WebHostBuilder()
                             .ConfigureTestServices(x => x.AddSingleton <ICitylineProducer, PingProducer>())
                             .UseStartup <Startup>();

            using (var _server = new TestServer(builder))
                using (CancellationTokenSource source = new CancellationTokenSource()) // max run time
                    using (var client = new CitylineClient(new Uri("/cityline-500", UriKind.Relative), () => _server.CreateClient()))
                    {
                        client.RetryOnErrorDelay = TimeSpan.FromSeconds(1);
                        client.Subscribe("ping", frame =>
                        {
                            wasCalled = true;
                            source.Cancel();
                        });


                        await(_server as  Microsoft.AspNetCore.Hosting.Server.IServer).StopAsync(default(CancellationToken));

                        var _ = Task.Run(async() => {
                            await Task.Delay(TimeSpan.FromSeconds(1));
                            client._serverUrl = new Uri("/cityline", UriKind.Relative);
                        });

                        ////Act
                        // we will force client to break connection but then resume where it left.
                        // With no state whis will run forever
                        await client.StartListening(source.Token);

                        ////Assert
                        Assert.IsTrue(wasCalled); // we expect counter to reach at least 8 in 1 second
                    }
        }