public async Task PayloadSender_WhenLengthSet_Sends()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var header = new Header()
            {
                Type          = PayloadTypes.Stream,
                Id            = Guid.NewGuid(),
                PayloadLength = 55,
                End           = false,
            };

            var stream = new MemoryStream(new byte[100]);
            TaskCompletionSource <string> done = new TaskCompletionSource <string>();

            sender.SendPayload(header, stream, true, (Header sentHeader) =>
            {
                Assert.AreEqual(55, sentHeader.PayloadLength);
                Assert.IsFalse(sentHeader.End);
                done.SetResult("done");
                return(Task.CompletedTask);
            });

            await done.Task;

            Assert.AreEqual(2, transport.Buffers.Count);
            Assert.AreEqual(55, stream.Position);
        }
        public async Task SendRequestAsync_WaitsTillAllDataSent()
        {
            var payLoadSender = new PayloadSender();
            var tcs           = new TaskCompletionSource <bool>();
            DisconnectedEventHandler eventHandler = (sender, args) =>
            {
                tcs.TrySetException(new Exception(args.Reason));
            };

            payLoadSender.Disconnected += eventHandler;
            payLoadSender.Connect(GetMockedTransportSender(tcs, TransportConstants.MaxPayloadLength * 4));
            var sendOperations = new SendOperations(payLoadSender);

            try
            {
                using (var stream = GetMockedStream(TransportConstants.MaxPayloadLength * 4))
                {
                    var request = new StreamingRequest();
                    request.AddStream(new StreamContent(stream));
                    await sendOperations.SendRequestAsync(Guid.NewGuid(), request);
                }

                await tcs.Task;
            }
            finally
            {
                payLoadSender.Disconnected -= eventHandler;
            }
        }
        public async Task PayloadSender_WhenLengthNotSet_AndNoData_SendsZeroLengthEnd()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var header = new Header()
            {
                Type          = PayloadTypes.Stream,
                Id            = Guid.NewGuid(),
                PayloadLength = 555,
                End           = false,
            };

            var stream = new MemoryStream(new byte[100]);

            stream.Position = 100;
            var done = new TaskCompletionSource <string>();

            sender.SendPayload(header, stream, false, (Header sentHeader) =>
            {
                Assert.Equal(0, sentHeader.PayloadLength);
                Assert.True(sentHeader.End);
                done.SetResult("done");
                return(Task.CompletedTask);
            });

            await done.Task;

            Assert.Single(transport.Buffers);
        }
Example #4
0
        /// <inheritdoc />
        public async Task Start()
        {
            ProjectVersionStage.AssertAlpha();
            //TODO: We need this? Can we add support to GladNet3 to queue up unconnected messages?
            //await Task.Delay(1500);

            //TODO: We're sending with Bearer but there is nothing validating both sides expect that.
            await PayloadSender.SendMessage(new ClientSessionClaimRequestPayload(AuthTokenRepo.RetrieveWithType(), CharacterRepository.CharacterId));
        }
        public void PayloadSender_Connect_ShouldFail()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            Assert.Throws <InvalidOperationException>(() => sender.Connect(transport));
        }
        public async Task RequestDisassembler_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var disassembler = new RequestDisassembler(sender, Guid.NewGuid(), StreamingRequest.CreateGet("/a/b/c"));

            await disassembler.DisassembleAsync();

            Assert.Equal(2, transport.Buffers.Count);
        }
        public async Task ResponseDisassembler_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var disassembler = new ResponseDisassembler(sender, Guid.NewGuid(), StreamingResponse.OK());

            await disassembler.DisassembleAsync();

            Assert.AreEqual(2, transport.Buffers.Count);
        }
        public async Task SendResponseAsync()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);
            var ops = new SendOperations(sender);

            var content  = new StringContent("/a/b", Encoding.ASCII);
            var response = StreamingResponse.CreateResponse(HttpStatusCode.OK, content);

            await ops.SendResponseAsync(Guid.NewGuid(), response);

            Assert.Equal(4, transport.Buffers.Count);
        }
        public async Task RequestDisassembler_WithJsonStream_Sends()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);
            var ops = new SendOperations(sender);

            var request = StreamingRequest.CreatePost("/a/b");

            request.AddStream(new StringContent("abc", Encoding.ASCII));

            await ops.SendRequestAsync(Guid.NewGuid(), request);

            Assert.AreEqual(4, transport.Buffers.Count);
        }
 public UdpDispatcherImpl(Identity identity, UdpClient udpClient, DuplicateFilter duplicateFilter, PayloadSender payloadSender, AcknowledgementCoordinator acknowledgementCoordinator, RoutingTable routingTable, PeerTable peerTable, InboundMessageDispatcher inboundMessageDispatcher, MultiPartPacketReassembler multiPartPacketReassembler, IUdpUnicasterFactory udpUnicasterFactory, IAuditCounter announcementsReceivedCounter, IAuditCounter tossedCounter, IAuditCounter duplicateReceivesCounter, IAuditAggregator<int> multiPartChunksBytesReceivedAggregator) {
    this.identity = identity;
    this.udpClient = udpClient;
    this.duplicateFilter = duplicateFilter;
    this.payloadSender = payloadSender;
    this.acknowledgementCoordinator = acknowledgementCoordinator;
    this.routingTable = routingTable;
    this.peerTable = peerTable;
    this.inboundMessageDispatcher = inboundMessageDispatcher;
    this.multiPartPacketReassembler = multiPartPacketReassembler;
    this.udpUnicasterFactory = udpUnicasterFactory;
    this.announcementsReceivedCounter = announcementsReceivedCounter;
    this.tossedCounter = tossedCounter;
    this.duplicateReceivesCounter = duplicateReceivesCounter;
    this.multiPartChunksBytesReceivedAggregator = multiPartChunksBytesReceivedAggregator;
 }
        public async Task ResponseDisassembler_With_HttpContent_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var content = new StringContent("{'a': 55}", Encoding.UTF8, "application/json");

            var response = StreamingResponse.CreateResponse(System.Net.HttpStatusCode.OK, content);

            var disassembler = new ResponseDisassembler(sender, Guid.NewGuid(), response);

            await disassembler.DisassembleAsync();

            Assert.Equal(2, transport.Buffers.Count);
        }
        public async Task RequestDisassembler_WithVariableStream_Sends()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);
            var ops = new SendOperations(sender);

            var request = StreamingRequest.CreatePost("/a/b");
            var stream  = new PayloadStream(new PayloadStreamAssembler(null, Guid.NewGuid(), "blah", 100));

            stream.Write(new byte[100], 0, 100);
            request.AddStream(new StreamContent(stream));

            await ops.SendRequestAsync(Guid.NewGuid(), request);

            Assert.AreEqual(5, transport.Buffers.Count);
        }
        public async Task HttpContentStreamDisassembler_ObjectContent_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var content = new ResponseMessageStream(Guid.NewGuid())
            {
                Content = new StringContent("{'a': 55}", Encoding.UTF8, "application/json"),
            };

            var disassembler = new ResponseMessageStreamDisassembler(sender, content);

            await disassembler.DisassembleAsync();

            Assert.AreEqual(2, transport.Buffers.Count);
        }
        public void PayloadSender_Dispose()
        {
            var sender = new PayloadSender();

            var header = new Header()
            {
                Type          = PayloadTypes.Stream,
                Id            = Guid.NewGuid(),
                PayloadLength = 55,
                End           = false,
            };

            var stream = new MemoryStream(new byte[100]);

            sender.Dispose();

            Assert.Throws <ObjectDisposedException>(() => sender.SendPayload(header, stream, true, (Header sentHeader) => Task.CompletedTask));
        }
        public async Task HttpContentStreamDisassembler_StringContent_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var content = new ResponseMessageStream(Guid.NewGuid())
            {
                Content = new StringContent("blah blah blah", Encoding.ASCII),
            };

            var disassembler = new ResponseMessageStreamDisassembler(sender, content);

            await disassembler.DisassembleAsync();

            Assert.Equal(2, transport.Buffers.Count);
        }
        public async Task HttpContentStreamDisassembler_ObjectContent_SendsAsFixedLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var content = new ResponseMessageStream(Guid.NewGuid())
            {
                Content = new ObjectContent(typeof(string), "{'a': 55}", new JsonMediaTypeFormatter()),
            };

            var disassembler = new ResponseMessageStreamDisassembler(sender, content);

            await disassembler.DisassembleAsync();

            Assert.AreEqual(2, transport.Buffers.Count);
        }
      public Task<ITransport> CreateAsync(MobOperations mobOperations, Identity identity, RoutingTable routingTable, PeerTable peerTable, InboundMessageDispatcher inboundMessageDispatcher, AuditService auditService) {
         // setup identity
         identity.Properties[UdpConstants.kUnicastPortIdentityPropertyKey] = configuration.UnicastReceiveEndpoint.Port.ToString();

         var duplicateFilter = new DuplicateFilter();
         duplicateFilter.Initialize();

         var inboundBytesAggregator = auditService.GetAggregator<double>(DataSetNames.kInboundBytes);
         var outboundBytesAggregator = auditService.GetAggregator<double>(DataSetNames.kOutboundBytes);
         var inboundReceiveProcessDispatchLatencyAggregator = auditService.GetAggregator<double>(DataSetNames.kInboundProcessDispatchLatency);
         var resendsCounter = auditService.GetCounter(DataSetNames.kTotalResends);
         var resendsAggregator = auditService.GetAggregator<int>(DataSetNames.kMessageResends);
         var tossedCounter = auditService.GetCounter(DataSetNames.kTossed);
         var duplicatesReceivedCounter = auditService.GetCounter(DataSetNames.kDuplicatesReceived);
         var announcementsReceivedCounter = auditService.GetCounter(DataSetNames.kAnnouncementsReceived);
         var multiPartChunksSentCounter = auditService.GetCounter(DataSetNames.kMultiPartChunksSent);
         var multiPartChunksReceivedAggregator = auditService.GetAggregator<int>(DataSetNames.kMultiPartChunksBytesReceived);
         var outboundMessageRateLimitAggregator = auditService.GetAggregator<double>(DataSetNames.kOutboundMessageRateLimit);
         var sendQueueDepthAggregator = auditService.GetAggregator<double>(DataSetNames.kSendQueueDepth);

         mobOperations.RegisterMob(new UdpDebugMob());

         var shutdownCts = new CancellationTokenSource();
         var acknowledgementCoordinator = new AcknowledgementCoordinator(identity);
         var udpUnicastScheduler = SchedulerFactory.CreateWithCustomThreadPool($"Courier.Udp({identity.Id.ToShortString()}).Unicast");
         var sendReceiveBufferPool = ObjectPool.CreateStackBacked(() => new byte[UdpConstants.kMaximumTransportSize]);
         var client = UdpClient.Create(configuration, udpUnicastScheduler, sendReceiveBufferPool, inboundBytesAggregator, outboundBytesAggregator, inboundReceiveProcessDispatchLatencyAggregator);
         var payloadSender = new PayloadSender(client);
         var multiPartPacketReassembler = new MultiPartPacketReassembler();
         var udpUnicasterFactory = new UdpUnicasterFactory(identity, client, acknowledgementCoordinator, sendReceiveBufferPool, resendsCounter, resendsAggregator, outboundMessageRateLimitAggregator, sendQueueDepthAggregator);
         var udpDispatcher = new UdpDispatcherImpl(identity, client, duplicateFilter, payloadSender, acknowledgementCoordinator, routingTable, peerTable, inboundMessageDispatcher, multiPartPacketReassembler, udpUnicasterFactory, announcementsReceivedCounter, tossedCounter, duplicatesReceivedCounter, multiPartChunksReceivedAggregator);
         multiPartPacketReassembler.SetUdpDispatcher(udpDispatcher);
         var announcer = new Announcer(identity, payloadSender, shutdownCts.Token);
         announcer.Initialize();
         var udpFacade = new UdpFacade(client, udpDispatcher, shutdownCts);
         var udpBroadcaster = new UdpBroadcaster(identity, client);
         var transport = new UdpTransport(udpBroadcaster, udpFacade);
         client.StartReceiving(udpDispatcher);

         return Task.FromResult<ITransport>(transport);
      }
        public async Task HttpContentStreamDisassembler_StreamContent_SendsAsVariableLength()
        {
            var sender    = new PayloadSender();
            var transport = new MockTransportSender();

            sender.Connect(transport);

            var stream = new PayloadStream(new PayloadStreamAssembler(null, Guid.NewGuid(), "blah", 100));

            var content = new ResponseMessageStream(Guid.NewGuid())
            {
                Content = new StreamContent(stream),
            };

            stream.Write(new byte[100], 0, 100);

            var disassembler = new ResponseMessageStreamDisassembler(sender, content);

            await disassembler.DisassembleAsync();

            Assert.AreEqual(3, transport.Buffers.Count);
        }
Example #19
0
        public void PayloadSentWithBearerToken()
        {
            AuthenticationHeaderValue authHeader = null;
            var handler = new MockHttpMessageHandler((r, c) =>
            {
                authHeader = r.Headers.Authorization;
                return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
            });

            var secretToken   = "SecretToken";
            var logger        = ConsoleLogger.Instance;
            var payloadSender = new PayloadSender(logger, new TestAgentConfigurationReader(logger, secretToken: secretToken), handler);

            using (var agent = new ApmAgent(new TestAgentComponents(secretToken: secretToken, payloadSender: payloadSender)))
                agent.PayloadSender.QueuePayload(new Payload());

            // ideally, introduce a mechanism to flush payloads
            Thread.Sleep(TimeSpan.FromSeconds(2));

            Assert.NotNull(authHeader);
            Assert.Equal("Bearer", authHeader.Scheme);
            Assert.Equal(secretToken, authHeader.Parameter);
        }
Example #20
0
 public Announcer(Identity identity, PayloadSender payloadSender, CancellationToken shutdownCancellationToken) {
    this.identity = identity;
    this.payloadSender = payloadSender;
    this.shutdownCancellationToken = shutdownCancellationToken;
 }