Example #1
0
        public void too_many_requested_message_ids_within_grace_period()
        {
            const int MinValue = 100;
            const int MaxValue = 103;
            var       sn       = TerminalIdOnlyStrategy.ConstantSequenceNumber;
            var       options  =
                A.OracleHospitalityClientOptions
                .WithTerminalIdLowerBound(MinValue)
                .WithTerminalIdUpperBound(MaxValue)
                .Build();
            var sut = new TerminalIdOnlyStrategy(Options.Create(options));

            MessageId initial = null;

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:00:00")))
            {
                initial = sut.Next();
                AssertMessageId(new TerminalId(initial.TerminalId.ToString()), sn, initial);
                AssertMessageId(new TerminalId(Id(MinValue, MaxValue, initial.TerminalId.Value + 1).ToString()), sn, sut.Next());
                AssertMessageId(new TerminalId(Id(MinValue, MaxValue, initial.TerminalId.Value + 2).ToString()), sn, sut.Next());
            }

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:15:59")))
            {
                var e = Assert.Throws <ArgumentException>(() => sut.Next());
                Assert.Contains($"TerminalId {initial.TerminalId} was last used at 20180101120000", e.Message);
            }
        }
Example #2
0
        public void reuse_message_id_when_outside_grace_period()
        {
            const int MinValue = 100;
            const int MaxValue = 103;
            var       sn       = TerminalIdOnlyStrategy.ConstantSequenceNumber;
            var       options  =
                A.OracleHospitalityClientOptions
                .WithTerminalIdLowerBound(MinValue)
                .WithTerminalIdUpperBound(MaxValue)
                .Build();
            var sut = new TerminalIdOnlyStrategy(Options.Create(options));

            MessageId initial = null;

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:00:00")))
            {
                initial = sut.Next();
                AssertMessageId(new TerminalId(initial.TerminalId.ToString()), sn, initial);
                AssertMessageId(new TerminalId(Id(MinValue, MaxValue, initial.TerminalId.Value + 1).ToString()), sn, sut.Next());
                AssertMessageId(new TerminalId(Id(MinValue, MaxValue, initial.TerminalId.Value + 2).ToString()), sn, sut.Next());
            }

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:16:00")))
            {
                AssertMessageId(new TerminalId(initial.TerminalId.ToString()), sn, sut.Next());
            }
        }
Example #3
0
        public void prune_message_id_history_when_element_outside_grace_period()
        {
            var options =
                A.OracleHospitalityClientOptions
                .WithTerminalIdLowerBound(0)
                .WithTerminalIdUpperBound(10000)
                .Build();
            var       sut       = new TerminalIdOnlyStrategy(Options.Create(options));
            const int Threshold = TerminalIdOnlyStrategy.HistoryAdditionOperationsPruneThreshold;

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:00:00")))
            {
                for (var i = 0; i < Threshold - 1; i++)
                {
                    sut.Next();
                }
            }

            Assert.Equal(Threshold - 1, sut.History.Count);

            using (new TimeProviderTestScope(() => DateTime.Parse("2018-01-01T12:16:01")))
                sut.Next();

            Assert.Single(sut.History);
        }
Example #4
0
        public async Task multiple_threads_requesting_message_ids_receive_non_overlapping_messageIds()
        {
            // Comment out lock statement in
            // IncrementTerminalIdKeepSequenceNumberConstantStrategy class to
            // introduce a race condition that makes the test fail.
            const int MinValue   = 0;
            const int MaxValue   = 10000;
            var       messageIds = new ConcurrentDictionary <int, int>();
            var       options    =
                A.OracleHospitalityClientOptions
                .WithTerminalIdLowerBound(MinValue)
                .WithTerminalIdUpperBound(MaxValue)
                .Build();
            var sut = new TerminalIdOnlyStrategy(Options.Create(options));

            var t1 = Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 1000; i++)
                {
                    var id = sut.Next();
                    messageIds.AddOrUpdate(id.TerminalId.Value, 1, (_, b) => b + 1);
                    System.Threading.Thread.Sleep(5);
                }
            });

            var t2 = Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 1000; i++)
                {
                    var id = sut.Next();
                    messageIds.AddOrUpdate(id.TerminalId.Value, 1, (_, b) => b + 1);
                    System.Threading.Thread.Sleep(1);
                }
            });

            await t1;
            await t2;

            Assert.Equal(2000, messageIds.Count);
            foreach (var ids in messageIds)
            {
                Assert.Equal(1, ids.Value);
            }
        }