public void RestoresOriginalComponentCapacityWhenPolicyIsNoLongerApplicable()
            {
                var sender = new StubTransmissionSender {
                    Capacity = 1
                };
                var buffer = new StubTransmissionBuffer {
                    Capacity = 10
                };
                var storage = new StubTransmissionStorage {
                    Capacity = 100
                };
                var policy = new StubTransmissionPolicy()
                {
                    MaxSenderCapacity  = 0,
                    MaxBufferCapacity  = 0,
                    MaxStorageCapacity = 0,
                };

                Transmitter transmitter = CreateTransmitter(sender, buffer, storage, new[] { policy });

                policy.MaxSenderCapacity  = null;
                policy.MaxBufferCapacity  = null;
                policy.MaxStorageCapacity = null;
                policy.Apply();

                Assert.Equal(1, sender.Capacity);
                Assert.Equal(10, buffer.Capacity);
                Assert.Equal(100, storage.Capacity);
            }
            public async Task StoresTransmissionWhenBufferIsFull()
            {
                Transmission storedTransmission = null;
                var          storage            = new StubTransmissionStorage
                {
                    OnEnqueue = transmission =>
                    {
                        if (transmission != null)
                        {
                            storedTransmission = transmission;
                            transmission.IsFlushAsyncInProgress = true;
                            return(true);
                        }

                        return(false);
                    }
                };


                var sender = new StubTransmissionSender {
                    OnEnqueue = t => false
                };
                var buffer = new StubTransmissionBuffer {
                    OnEnqueue = t => false
                };
                Transmitter transmitter = CreateTransmitter(sender: sender, buffer: buffer, storage: storage);

                var enqueuedTransmission = new StubTransmission();
                var result = await transmitter.FlushAsync(enqueuedTransmission, default);

                Assert.AreSame(enqueuedTransmission, storedTransmission);
                Assert.IsTrue(result);
            }
            public void StoresTransmissionWhenBufferIsFull()
            {
                Transmission storedTransmission = null;
                var          storage            = new StubTransmissionStorage
                {
                    OnEnqueue = transmission =>
                    {
                        storedTransmission = transmission;
                        return(false);
                    }
                };

                var sender = new StubTransmissionSender {
                    OnEnqueue = t => false
                };
                var buffer = new StubTransmissionBuffer {
                    OnEnqueue = t => false
                };
                Transmitter transmitter = CreateTransmitter(sender: sender, buffer: buffer, storage: storage);

                var enqueuedTransmission = new StubTransmission();

                transmitter.Enqueue(enqueuedTransmission);

                Assert.Same(enqueuedTransmission, storedTransmission);
            }
            public void ReturnsCurrentTransmissionBufferCapacityByDefault()
            {
                var buffer = new StubTransmissionBuffer {
                    Capacity = 42
                };
                Transmitter transmitter = CreateTransmitter(buffer: buffer);

                Assert.Equal(42, transmitter.MaxBufferCapacity);
            }
            public void ChangesCurrentBufferCapacityImmediatelyWhenNoOverridingPoliciesAreInEffect()
            {
                var         buffer      = new StubTransmissionBuffer();
                Transmitter transmitter = CreateTransmitter(buffer: buffer);

                transmitter.ApplyPolicies();

                transmitter.MaxBufferCapacity = 42;

                Assert.Equal(42, buffer.Capacity);
            }
            public void DoesNotChangeCurrentBufferCapacityWhenOverridingPolicyIsInEffect()
            {
                var buffer = new StubTransmissionBuffer();
                var policy = new StubTransmissionPolicy {
                    MaxBufferCapacity = 0
                };
                Transmitter transmitter = CreateTransmitter(buffer: buffer, policies: new[] { policy });

                policy.Apply();

                transmitter.MaxBufferCapacity = 42;

                Assert.Equal(0, buffer.Capacity);
            }
            public void ReturnsMaximumTransmissionBufferCapacityRegardlessOfPolicyInEffect()
            {
                var buffer = new StubTransmissionBuffer {
                    Capacity = 42
                };
                var policy = new StubTransmissionPolicy {
                    MaxBufferCapacity = 0
                };
                Transmitter transmitter = CreateTransmitter(buffer: buffer, policies: new[] { policy });

                policy.Apply();

                Assert.Equal(42, transmitter.MaxBufferCapacity);
            }
            public async Task FlushAsyncReturnsFalseWhenTransmissionIsNotSentOrStored()
            {
                var sender = new StubTransmissionSender {
                    OnEnqueue = t => false
                };
                var buffer = new StubTransmissionBuffer {
                    OnEnqueue = t => false
                };
                var storage = new StubTransmissionStorage {
                    OnEnqueue = t => false
                };
                Transmitter transmitter = CreateTransmitter(sender: sender, buffer: buffer, storage: storage);

                var enqueuedTransmission = new StubTransmission();
                var result = await transmitter.FlushAsync(enqueuedTransmission, default);

                Assert.IsFalse(result);
            }
            public void SetsBufferCapacityToMinValueReturnedByTransmissionPolicies()
            {
                var buffer   = new StubTransmissionBuffer();
                var policies = new[]
                {
                    new StubTransmissionPolicy {
                        MaxBufferCapacity = 4
                    },
                    new StubTransmissionPolicy {
                        MaxBufferCapacity = 2
                    },
                };

                Transmitter transmitter = CreateTransmitter(buffer: buffer, policies: policies);

                transmitter.ApplyPolicies();

                Assert.Equal(2, buffer.Capacity);
            }
            public void MovesTransmissionsFromStorageToSenderToAvoidWaitingUntilBufferIsFullBeforeSendingStarts()
            {
                var storedTransmission = new StubTransmission();
                var storage            = new StubTransmissionStorage();

                storage.Enqueue(() => storedTransmission);
                var buffer = new StubTransmissionBuffer();

                var sentTransmissions         = new List <Transmission>();
                StubTransmissionSender sender = CreateSender(sentTransmissions);

                sender.OnGetCapacity = () => 1;

                Transmitter transmitter = CreateTransmitter(sender, buffer, storage);

                transmitter.ApplyPolicies();

                Assert.Contains(storedTransmission, sentTransmissions);
            }
            public void DoesNotChangeComponentCapacityIfNoneOfPoliciesAreApplicable()
            {
                var sender = new StubTransmissionSender {
                    Capacity = 1
                };
                var buffer = new StubTransmissionBuffer {
                    Capacity = 10
                };
                var storage = new StubTransmissionStorage {
                    Capacity = 100
                };
                var policies = new[] { new StubTransmissionPolicy() };

                Transmitter transmitter = CreateTransmitter(sender, buffer, storage, policies: policies);

                Assert.Equal(1, sender.Capacity);
                Assert.Equal(10, buffer.Capacity);
                Assert.Equal(100, storage.Capacity);
            }
            public void MovesOldestTransmissionFromStorageToBuffer()
            {
                var previouslyStoredTransmissions = new List <Transmission> {
                    new StubTransmission(), new StubTransmission()
                };
                int storageIndex = 0;
                var storage      = new StubTransmissionStorage
                {
                    OnDequeue = () =>
                    {
                        if (storageIndex < previouslyStoredTransmissions.Count)
                        {
                            return(previouslyStoredTransmissions[storageIndex++]);
                        }

                        return(null);
                    }
                };

                var newlyBufferedTransmissions = new List <Transmission>();
                var buffer = new StubTransmissionBuffer
                {
                    OnEnqueue = getTransmission =>
                    {
                        var transmission = getTransmission();
                        if (transmission != null)
                        {
                            newlyBufferedTransmissions.Add(transmission);
                            return(true);
                        }

                        return(false);
                    }
                };

                var sender = new StubTransmissionSender();

                Transmitter queue = CreateTransmitter(sender: sender, buffer: buffer, storage: storage);

                buffer.OnTransmissionDequeued(new TransmissionProcessedEventArgs(null));

                Assert.Equal(previouslyStoredTransmissions, newlyBufferedTransmissions);
            }
            public void RestoresOriginalComponentCapacityInCaseOfOnePolicyRunningByTimerTwoTimes()
            {
                IList <Transmission> enqueuedTransmissions = new List <Transmission>();

                var sender = new StubTransmissionSender {
                    Capacity = 2
                };
                var buffer = new StubTransmissionBuffer {
                    Capacity = 1
                };
                var storage = new StubTransmissionStorage {
                    Capacity = 100
                };

                var         policies    = new[] { new StubTransmissionScheduledPolicy() };
                Transmitter transmitter = CreateTransmitter(sender, buffer, storage, policies: policies);

                var items = new List <ITelemetry> {
                    new EventTelemetry(), new EventTelemetry()
                };
                Transmission transmission = new Transmission(new Uri("http://uri"), items, "type", "encoding");

                string response = BackendResponseHelper.CreateBackendResponse(
                    itemsReceived: 2,
                    itemsAccepted: 1,
                    errorCodes: new[] { "500" });

                var wrapper = new HttpWebResponseWrapper
                {
                    StatusCode = 500,
                    Content    = response
                };

                sender.OnTransmissionSent(new TransmissionProcessedEventArgs(transmission, null, wrapper));
                sender.OnTransmissionSent(new TransmissionProcessedEventArgs(transmission, null, wrapper));
                sender.OnTransmissionSent(new TransmissionProcessedEventArgs(transmission, null, wrapper));

                Assert.IsTrue(policies[0].ActionInvoked.Wait(3000));

                Assert.AreNotEqual(0, sender.Capacity);
                Assert.AreNotEqual(0, buffer.Capacity);
            }
            public void DoesNotMoveTransmissionsFromStorageToSenderWhenBufferIsNotEmptyToPreserveQueueOrder()
            {
                var storedTransmission = new StubTransmission();
                var storage            = new StubTransmissionStorage();

                storage.Enqueue(() => storedTransmission);
                var buffer = new StubTransmissionBuffer {
                    OnGetSize = () => 1
                };

                var sentTransmissions         = new List <Transmission>();
                StubTransmissionSender sender = CreateSender(sentTransmissions);

                sender.OnGetCapacity = () => 1;

                Transmitter transmitter = CreateTransmitter(sender, buffer, storage);

                transmitter.ApplyPolicies();

                Assert.DoesNotContain(storedTransmission, sentTransmissions);
            }
            public void LogsUnhandledAsyncExceptionsToPreventThemFromCrashingApplication()
            {
                var exception = new Exception(Guid.NewGuid().ToString());
                var buffer    = new StubTransmissionBuffer
                {
                    OnEnqueue = getTransmissionAsync =>
                    {
                        throw exception;
                    }
                };

                Transmitter transmitter = CreateTransmitter(buffer: buffer);

                using (var listener = new TestEventListener())
                {
                    const long AllKeywords = -1;
                    listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.Warning, (EventKeywords)AllKeywords);

                    buffer.OnTransmissionDequeued(new TransmissionProcessedEventArgs(new StubTransmission()));

                    EventWrittenEventArgs message = listener.Messages.First();
                    Assert.Contains(exception.Message, (string)message.Payload[0], StringComparison.Ordinal);
                }
            }
            public void BuffersTransmissionWhenSenderIsFull()
            {
                var sender = new StubTransmissionSender {
                    OnEnqueue = t => false
                };

                Transmission bufferedTransmission = null;
                var          buffer = new StubTransmissionBuffer
                {
                    OnEnqueue = getTransmission =>
                    {
                        bufferedTransmission = getTransmission();
                        return(bufferedTransmission != null);
                    },
                };

                Transmitter transmitter = CreateTransmitter(sender: sender, buffer: buffer);

                var transmission = new StubTransmission();

                transmitter.Enqueue(transmission);

                Assert.Same(transmission, bufferedTransmission);
            }
            public void EmptiesBufferIfCapacityIsZero()
            {
                //// We set capacity to 0 and clear the cache when DC responds with 439.

                var buffer = new StubTransmissionBuffer();

                buffer.Enqueue(() => new StubTransmission());
                var storage = new StubTransmissionStorage();

                storage.Enqueue(() => new StubTransmission());
                var sender = new StubTransmissionSender();

                sender.Enqueue(() => new StubTransmission());

                var policy = new StubTransmissionPolicy();

                policy.MaxStorageCapacity = 0;

                Transmitter transmitter = CreateTransmitter(sender, buffer, storage, new[] { policy });

                policy.Apply();

                Assert.Equal(0, storage.Queue.Count);
            }