Author: lupus Date: 2007-10-16 06:01:30 -0400 (Tue, 16 Oct 2007) New Revision: 87566
Modified: trunk/mcs/class/corlib/Test/System.Threading/TimerTest.cs Log: Timer test cases from Rafael Ferreira ([EMAIL PROTECTED]). Modified: trunk/mcs/class/corlib/Test/System.Threading/TimerTest.cs =================================================================== --- trunk/mcs/class/corlib/Test/System.Threading/TimerTest.cs 2007-10-16 10:00:19 UTC (rev 87565) +++ trunk/mcs/class/corlib/Test/System.Threading/TimerTest.cs 2007-10-16 10:01:30 UTC (rev 87566) @@ -3,6 +3,7 @@ // // Author: // Zoltan Varga ([EMAIL PROTECTED]) +// Rafael Ferreira ([EMAIL PROTECTED]) // // (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +11,10 @@ using NUnit.Framework; using System; using System.Threading; +using System.Collections; namespace MonoTests.System.Threading { - [TestFixture] // // This whole test seems to fail randomly. Either // - It is relying on a race it might not win (that the timer code runs) @@ -22,111 +23,178 @@ // Am going with door #1, but it would be nice to investigate this. // -- Ben // - public class TimerTest : Assertion { + [TestFixture] + public class TimerTest { + // this bucket is used to avoid non-theadlocal issues + class Bucket { + public int count; + } + [SetUp] + public void setup() { + //creating a timer that will never run just to make sure the + // scheduler is warm for the unit tests + // this makes fair for the "DueTime" test since it + // doesn't have to wait for the scheduler thread to be + // created. + new Timer(null,null,Timeout.Infinite,0); + } + [Test] - [Category ("NotWorking")] public void TestDueTime () { - counter = 0; - Timer t = new Timer (new TimerCallback (Callback), null, 200, Timeout.Infinite); + Bucket bucket = new Bucket(); + Timer t = new Timer (new TimerCallback (Callback), bucket, 200, Timeout.Infinite); Thread.Sleep (50); - AssertEquals ("t0", 0, counter); + Assert.AreEqual (0, bucket.count); Thread.Sleep (200); - AssertEquals ("t1", 1, counter); + Assert.AreEqual (1, bucket.count); Thread.Sleep (500); - AssertEquals ("t2", 1, counter); - + Assert.AreEqual (1, bucket.count); t.Change (10, 10); - Thread.Sleep (500); - Assert ("t3", counter > 20); + Thread.Sleep (1000); + Assert.IsTrue(bucket.count > 20); t.Dispose (); } [Test] - [Category ("NotWorking")] public void TestChange () { - counter = 0; - Timer t = new Timer (new TimerCallback (Callback), null, 1, 1); + Bucket bucket = new Bucket(); + Timer t = new Timer (new TimerCallback (Callback), bucket, 1, 1); Thread.Sleep (500); - int c = counter; - Assert ("t1", c > 20); + int c = bucket.count; + Assert.IsTrue(c > 20); t.Change (100, 100); Thread.Sleep (500); - Assert ("t2", counter <= c + 6); + Assert.IsTrue(bucket.count <= c + 6); t.Dispose (); } [Test] - [Category ("NotWorking")] public void TestZeroDueTime () { - counter = 0; + Bucket bucket = new Bucket(); - Timer t = new Timer (new TimerCallback (Callback), null, 0, Timeout.Infinite); + Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite); Thread.Sleep (100); - AssertEquals (1, counter); + Assert.AreEqual (1, bucket.count); t.Change (0, Timeout.Infinite); Thread.Sleep (100); - AssertEquals (2, counter); + Assert.AreEqual (2, bucket.count); t.Dispose (); } - [Test] - [Category ("NotWorking")] public void TestDispose () - { - counter = 0; - Timer t = new Timer (new TimerCallback (CallbackTestDispose), null, 10, 10); + { + Bucket bucket = new Bucket(); + Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10); Thread.Sleep (200); t.Dispose (); Thread.Sleep (20); - int c = counter; - Assert (counter > 5); + int c = bucket.count; + Assert.IsTrue(bucket.count > 5); Thread.Sleep (200); - AssertEquals (c, counter); + Assert.AreEqual (c, bucket.count); } [Test] // bug #78208 public void TestDispose2 () { - Timer t = new Timer (new TimerCallback (CallbackTestDispose), null, 10, 10); + Timer t = new Timer (new TimerCallback (Callback), null, 10, 10); t.Dispose (); t.Dispose (); } [Test] - [Category ("NotWorking")] + public void TestHeavyCreationLoad() { + int i = 0; + Bucket b = new Bucket(); + while (i < 500) { + new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite); + i++; + } + // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well + Thread.Sleep(12*500); + Assert.AreEqual(500,b.count); + + } + [Test] + public void TestQuickDisposeDeadlockBug() { + int i = 0; + Bucket b = new Bucket(); + ArrayList timers = new ArrayList(); + while (i < 500) { + Timer t = new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite); + timers.Add(t); + i++; + t.Dispose(); + } + Thread.Sleep(11*500); + } + [Test] + public void TestInt32MaxDelay() { + Bucket b = new Bucket(); + new Timer(new TimerCallback(Callback),b,Int32.MaxValue,Timeout.Infinite); + Thread.Sleep(50); + Assert.AreEqual(0,b.count); + + } + [Test] + public void TestInt32MaxPeriod() { + Bucket b = new Bucket(); + new Timer(new TimerCallback(Callback),b,0,Int32.MaxValue); + Thread.Sleep(50); + Assert.AreEqual(1,b.count); + + } + [Test] + public void TestNegativeDelay() { + Bucket b = new Bucket(); + try { + new Timer(new TimerCallback(Callback),b,-10,Timeout.Infinite); + } catch (ArgumentOutOfRangeException) { + return; + } + Assert.Fail(); + + } + [Test] + public void TestNegativePeriod() { + Bucket b = new Bucket(); + try { + new Timer(new TimerCallback(Callback),b,0,-10); + } catch (ArgumentOutOfRangeException) { + return; + } + Assert.Fail(); + } + + [Test] + public void TestDelayZeroPeriodZero() { + Bucket b = new Bucket(); + new Timer(new TimerCallback(Callback),b,0,0); + Thread.Sleep(50); + Assert.IsTrue(b.count > 45); + + } + + [Category("NotWorking")] public void TestDisposeOnCallback () { - counter = 0; - t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), null, 0, 10); + + Timer t1 = null; + t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10); Thread.Sleep (200); - AssertNull (t1); + Assert.IsNull(t1); - counter = 2; - t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), null, 50, 0); - Thread.Sleep (200); - AssertNull (t1); } - private void CallbackTestDisposeOnCallback (object foo) { - if (++counter == 3) { - t1.Dispose (); - t1 = null; - } + ((Timer)foo).Dispose(); } - - private void CallbackTestDispose (object foo) - { - counter++; - } - + private void Callback (object foo) { - counter++; + Bucket b = foo as Bucket; + b.count++; } - - Timer t1; - int counter; } } _______________________________________________ Mono-patches maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-patches
