Bläddra i källkod

Add a PauseIdGenerationAtDate in MessageId

The method will be used for testing by projects that can't access
SystemDateTime
Kevin Lovato 10 år sedan
förälder
incheckning
7906e40b5a
2 ändrade filer med 33 tillägg och 1 borttagningar
  1. 20 1
      src/Abc.Zebus.Tests/MessageIdTests.cs
  2. 13 0
      src/Abc.Zebus/MessageId.cs

+ 20 - 1
src/Abc.Zebus.Tests/MessageIdTests.cs

@@ -93,10 +93,29 @@ namespace Abc.Zebus.Tests
             unpausedId.Value.ShouldNotEqual(pausedId.Value);
         }
 
+        [Test]
+        [Repeat(20)]
+        public void should_pause_id_generation_at_given_date()
+        {
+            MessageId.ResetLastTimestamp();
+            MessageId pausedId;
+            var dateInThePast = DateTime.UtcNow.Date.AddDays(-10);
+            using (MessageId.PauseIdGenerationAtDate(dateInThePast))
+            {
+                pausedId = MessageId.NextId();
+                pausedId.GetDateTime().ShouldEqual(dateInThePast);
+                MessageId.NextId().Value.ShouldEqual(pausedId.Value);
+            }
+
+            var unpausedId = MessageId.NextId();
+            unpausedId.Value.ShouldNotEqual(pausedId.Value);
+            SystemDateTime.Today.ShouldEqual(DateTime.Today);
+        }
+
         [Test, Repeat(20)]
         public void should_convert_message_id_to_DateTime()
         {
-            Thread.Sleep(1); // To ensure that noone called NextId() in this millisecond, because MessageId has a static state and would increment its value
+            MessageId.ResetLastTimestamp();
             using (SystemDateTime.PauseTime())
             {
                 var id = MessageId.NextId();

+ 13 - 0
src/Abc.Zebus/MessageId.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Security.Cryptography;
+using System.Threading;
 using Abc.Zebus.Util;
 using ProtoBuf;
 
@@ -68,6 +69,18 @@ namespace Abc.Zebus
             return new DisposableAction(() => _pausedId = null);
         }
 
+        public static IDisposable PauseIdGenerationAtDate(DateTime utcDatetime)
+        {
+            var systemDatetimeContext = SystemDateTime.Set(utcNow: utcDatetime);
+            var messageIdContext = PauseIdGeneration();
+
+            return new DisposableAction(() =>
+            {
+                messageIdContext.Dispose();
+                systemDatetimeContext.Dispose();
+            });
+        }
+
         public static void ResetLastTimestamp()
         {
             _lastTimestampTicks = 0;