Beispiel #1
0
 private async Task StartTestTransportAsync(
     TestTransport transport,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     _ = transport.StartAsync(cancellationToken);
     await transport.WaitForRunningAsync();
 }
Beispiel #2
0
        public async Task DoNotBroadcastToSourcePeer()
        {
            TestTransport transportA = CreateTestTransport(new PrivateKey());
            TestTransport transportB = CreateTestTransport(new PrivateKey());
            TestTransport transportC = CreateTestTransport(new PrivateKey());

            await StartTestTransportAsync(transportA);
            await StartTestTransportAsync(transportB);
            await StartTestTransportAsync(transportC);

            try
            {
                await transportA.AddPeersAsync(new[] { transportB.AsPeer }, null);

                await transportB.AddPeersAsync(new[] { transportC.AsPeer }, null);

                transportA.BroadcastTestMessage(null, "foo");
                await transportC.WaitForTestMessageWithData("foo");

                await Task.Delay(100);

                Assert.True(transportC.ReceivedTestMessageOfData("foo"));
                Assert.False(transportA.ReceivedTestMessageOfData("foo"));
            }
            finally
            {
                transportA.Dispose();
                transportB.Dispose();
                transportC.Dispose();
            }
        }
Beispiel #3
0
        public async Task RefreshTable()
        {
            const int peersCount  = 10;
            var       privateKey  = new PrivateKey();
            var       privateKeys = Enumerable.Range(0, peersCount).Select(
                i => GeneratePrivateKeyOfBucketIndex(privateKey.ToAddress(), i / 2));
            TestTransport transport = CreateTestTransport(privateKey);

            TestTransport[] transports =
                privateKeys.Select(key => CreateTestTransport(key)).ToArray();

            await StartTestTransportAsync(transport);

            foreach (var t in transports)
            {
                await StartTestTransportAsync(t);
            }

            try
            {
                foreach (var t in transports)
                {
                    transport.Table.AddPeer(
                        (BoundPeer)t.AsPeer,
                        DateTimeOffset.UtcNow - TimeSpan.FromMinutes(2));
                }

                IReadOnlyList <BoundPeer> refreshCandidates =
                    transport.Table.PeersToRefresh(TimeSpan.FromMinutes(1));
                Assert.Equal(peersCount, transport.Peers.Count());
                Assert.Equal(peersCount / 2, refreshCandidates.Count);
                Assert.Equal(peersCount / 2, transport.Table.NonEmptyBuckets.Count());

                await transport.Protocol.RefreshTableAsync(TimeSpan.FromMinutes(1), default);

                Assert.NotEqual(
                    refreshCandidates.ToHashSet(),
                    transport.Table.PeersToRefresh(TimeSpan.FromMinutes(1)).ToHashSet());
                Assert.Equal(
                    peersCount / 2,
                    transport.Table.PeersToRefresh(TimeSpan.FromMinutes(1)).Count());
                Assert.Equal(peersCount / 2, transport.Table.NonEmptyBuckets.Count());

                await transport.Protocol.RefreshTableAsync(TimeSpan.FromMinutes(1), default);

                Assert.Empty(transport.Table.PeersToRefresh(TimeSpan.FromMinutes(1)));
            }
            finally
            {
                transport.Dispose();
                foreach (var t in transports)
                {
                    t.Dispose();
                }
            }
        }
Beispiel #4
0
        public async Task BroadcastMessage(int count)
        {
            var seed = CreateTestTransport();

            await StartTestTransportAsync(seed);

            var transports = new TestTransport[count];

            for (var i = 0; i < count; i++)
            {
                transports[i] = CreateTestTransport();
                await StartTestTransportAsync(transports[i]);
            }

            try
            {
                foreach (var transport in transports)
                {
                    await transport.BootstrapAsync(new[] { seed.AsPeer });
                }

                Log.Debug("Bootstrap completed.");

                var tasks =
                    transports.Select(transport => transport.WaitForTestMessageWithData("foo"));

                seed.BroadcastTestMessage(null, "foo");
                Log.Debug("Broadcast completed.");

                await Task.WhenAll(tasks);
            }
            finally
            {
                seed.Dispose();
                foreach (var transport in transports)
                {
                    Assert.True(transport.ReceivedTestMessageOfData("foo"));
                    transport.Dispose();
                }
            }
        }