示例#1
0
        public void TestNotifyEachWithTimespan()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber = new TestSubscriber()) {
                using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                    scheduler.NotifyEach(
                        TimeSpan.FromHours(12), TimeSpan.FromHours(1), subscriber.Callback
                        );

                    mockTimeSource.AdvanceTime(TimeSpan.FromHours(14));

                    // Wait for 3 invocations of the callback. We might not catch each trigger
                    // of the AutoResetEvent, but we know that it will be 3 at most.
                    for (int invocation = 0; invocation < 3; ++invocation)
                    {
                        Assert.IsTrue(subscriber.WaitForCallback(1000));

                        if (subscriber.CallbackCount == 3)
                        {
                            break;
                        }
                    }
                }
            }
        }
示例#2
0
        public void TestCancelNotification()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber1 = new TestSubscriber()) {
                using (TestSubscriber subscriber2 = new TestSubscriber()) {
                    using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                        object handle = scheduler.NotifyIn(
                            TimeSpan.FromHours(24), subscriber1.Callback
                            );
                        scheduler.NotifyIn(TimeSpan.FromHours(36), subscriber2.Callback);

                        mockTimeSource.AdvanceTime(TimeSpan.FromHours(12));
                        scheduler.Cancel(handle);
                        mockTimeSource.AdvanceTime(TimeSpan.FromHours(24));

                        // Wait for the second subscriber to be notified. This is still a race
                        // condition (there's no guarantee the thread pool will run tasks in
                        // the order they were added), but it's the best we can do without
                        // relying on an ugly Thread.Sleep() in this test.
                        Assert.IsTrue(subscriber2.WaitForCallback(1000));
                        Assert.AreEqual(0, subscriber1.CallbackCount);
                    }
                }
            }
        }
示例#3
0
        public void TestTimeSink03_ChangeTwice()
        {
            /* 创建观察者和被观察者对象 */
            MockTimeSource mockTimeSource = new MockTimeSource();
            MockTimeSink   mockTimeSink   = new MockTimeSink(mockTimeSource);
            MockTimeSink   mockTimeSink1  = new MockTimeSink(mockTimeSource);

            /* 设定观察者对象 */
            mockTimeSource.RegisterObserver(mockTimeSink);
            mockTimeSource.RegisterObserver(mockTimeSink1);

            /* Refresh the souce */
            mockTimeSource.SetTime(1, 3, 5);

            Assert.AreEqual(1, mockTimeSink.GetHour());
            Assert.AreEqual(3, mockTimeSink.GetMinite());
            Assert.AreEqual(5, mockTimeSink.GetSecond());
            Assert.AreEqual(1, mockTimeSink1.GetHour());
            Assert.AreEqual(3, mockTimeSink1.GetMinite());
            Assert.AreEqual(5, mockTimeSink1.GetSecond());

            /* Refresh the souce */
            mockTimeSource.SetTime(2, 4, 6);

            Assert.AreEqual(2, mockTimeSink1.GetHour());
            Assert.AreEqual(4, mockTimeSink1.GetMinite());
            Assert.AreEqual(6, mockTimeSink1.GetSecond());
        }
        public void TestTimeChange()
        {
            MockTimeSource source = new MockTimeSource();
            MockTimeSink   sink   = new MockTimeSink();

            source.RegisterObserver(sink);

            source.SetTime(3, 4, 5);
            AssertSinkEquals(sink, 3, 4, 5);

            source.SetTime(7, 8, 9);
            AssertSinkEquals(sink, 7, 8, 9);
        }
示例#5
0
        public void TestNotifyAt()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber = new TestSubscriber()) {
                using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                    scheduler.NotifyAt(makeUtc(new DateTime(2010, 1, 2)), subscriber.Callback);

                    mockTimeSource.AdvanceTime(TimeSpan.FromDays(1));

                    Assert.IsTrue(subscriber.WaitForCallback(1000));
                }
            }
        }
        public void SetUp()
        {
            tsource = new MockTimeSource();
            handle  = new TimeHandle(tsource, new MockTimeSink());
            tester  = new ThreadSyncTester();

            sourceThread   = tester.ObtainThread("source");
            sinkThread     = tester.ObtainThread("sink");
            externalThread = tester.ObtainThread("external");

            interval = TimeInterval.FromTicks(1000);

            SetSourceSideActiveOnExternal(true);
        }
示例#7
0
        public static void Test()
        {
            var source = new MockTimeSource();
            var sink   = new MockTimeSink(source);

            source.RegisterObserver(sink);

            // changes in object - source
            source.SetTime(3, 4, 5);
            // affects in object - sink
            AssertSinkEquals(sink, 3, 4, 5);
            Console.WriteLine();
            source.SetTime(7, 8, 9);
            AssertSinkEquals(sink, 7, 8, 9);
        }
示例#8
0
        public void TestCancelFinalNotification()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber = new TestSubscriber()) {
                using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                    scheduler.Cancel(
                        scheduler.NotifyIn(TimeSpan.FromHours(12), subscriber.Callback)
                        );

                    mockTimeSource.AdvanceTime(TimeSpan.FromHours(14));
                    Thread.Sleep(1);
                }
            }
        }
示例#9
0
        public void TestNotifyAtWithDateTimeAdjustment()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber = new TestSubscriber()) {
                using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                    scheduler.NotifyAt(makeUtc(new DateTime(2010, 1, 2)), subscriber.Callback);

                    // Let 12 hours pass, after that, we simulate a time synchronization
                    // that puts the system 12 hours ahead of the original time.
                    mockTimeSource.AdvanceTime(TimeSpan.FromHours(12));
                    mockTimeSource.AdjustTime(new DateTime(2010, 1, 2));

                    Assert.IsTrue(subscriber.WaitForCallback(1000));
                }
            }
        }
        public void TestTimeChanged()
        {
            var source = new MockTimeSource() ;
            var sink = new MockTimeSink();
            source.RegisterObserver(sink);

            int hours = 1;
            int minutes = 2;
            int seconds = 3;
            source.SetTime(hours,minutes,seconds);
            AsserrEquals(sink, hours, minutes, seconds);

            hours = 4;
            minutes = 5;
            seconds = 6;
            source.SetTime(hours, minutes, seconds);
            AsserrEquals(sink, hours, minutes, seconds);
        }
示例#11
0
        public void TestTwoNotificationsAtSameTime()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber1 = new TestSubscriber()) {
                using (TestSubscriber subscriber2 = new TestSubscriber()) {
                    using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                        scheduler.NotifyIn(60000, subscriber1.Callback);
                        scheduler.NotifyIn(60000, subscriber2.Callback);

                        mockTimeSource.AdvanceTime(TimeSpan.FromMilliseconds(60000));

                        Assert.IsTrue(subscriber1.WaitForCallback(1000));
                        Assert.IsTrue(subscriber2.WaitForCallback(1000));
                    }
                }
            }
        }
        public void TestTimeChanged()
        {
            var source = new MockTimeSource();
            var sink   = new MockTimeSink();

            source.RegisterObserver(sink);

            int hours   = 1;
            int minutes = 2;
            int seconds = 3;

            source.SetTime(hours, minutes, seconds);
            AsserrEquals(sink, hours, minutes, seconds);

            hours   = 4;
            minutes = 5;
            seconds = 6;
            source.SetTime(hours, minutes, seconds);
            AsserrEquals(sink, hours, minutes, seconds);
        }
示例#13
0
        public void TestInverseOrderNotification()
        {
            MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));

            using (TestSubscriber subscriber1 = new TestSubscriber()) {
                using (TestSubscriber subscriber2 = new TestSubscriber()) {
                    using (Scheduler scheduler = new Scheduler(mockTimeSource)) {
                        scheduler.NotifyIn(TimeSpan.FromHours(24), subscriber1.Callback);
                        scheduler.NotifyIn(TimeSpan.FromHours(12), subscriber2.Callback);

                        mockTimeSource.AdvanceTime(TimeSpan.FromHours(18));

                        Assert.IsTrue(subscriber2.WaitForCallback(1000));
                        Assert.AreEqual(0, subscriber1.CallbackCount);

                        mockTimeSource.AdvanceTime(TimeSpan.FromHours(18));

                        Assert.IsTrue(subscriber1.WaitForCallback(1000));
                    }
                }
            }
        }
示例#14
0
    public void TestNotifyAt() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber = new TestSubscriber()) {
        using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
          scheduler.NotifyAt(makeUtc(new DateTime(2010, 1, 2)), subscriber.Callback);

          mockTimeSource.AdvanceTime(TimeSpan.FromDays(1));

          Assert.IsTrue(subscriber.WaitForCallback(1000));
        }
      }
    }
示例#15
0
    public void TestNotifyAtWithDateTimeAdjustment() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber = new TestSubscriber()) {
        using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
          scheduler.NotifyAt(makeUtc(new DateTime(2010, 1, 2)), subscriber.Callback);

          // Let 12 hours pass, after that, we simulate a time synchronization
          // that puts the system 12 hours ahead of the original time.
          mockTimeSource.AdvanceTime(TimeSpan.FromHours(12));
          mockTimeSource.AdjustTime(new DateTime(2010, 1, 2));

          Assert.IsTrue(subscriber.WaitForCallback(1000));
        }
      }
    }
 public void SetUp()
 {
     this.source = new MockTimeSource();
     this.sink   = new MockTimeSink();
     this.source.RegisterObserver(this.sink);
 }
示例#17
0
    public void TestCancelNotification() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber1 = new TestSubscriber()) {
        using(TestSubscriber subscriber2 = new TestSubscriber()) {
          using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
            object handle = scheduler.NotifyIn(
              TimeSpan.FromHours(24), subscriber1.Callback
            );
            scheduler.NotifyIn(TimeSpan.FromHours(36), subscriber2.Callback);

            mockTimeSource.AdvanceTime(TimeSpan.FromHours(12));
            scheduler.Cancel(handle);
            mockTimeSource.AdvanceTime(TimeSpan.FromHours(24));

            // Wait for the second subscriber to be notified. This is still a race
            // condition (there's no guarantee the thread pool will run tasks in
            // the order they were added), but it's the best we can do without
            // relying on an ugly Thread.Sleep() in this test.
            Assert.IsTrue(subscriber2.WaitForCallback(1000));
            Assert.AreEqual(0, subscriber1.CallbackCount);
          }
        }
      }
    }
示例#18
0
    public void TestInverseOrderNotification() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber1 = new TestSubscriber()) {
        using(TestSubscriber subscriber2 = new TestSubscriber()) {
          using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
            scheduler.NotifyIn(TimeSpan.FromHours(24), subscriber1.Callback);
            scheduler.NotifyIn(TimeSpan.FromHours(12), subscriber2.Callback);

            mockTimeSource.AdvanceTime(TimeSpan.FromHours(18));

            Assert.IsTrue(subscriber2.WaitForCallback(1000));
            Assert.AreEqual(0, subscriber1.CallbackCount);

            mockTimeSource.AdvanceTime(TimeSpan.FromHours(18));

            Assert.IsTrue(subscriber1.WaitForCallback(1000));
          }
        }
      }
    }
示例#19
0
    public void TestTwoNotificationsAtSameTime() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber1 = new TestSubscriber()) {
        using(TestSubscriber subscriber2 = new TestSubscriber()) {
          using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
            scheduler.NotifyIn(60000, subscriber1.Callback);
            scheduler.NotifyIn(60000, subscriber2.Callback);

            mockTimeSource.AdvanceTime(TimeSpan.FromMilliseconds(60000));

            Assert.IsTrue(subscriber1.WaitForCallback(1000));
            Assert.IsTrue(subscriber2.WaitForCallback(1000));
          }
        }
      }
    }
示例#20
0
    public void TestNotifyEachWithTimespan() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber = new TestSubscriber()) {
        using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
          scheduler.NotifyEach(
            TimeSpan.FromHours(12), TimeSpan.FromHours(1), subscriber.Callback
          );

          mockTimeSource.AdvanceTime(TimeSpan.FromHours(14));

          // Wait for 3 invocations of the callback. We might not catch each trigger
          // of the AutoResetEvent, but we know that it will be 3 at most. 
          for(int invocation = 0; invocation < 3; ++invocation) {
            Assert.IsTrue(subscriber.WaitForCallback(1000));

            if(subscriber.CallbackCount == 3) {
              break;
            }
          }
        }
      }
    }
示例#21
0
    public void TestCancelFinalNotification() {
      MockTimeSource mockTimeSource = new MockTimeSource(new DateTime(2010, 1, 1));
      using(TestSubscriber subscriber = new TestSubscriber()) {
        using(Scheduler scheduler = new Scheduler(mockTimeSource)) {
          scheduler.Cancel(
            scheduler.NotifyIn(TimeSpan.FromHours(12), subscriber.Callback)
          );

          mockTimeSource.AdvanceTime(TimeSpan.FromHours(14));
          Thread.Sleep(1);
        }
      }
    }