X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FTest%2FSystem.Threading%2FManualResetEventSlimTests.cs;h=0694ef80b63ee7808bf39187837f2dcbd9c59f8f;hb=6352c16dd5306ccb8bedc742bf99505688695dc6;hp=75b124c06117fac041468af9406112dd6a0480fd;hpb=7e615f4c6df860747b96ce5025d42ed4d63b1677;p=mono.git diff --git a/mcs/class/corlib/Test/System.Threading/ManualResetEventSlimTests.cs b/mcs/class/corlib/Test/System.Threading/ManualResetEventSlimTests.cs index 75b124c0611..0694ef80b63 100644 --- a/mcs/class/corlib/Test/System.Threading/ManualResetEventSlimTests.cs +++ b/mcs/class/corlib/Test/System.Threading/ManualResetEventSlimTests.cs @@ -1,7 +1,11 @@ -#if NET_4_0 // ManualResetEventSlimTests.cs // +// Authors: +// Marek Safar (marek.safar@gmail.com) +// Jeremie Laval (jeremie.laval@gmail.com) +// // Copyright (c) 2008 Jérémie "Garuma" Laval +// Copyright (c) 2012 Xamarin, Inc (http://www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,6 +27,8 @@ // // +#if NET_4_0 + using System; using System.Threading; @@ -214,6 +220,55 @@ namespace MonoTests.System.Threading Assert.IsTrue (mre.WaitHandle.WaitOne (0), "#2"); } + [Test] + public void WaitHandleConsistencyTest () + { + var mre = new ManualResetEventSlim (); + mre.WaitHandle.WaitOne (0); + + for (int i = 0; i < 10000; i++) { + int count = 2; + SpinWait wait = new SpinWait (); + + ThreadPool.QueueUserWorkItem (_ => { mre.Set (); Interlocked.Decrement (ref count); }); + ThreadPool.QueueUserWorkItem (_ => { mre.Reset (); Interlocked.Decrement (ref count); }); + + while (count > 0) + wait.SpinOnce (); + Assert.AreEqual (mre.IsSet, mre.WaitHandle.WaitOne (0)); + } + } + + [Test] + public void WaitWithCancellationTokenAndNotImmediateSetTest () + { + var mres = new ManualResetEventSlim (); + var cts = new CancellationTokenSource (); + ThreadPool.QueueUserWorkItem(x => { Thread.Sleep (1000); mres.Set (); }); + Assert.IsTrue (mres.Wait (TimeSpan.FromSeconds (10), cts.Token), "Wait returned false despite event was set."); + } + + [Test] + public void WaitWithCancellationTokenAndCancel () + { + var mres = new ManualResetEventSlim (); + var cts = new CancellationTokenSource (); + ThreadPool.QueueUserWorkItem(x => { Thread.Sleep (1000); cts.Cancel (); }); + try { + mres.Wait (TimeSpan.FromSeconds (10), cts.Token); + Assert.Fail ("Wait did not throw an exception despite cancellation token was cancelled."); + } catch (OperationCanceledException) { + } + } + + [Test] + public void WaitWithCancellationTokenAndTimeout () + { + var mres = new ManualResetEventSlim (); + var cts = new CancellationTokenSource (); + Assert.IsFalse (mres.Wait (TimeSpan.FromSeconds (1), cts.Token), "Wait returned true despite timeout."); + } + [Test] public void Dispose () {