Merge pull request #3122 from akoeplinger/fix-41530
authorAlexander Köplinger <alex.koeplinger@outlook.com>
Wed, 8 Jun 2016 10:47:41 +0000 (12:47 +0200)
committerAlexander Köplinger <alex.koeplinger@outlook.com>
Wed, 8 Jun 2016 10:47:41 +0000 (12:47 +0200)
[System] Make TimerTest.EnabledInElapsed more reliable

mcs/class/System/Test/System.Timers/TimerTest.cs

index 2b6a95ff768e56529024f14abce4e5f0c7cab5fd..3dd8cf239af06c93b0219b6d7aacabf5b0cef022 100644 (file)
@@ -40,7 +40,6 @@ namespace MonoTests.System.Timers
        public class TimerTest
        {
                Timer timer;
-               int _elapsedCount;
 
                [SetUp]
                public void SetUp ()
@@ -287,19 +286,46 @@ namespace MonoTests.System.Timers
                        Assert.IsFalse (timer.Enabled, "#3");
                }
 
-               [Test] // bug #325368
+               [Test] // bug https://bugzilla.novell.com/show_bug.cgi?id=325368
                public void EnabledInElapsed ()
                {
-                       _elapsedCount = 0;
+                       var elapsedCount = 0;
+                       var mre = new ST.ManualResetEventSlim ();
                        timer = new Timer (50);
                        timer.AutoReset = false;
-                       timer.Elapsed += new ElapsedEventHandler (EnabledInElapsed_Elapsed);
+                       timer.Elapsed += (s, e) =>
+                       {
+                               elapsedCount++;
+                               if (elapsedCount == 1)
+                                       timer.Enabled = true;
+                               else if (elapsedCount == 2)
+                                       mre.Set ();
+                       };
                        timer.Start ();
 
-                       ST.Thread.Sleep (200);
+                       Assert.IsTrue (mre.Wait (500), "#1 re-enabling timer in Elapsed didn't work");
+                       Assert.AreEqual (2, elapsedCount, "#2 wrong elapsedCount");
                        timer.Stop ();
+               }
 
-                       Assert.IsTrue (_elapsedCount == 2,  "#1 loss of events");
+               [Test]
+               public void AutoResetEventFalseStopsFiringElapsed ()
+               {
+                       var elapsedCount = 0;
+                       var mre = new ST.ManualResetEventSlim ();
+                       timer = new Timer (50);
+                       timer.AutoReset = false;
+                       timer.Elapsed += (s, e) =>
+                       {
+                               elapsedCount++;
+                               if (elapsedCount > 1)
+                                       mre.Set ();
+                       };
+                       timer.Start ();
+
+                       Assert.IsFalse (mre.Wait (500), "#1 AutoResetEvent=false didn't stop firing Elapsed, elapsedCount=" + elapsedCount);
+                       Assert.AreEqual (1, elapsedCount, "#2 wrong elapsedCount");
+                       timer.Stop ();
                }
 
                [Test]
@@ -308,14 +334,6 @@ namespace MonoTests.System.Timers
                        Assert.IsTrue (new RaceTest (true).Success, "#1");
                        Assert.IsTrue (new RaceTest (false).Success, "#2");
                }
-
-               void EnabledInElapsed_Elapsed (object sender, ElapsedEventArgs e)
-               {
-                       _elapsedCount++;
-                       Timer t = sender as Timer;
-                       if (_elapsedCount == 1)
-                               t.Enabled = true;
-               }
        }
 
        class RaceTest