Beispiel #1
0
        public async Task Should_stream_checkpoints_over_websocket()
        {
            SystemClock.UseRealClock();
            var tagListHandler =
                WithCheckpointStorageService(storageService => new SimulatorBuilder(storageService).Build());

            using var svc = CreateCheckpointService();
            tagListHandler.ReturnOnce(new Tag {
                TagId = "1"
            });
            tagListHandler.ReturnOnce(new Tag {
                TagId = "2"
            });
            var checkpoints = new List <Checkpoint>();
            var wsConnected = false;

            var client = new CheckpointServiceClient(svc.ListenUri);

            using var sub = client.CreateSubscription(DateTime.UtcNow.AddHours(-1));
            sub.Checkpoints.Subscribe(cp => checkpoints.Add(cp));
            sub.WebSocketConnected.Subscribe(s => wsConnected = s.IsConnected);
            sub.Start();
            await new Timing().ExpectAsync(() => wsConnected);
            tagListHandler.ReturnOnce(new Tag {
                TagId = "3"
            });
            tagListHandler.ReturnOnce(new Tag {
                TagId = "4"
            });
            await new Timing()
            .Logger(Logger)
            .FailureDetails(() => $"checkpoints.Count = {checkpoints.Count}")
            .ExpectAsync(() => checkpoints.Count >= 4);
        }
Beispiel #2
0
        public async Task Should_append_manual_checkpoint()
        {
            SystemClock.UseRealClock();
            var tagListHandler =
                WithCheckpointStorageService(storageService => new SimulatorBuilder(storageService).Build());

            using var svc = CreateCheckpointService();

            var checkpoints = new List <Checkpoint>();
            var wsConnected = false;
            var client      = new CheckpointServiceClient(svc.ListenUri);

            using var sub = client.CreateSubscription(DateTime.UtcNow.AddHours(-1));
            sub.Checkpoints.Subscribe(cp => checkpoints.Add(cp));
            sub.WebSocketConnected.Subscribe(s => wsConnected = s.IsConnected);
            sub.Start();
            await new Timing().ExpectAsync(() => wsConnected);
            await client.AppendCheckpoint("555");

            await new Timing()
            .Logger(Logger)
            .FailureDetails(() => $"checkpoints.Count = {checkpoints.Count}")
            .ExpectAsync(() => checkpoints.Count >= 1);
            checkpoints.Should().Contain(x => x.RiderId == "555");
        }
Beispiel #3
0
        public async Task Should_remove_checkpoints()
        {
            var now      = DateTime.UtcNow;
            var original = new[]
            {
                new Checkpoint {
                    RiderId = "111", Timestamp = now
                },
                new Checkpoint {
                    RiderId = "222", Timestamp = now.AddMinutes(1)
                },
                new Checkpoint {
                    RiderId = "333", Timestamp = now.AddMinutes(2)
                },
                new Checkpoint {
                    RiderId = "444", Timestamp = now.AddMinutes(3)
                },
                new Checkpoint {
                    RiderId = "555", Timestamp = now.AddMinutes(4)
                }
            };

            var tagListHandler = WithCheckpointStorageService(storageService =>
            {
                foreach (var cp in original)
                {
                    storageService.AppendCheckpoint(cp);
                }
                return(new SimulatorBuilder(storageService).Build());
            });

            using var svc = CreateCheckpointService();
            var client = new CheckpointServiceClient(svc.ListenUri);

            (await client.DeleteCheckpoint(original[0].Id)).Should().Be(1);
            var cps = await client.GetCheckpoints();

            cps.Count.Should().Be(4);
            cps.Should().NotContain(x => x.Id == original[0].Id);

            (await client.DeleteCheckpoints(now.AddMinutes(1.5), now.AddMinutes(3.5))).Should().Be(2);
            cps = await client.GetCheckpoints();

            cps.Count.Should().Be(2);
            cps.Should().NotContain(x => x.Id == original[2].Id || x.Id == original[3].Id);

            (await client.DeleteCheckpoints()).Should().Be(2);
            cps = await client.GetCheckpoints();

            cps.Count.Should().Be(0);
        }
Beispiel #4
0
        public async Task HttpClient_should_wait_for_webhost_to_start()
        {
            // Make service slow on startup by putting 5000ms sleep
            var sw = Stopwatch.StartNew();

            using var svc = CreateCheckpointService(5000);
            var client = new CheckpointServiceClient(svc.ListenUri);
            // Get data from service should succeed, but take 5000+ ms
            var response = await client.GetCheckpoints();

            response.Should().BeEmpty();
            sw.Stop();
            sw.ElapsedMilliseconds.Should().BeGreaterThan(5000);
        }
Beispiel #5
0
        public async Task Subscription_reconnects()
        {
            SystemClock.UseRealClock();
            var tagListHandler =
                WithCheckpointStorageService(storageService => new SimulatorBuilder(storageService).Build());

            var port               = GetAvailablePort();
            var address            = $"http://127.0.0.1:{port}";
            var client             = new CheckpointServiceClient(address);
            var checkpoints        = new List <Checkpoint>();
            var wsConnectionStatus = new List <WsConnectionStatus>();

            using var sub =
                      (CheckpointSubscription)client.CreateSubscription(DateTime.UtcNow.AddHours(-1),
                                                                        TimeSpan.FromMilliseconds(500));
            sub.Checkpoints.Subscribe(cp => checkpoints.Add(cp));
            sub.WebSocketConnected.Subscribe(s => wsConnectionStatus.Add(s));
            sub.Start();

            // Assert we could not connect, but were trying
            await new Timing().ExpectAsync(() => wsConnectionStatus.Count > 2);
            wsConnectionStatus.Should().NotContain(x => x.IsConnected);

            using (CreateCheckpointService(port: port))
            {
                // Now we connect
                await new Timing().ExpectAsync(() => wsConnectionStatus.LastOrDefault()?.IsConnected == true);
                await client.AppendCheckpoint("123");

                await new Timing().ExpectAsync(() => checkpoints.Any(cp => cp.RiderId == "123"));
            }

            // Disconnect again
            await new Timing().ExpectAsync(() => wsConnectionStatus.LastOrDefault()?.IsConnected == false);

            using (var svc = CreateCheckpointService(port: port))
            {
                // Connect again
                await new Timing().ExpectAsync(() => wsConnectionStatus.LastOrDefault()?.IsConnected == true);
                await client.AppendCheckpoint("567");

                await new Timing().ExpectAsync(() => checkpoints.Any(cp => cp.RiderId == "567"));
            }
        }
Beispiel #6
0
        public async Task Should_return_stored_checkpoints()
        {
            var ts = DateTime.UtcNow;

            WithCheckpointStorageService(storageService =>
            {
                storageService.AppendCheckpoint(new Checkpoint("stored1", ts));
                storageService.AppendCheckpoint(new Checkpoint("stored2", ts.AddSeconds(100)));
            });

            using var svc = CreateCheckpointService();
            var client      = new CheckpointServiceClient(svc.ListenUri);
            var checkpoints = await client.GetCheckpoints();

            checkpoints.Should().NotBeNull();
            checkpoints.Count.Should().Be(2);
            checkpoints.Should().Contain(x => x.RiderId == "stored1");
            checkpoints.Should().Contain(x => x.RiderId == "stored2");
        }
Beispiel #7
0
        public async Task Should_return_rfid_options()
        {
            SystemClock.UseRealClock();
            WithCheckpointStorageService(storageService =>
                                         storageService.UpdateRfidOptions(opts =>
            {
                opts.Enabled          = true;
                opts.ConnectionString = "some";
                opts.RpsThreshold     = 123;
                opts.CheckpointAggregationWindowMs = 234;
            }));
            using var svc = CreateCheckpointService();
            var client = new CheckpointServiceClient(svc.ListenUri);
            var opts   = await client.GetRfidOptions();

            opts.Enabled.Should().Be(true);
            opts.ConnectionString.Should().Be("some");
            opts.RpsThreshold.Should().Be(123);
            opts.CheckpointAggregationWindowMs.Should().Be(234);
        }
Beispiel #8
0
        public async Task Should_set_rfid_options()
        {
            var opts = new RfidOptions
            {
                Enabled          = true,
                ConnectionString = "bbb",
                RpsThreshold     = 666,
                CheckpointAggregationWindowMs = 777
            };

            using var svc = CreateCheckpointService();
            var client = new CheckpointServiceClient(svc.ListenUri);
            await client.SetRfidOptions(opts);

            var opts2 = await client.GetRfidOptions();

            opts2.Enabled.Should().Be(true);
            opts2.ConnectionString.Should().Be("bbb");
            opts2.RpsThreshold.Should().Be(666);
            opts2.CheckpointAggregationWindowMs.Should().Be(777);
        }
Beispiel #9
0
        public async Task Should_ignore_empty_manual_checkpoint()
        {
            SystemClock.UseRealClock();
            var tagListHandler =
                WithCheckpointStorageService(storageService => new SimulatorBuilder(storageService).Build());

            using var svc = CreateCheckpointService();
            var checkpoints = new List <Checkpoint>();
            var wsConnected = false;
            var client      = new CheckpointServiceClient(svc.ListenUri);

            using var sub = client.CreateSubscription(DateTime.UtcNow.AddHours(-1));
            sub.Checkpoints.Subscribe(cp => checkpoints.Add(cp));
            sub.WebSocketConnected.Subscribe(s => wsConnected = s.IsConnected);
            sub.Start();
            await new Timing().ExpectAsync(() => wsConnected);
            await client.AppendCheckpoint("");

            (await new Timing()
             .Timeout(5000)
             .Logger(Logger)
             .WaitAsync(() => checkpoints.Count > 0)).Should().BeFalse();
        }
Beispiel #10
0
        public async Task Should_return_individual_option_property_values()
        {
            SystemClock.UseRealClock();
            WithCheckpointStorageService(storageService =>
                                         storageService.UpdateRfidOptions(opts =>
            {
                opts.Enabled          = true;
                opts.ConnectionString = "some";
                opts.RpsThreshold     = 123;
                opts.CheckpointAggregationWindowMs = 234;
            }));
            using var svc = CreateCheckpointService();
            var client = new CheckpointServiceClient(svc.ListenUri);

            (await client.GetRfidOptionsValue <bool>(nameof(RfidOptions.Enabled)))
            .Should().Be(true);
            (await client.GetRfidOptionsValue <string>(nameof(RfidOptions.ConnectionString)))
            .Should().Be("some");
            (await client.GetRfidOptionsValue <int>(nameof(RfidOptions.RpsThreshold)))
            .Should().Be(123);
            (await client.GetRfidOptionsValue <int>(nameof(RfidOptions.CheckpointAggregationWindowMs)))
            .Should().Be(234);
        }
Beispiel #11
0
        public async Task Should_set_individual_option_property_values()
        {
            WithCheckpointStorageService(storageService =>
                                         storageService.UpdateRfidOptions(opts =>
            {
                opts.Enabled          = false;
                opts.ConnectionString = "some";
                opts.RpsThreshold     = 111;
                opts.CheckpointAggregationWindowMs = 222;
            }));
            using var svc = CreateCheckpointService();
            var client = new CheckpointServiceClient(svc.ListenUri);
            var opts   = await client.GetRfidOptions();

            opts.Enabled.Should().BeFalse();

            await client.SetRfidOptionsValue(nameof(RfidOptions.RpsThreshold), 555);

            (await client.GetRfidOptionsValue <int>(nameof(RfidOptions.RpsThreshold)))
            .Should().Be(555);

            await client.SetRfidOptionsValue(nameof(RfidOptions.Enabled), true);

            (await client.GetRfidOptionsValue <bool>(nameof(RfidOptions.Enabled)))
            .Should().Be(true);

            await client.SetRfidOptionsValue(nameof(RfidOptions.ConnectionString), "true");

            (await client.GetRfidOptionsValue <string>(nameof(RfidOptions.ConnectionString)))
            .Should().Be("true");

            (await client.GetRfidStatus()).Should().BeTrue();
            await client.SetRfidStatus(false);

            (await client.GetRfidStatus()).Should().BeFalse();
        }