Exemplo n.º 1
0
    public async Task AutoRecomputeTest()
    {
        var stateFactory = Services.StateFactory();
        var time         = Services.GetRequiredService <ITimeService>();
        var c            = await Computed.Capture(
            _ => time.GetTimeWithOffset(TimeSpan.FromSeconds(1)));

        var count = 0L;

        using var state = stateFactory.NewComputed <DateTime>(
                  UpdateDelayer.ZeroDelay,
                  async(_, ct) => await c.Use(ct));
        state.Updated += (s, _)
                         => Log.LogInformation($"{++count} -> {s.Value:hh:mm:ss:fff}");

        await TestExt.WhenMet(
            () => count.Should().BeGreaterThan(2),
            TimeSpan.FromSeconds(5));

        var lastCount = count;

        state.Dispose();

        await Task.Delay(1000);

        count.Should().Be(lastCount);
    }
Exemplo n.º 2
0
    public async Task TimerTest()
    {
        await using var serving = await WebHost.Serve();

        var publisher  = WebServices.GetRequiredService <IPublisher>();
        var replicator = ClientServices.GetRequiredService <IReplicator>();
        var tp         = WebServices.GetRequiredService <ITimeService>();

        var pub = await publisher.Publish(_ => tp.GetTime());

        var rep = replicator.GetOrAdd <DateTime>(pub.Ref);

        var count = 0;

        using var state = Services.StateFactory().NewComputed <DateTime>(
                  UpdateDelayer.ZeroDelay,
                  async(_, ct) => await rep.Computed.Use(ct));
        state.Updated += (s, _) => {
            Out.WriteLine($"{s.Value}");
            count++;
        };

        await TestExt.WhenMet(
            () => count.Should().BeGreaterThan(2),
            TimeSpan.FromSeconds(5));
    }
Exemplo n.º 3
0
    public async Task BasicTest()
    {
        await using var _ = await WebHost.Serve();

        var kv = WebServices.GetRequiredService <IKeyValueService <string> >();

        (await kv.TryGet("")).Should().Be(Option.None <string>());
        (await kv.Get("")).Should().BeNull();
        await kv.Set("", "1");

        (await kv.TryGet("")).Should().Be(Option.Some("1"));
        (await kv.Get("")).Should().Be("1");

        using var kvm = ClientServices.GetRequiredService <IComputedState <KeyValueModel <string> > >();
        var kvc = ClientServices.GetRequiredService <IKeyValueServiceClient <string> >();

        // First read
        var c = kvm.Computed;

        c.IsConsistent().Should().BeFalse();
        c.Value.Should().Be(null);

        await TestExt.WhenMet(() => {
            var snapshot = kvm.Snapshot;
            snapshot.Computed.HasValue.Should().BeTrue();
            var c = snapshot.Computed;
            c.IsConsistent().Should().BeTrue();
            c.Value.Key.Should().Be("");
            c.Value.Value.Should().Be("1");
            c.Value.UpdateCount.Should().Be(1);
        }, TimeSpan.FromSeconds(1));

        // Update
        await kvc.Set(kvm.Computed.Value.Key, "2");

        await Task.Delay(300);

        c = kvm.Computed;
        c.IsConsistent().Should().BeFalse();
        c.Value.Value.Should().Be("1");
        c.Value.UpdateCount.Should().Be(1);

        await Task.Delay(1000);

        c = kvm.Computed;
        c.IsConsistent().Should().BeTrue();
        c.Value.Value.Should().Be("2");
        c.Value.UpdateCount.Should().Be(2);
    }
Exemplo n.º 4
0
    public async Task BasicTest()
    {
        if (OSInfo.IsAnyUnix)
        {
            // Screenshots don't work on Unix
            return;
        }

        var c = await GetScreenshotComputed();

        for (var i = 0; i < 10; i++)
        {
            c.Value.Image.Data.Length.Should().BeGreaterThan(0);
            await TestExt.WhenMet(
                () => c.IsConsistent().Should().BeFalse(),
                TimeSpan.FromSeconds(0.5));

            c = await GetScreenshotComputed();
        }
    }
Exemplo n.º 5
0
    public async Task DropReconnectTest()
    {
        if (TestRunnerInfo.IsBuildAgent())
        {
            // TODO: Fix intermittent failures on GitHub
            return;
        }

        var serving = await WebHost.Serve(false);

        var replicator = ClientServices.GetRequiredService <IReplicator>();
        var kvsClient  = ClientServices.GetRequiredService <IKeyValueServiceClient <string> >();

        Debug.WriteLine("0");
        var kvs = WebServices.GetRequiredService <IKeyValueService <string> >();
        await kvs.Set("a", "b");

        var c = (ReplicaMethodComputed <string>)
                await Computed.Capture(_ => kvsClient.Get("a"));

        c.Value.Should().Be("b");
        c.IsConsistent().Should().BeTrue();

        Debug.WriteLine("1");
        await c.Replica !.RequestUpdate().AsAsyncFunc()
        .Should().CompleteWithinAsync(TimeSpan.FromSeconds(5));

        c.IsConsistent().Should().BeTrue();

        Debug.WriteLine("2");
        var cs = replicator.GetPublisherConnectionState(c.Replica.PublicationRef.PublisherId);

        cs.Value.Should().BeTrue();
        cs.Computed.IsConsistent().Should().BeTrue();
        await cs.Recompute();

        Debug.WriteLine("3");
        cs.Value.Should().BeTrue();
        cs.Computed.IsConsistent().Should().BeTrue();
        var cs1 = replicator.GetPublisherConnectionState(c.Replica.PublicationRef.PublisherId);

        cs1.Should().BeSameAs(cs);

        Debug.WriteLine("WebServer: stopping.");
        await serving.DisposeAsync();

        Debug.WriteLine("WebServer: stopped.");

        // First try -- should fail w/ WebSocketException or ChannelClosedException
        c.IsConsistent().Should().BeTrue();
        c.Value.Should().Be("b");
        Debug.WriteLine("4");

        await cs.Update();

        cs.Error.Should().BeAssignableTo <Exception>();
        cs.Computed.IsConsistent().Should().BeTrue();
        var updateTask = c.Replica.RequestUpdate();

        updateTask.IsCompleted.Should().BeFalse();
        Debug.WriteLine("5");

        await kvs.Set("a", "c");

        await Delay(0.1);

        c.IsConsistent().Should().BeTrue();
        c.Value.Should().Be("b");
        Debug.WriteLine("6");

        Debug.WriteLine("WebServer: starting.");
        serving = await WebHost.Serve();
        await Delay(1);

        Debug.WriteLine("WebServer: started.");

        await TestExt.WhenMet(
            () => cs.Error.Should().BeNull(),
            TimeSpan.FromSeconds(30));

        Debug.WriteLine("7");

        await Delay(1);

        updateTask.IsCompleted.Should().BeTrue();
        c = (ReplicaMethodComputed <string>) await c.Update();

        c.IsConsistent().Should().BeTrue();
        c.Value.Should().Be("c");

        await serving.DisposeAsync();
    }