فهرست منبع

Add a PauseIdGenerationAtDate in MessageId

The method will be used for testing by projects that can't access
SystemDateTime
Kevin Lovato 10 سال پیش
والد
کامیت
7906e40b5a
2فایلهای تغییر یافته به همراه33 افزوده شده و 1 حذف شده
  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;