public void FailureResponseCode429()
        {
            var activity      = CreateActivity("TestActivity");
            var telemetryItem = CreateTelemetryItem(activity);
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();

            telemetryItems.Add(telemetryItem);

            using var testServer   = new LocalEndpoint(testEndpoint);
            testServer.ServerLogic = async(httpContext) =>
            {
                httpContext.Response.StatusCode = 429;
                httpContext.Response.Headers.Add("Retry-After", "6");
                await httpContext.Response.WriteAsync("Too Many Requests");
            };

            // Transmit
            var transmitter = GetTransmitter();

            transmitter.TrackAsync(telemetryItems, false, CancellationToken.None).EnsureCompleted();

            // Wait for maintenance job to run atleast once
            Thread.Sleep(15000);

            //Assert
            Assert.Single(transmitter._storage.GetBlobs());

            // Delete the blob
            transmitter._storage.GetBlob().Lease(1000).Delete();
        }
        public void Success200()
        {
            var activity      = CreateActivity("TestActivity");
            var telemetryItem = CreateTelemetryItem(activity);
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();

            telemetryItems.Add(telemetryItem);

            using var testServer   = new LocalEndpoint(testEndpoint);
            testServer.ServerLogic = async(httpContext) =>
            {
                httpContext.Response.StatusCode = 200;
                await httpContext.Response.WriteAsync("Ok");
            };

            // Transmit
            var transmitter = GetTransmitter();

            transmitter.TrackAsync(telemetryItems, false, CancellationToken.None).EnsureCompleted();

            // Wait for maintenance job to run atleast once
            Thread.Sleep(15000);

            //Assert
            Assert.Empty(transmitter._storage.GetBlobs());
        }
        public void FailureResponseCode206()
        {
            var activity1      = CreateActivity("TestActivity1");
            var activity2      = CreateActivity("TestActivity1");
            var activity3      = CreateActivity("TestActivity1");
            var telemetryItem1 = CreateTelemetryItem(activity1);
            var telemetryItem2 = CreateTelemetryItem(activity1);
            var telemetryItem3 = CreateTelemetryItem(activity1);
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();

            telemetryItems.Add(telemetryItem1);
            telemetryItems.Add(telemetryItem2);
            telemetryItems.Add(telemetryItem3);

            using var testServer   = new LocalEndpoint(testEndpoint);
            testServer.ServerLogic = async(httpContext) =>
            {
                httpContext.Response.StatusCode = 206;
                httpContext.Response.Headers.Add("Retry-After", "6");
                await httpContext.Response.WriteAsync("{\"itemsReceived\": 3,\"itemsAccepted\": 1,\"errors\":[{\"index\": 0,\"statusCode\": 429,\"message\": \"Throttle\"},{\"index\": 1,\"statusCode\": 429,\"message\": \"Throttle\"}]}");
            };

            // Transmit
            var transmitter = GetTransmitter();

            transmitter.TrackAsync(telemetryItems, false, CancellationToken.None).EnsureCompleted();

            // Wait for maintenance job to run atleast once
            Thread.Sleep(15000);

            //Assert
            Assert.Single(transmitter._storage.GetBlobs());

            var failedData = System.Text.Encoding.UTF8.GetString(transmitter._storage.GetBlob().Read());

            string[] items = failedData.Split('\n');

            //Assert
            Assert.Equal(2, items.Count());

            // Delete the blob
            transmitter._storage.GetBlob().Lease(1000).Delete();
        }
        public void TransmitFromStorage()
        {
            var activity      = CreateActivity("TestActivity");
            var telemetryItem = CreateTelemetryItem(activity);
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();

            telemetryItems.Add(telemetryItem);

            using var testServer   = new LocalEndpoint(testEndpoint);
            testServer.ServerLogic = async(httpContext) =>
            {
                httpContext.Response.StatusCode = 500;
                await httpContext.Response.WriteAsync("Internal Server Error");
            };

            // Transmit
            var transmitter = GetTransmitter();

            transmitter.TrackAsync(telemetryItems, false, CancellationToken.None).EnsureCompleted();

            // Wait for maintenance job to run atleast once
            Thread.Sleep(15000);

            //Assert
            Assert.Single(transmitter._storage.GetBlobs());

            // reset server logic to return 200
            testServer.ServerLogic = async(httpContext) =>
            {
                httpContext.Response.StatusCode = 200;
                await httpContext.Response.WriteAsync("{\"itemsReceived\": 1,\"itemsAccepted\": 1,\"errors\":[]}");
            };

            transmitter.TransmitFromStorage(1, false, CancellationToken.None).EnsureCompleted();

            // Assert
            // Blob will be deleted on successful transmission
            Assert.Empty(transmitter._storage.GetBlobs());
        }