示例#1
0
        public void TestOneMessage(bool shouldProcess, ProcessResult?action, int expectedNackMultiple, string expectedNackSingle)
        {
            var tracker = new AckTrackerTracker();

            tracker.Observe(0, shouldProcess);

            if (action.HasValue)
            {
                tracker.EndProcessing(0, action.Value);
            }

            tracker.AssertCalculateNacks(expectedNackMultiple, expectedNackSingle);
        }
示例#2
0
        public void TestShouldNackWithOutstandingProcessing()
        {
            var tracker = new AckTrackerTracker();

            tracker.Observe(0, startProcessing: true);
            tracker.Observe(1, startProcessing: true);
            tracker.CalculateNacks();

            tracker.EndProcessing(1, ProcessResult.ShouldNack);

            tracker.CalculateNacks();

            tracker.EndProcessing(0, ProcessResult.AlreadyAcked);

            tracker.AssertAllAcked();
        }
示例#3
0
        public void TestMultipleShouldNackAfterCalculate()
        {
            var tracker = new AckTrackerTracker();

            tracker.Observe(0, startProcessing: true);
            tracker.EndProcessing(0, ProcessResult.AlreadyAcked);
            tracker.CalculateNacks();

            tracker.Observe(1, startProcessing: true);
            tracker.Observe(2, startProcessing: true);
            tracker.CalculateNacks();

            tracker.EndProcessing(2, ProcessResult.ShouldNack);
            tracker.CalculateNacks();

            tracker.EndProcessing(1, ProcessResult.AlreadyAcked);

            tracker.AssertAllAcked();
        }
示例#4
0
        public void GenerateFailingTestCases()
        {
            // Generate all possible scenarios with 5 messages and 3 calls to CalculateNacks
            const int messagesCount = 5;

            for (var firstCancelAfter = 0; firstCancelAfter < messagesCount - 2; firstCancelAfter++)
            {
                for (var secondCancelAfter = firstCancelAfter; secondCancelAfter < messagesCount - 1; secondCancelAfter++)
                {
                    var startTime = Enumerable.Range(0, messagesCount)
                                    .Select(i =>
                                            i <= firstCancelAfter ? 0
                                                        : i <= secondCancelAfter ? 1
                                                        : 2)
                                    .ToArray();
                    var possibleProcessTimes = Enumerable.Range(0, messagesCount)
                                               .Select(i =>
                    {
                        var times = new List <int>();
                        if (i <= firstCancelAfter)
                        {
                            times.Add(0);
                        }

                        if (i <= secondCancelAfter)
                        {
                            times.Add(1);
                        }

                        times.Add(2);
                        times.Add(3);

                        return(times.ToArray());
                    })
                                               .ToArray();

                    foreach (var shouldStartProcessing in GetAllPermutations(messagesCount, _ => new[] { true, false }))
                    {
                        foreach (var processTime in GetAllPermutations(messagesCount, i => shouldStartProcessing[i] ? possibleProcessTimes[i] : new[] { -1 }))
                        {
                            foreach (var processResult in GetAllPermutations(
                                         messagesCount,
                                         i => !shouldStartProcessing[i] ? new[] { (ProcessResult)(-1) }
                                                                        : startTime[i] == processTime[i] ? new[] { ProcessResult.AlreadyAcked, ProcessResult.ShouldNack }
                                                                        : processTime[i] == 3 ? new[] { ProcessResult.AlreadyAcked, ProcessResult.AlreadyNacked }
                                                                        : new[] { ProcessResult.AlreadyNacked, ProcessResult.AlreadyAcked, ProcessResult.ShouldNack }))
                            {
                                // Run the test and ensure nothing gets double-acked.
                                var tracker = new AckTrackerTracker();

                                void ProcessRound(int round)
                                {
                                    for (var i = 0; i < messagesCount; i++)
                                    {
                                        if (startTime[i] == round)
                                        {
                                            tracker.Observe(i, shouldStartProcessing[i]);
                                        }

                                        if (processTime[i] == round)
                                        {
                                            tracker.EndProcessing(i, processResult[i]);
                                        }
                                    }
                                }

                                ProcessRound(0);

                                tracker.CalculateNacks();

                                ProcessRound(1);

                                tracker.CalculateNacks();

                                ProcessRound(2);

                                tracker.CalculateNacks();

                                ProcessRound(3);

                                tracker.AssertAllAcked();
                            }
                        }
                    }
                }
            }
        }