[corlib] Disable ThreadLocalTests.DisposeOnThreadExit on MonoTouch, it's randomly...
[mono.git] / mcs / class / corlib / Test / System.Threading / ThreadLocalTests.cs
index 37683efb91e7a1d0c95291687fd4b7a1cbedf628..8c063dccdc879ca860f78b88fe19806d97ff35bf 100644 (file)
@@ -1,4 +1,3 @@
-#if NET_4_0
 // 
 // ThreadLazyTests.cs
 //  
@@ -96,16 +95,19 @@ namespace MonoTests.System.Threading
 
                        Assert.IsNotNull (exception, "#4");
                        Assert.That (exception, Is.TypeOf (typeof (ApplicationException)), "#5");
-                       Assert.AreEqual (1, callTime, "#6");
+                       Assert.AreEqual (2, callTime, "#6");
                }
 
-               [Test, ExpectedException (typeof (InvalidOperationException))]
                [Category ("NotDotNet")] // nunit results in stack overflow
                public void MultipleReferenceToValueTest ()
                {
-                       threadLocal = new ThreadLocal<int> (() => threadLocal.Value + 1);
+                       try {
+                               threadLocal = new ThreadLocal<int> (() => threadLocal.Value + 1);
+                               var v = threadLocal.Value;
 
-                       var value = threadLocal.Value;
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException e) {
+                       }
                }
 
                [Test]
@@ -174,6 +176,45 @@ namespace MonoTests.System.Threading
                        Assert.AreEqual (42, threadLocal.Value, "#4");
                        Assert.AreEqual (1, nTimes, "#5");
                }
+
+               class SetMreOnFinalize
+               {
+                       ManualResetEventSlim m_mres;
+
+                       public SetMreOnFinalize (ManualResetEventSlim mres)
+                       {
+                               m_mres = mres;
+                       }
+
+                       ~SetMreOnFinalize()
+                       {
+                               m_mres.Set();
+                       }
+               }
+
+               [Test]
+               [Category ("NotWorking")] // Finalizers aren't guaranteed
+#if MONOTOUCH
+               [Category ("NotWorking")] // https://bugzilla.xamarin.com/show_bug.cgi?id=34617
+#endif
+               public void DisposeOnThreadExit ()
+               {
+                       var threadLocal = new ThreadLocal<SetMreOnFinalize>();
+                       var mres = new ManualResetEventSlim(false);
+                       var thread = new Thread (() => { threadLocal.Value = new SetMreOnFinalize (mres); });
+
+                       thread.Start ();
+                       thread.Join ();
+
+                       SpinWait.SpinUntil (() => {
+                               GC.Collect();
+                               GC.WaitForPendingFinalizers();
+                               GC.Collect();
+                               return mres.IsSet;
+                       }, 500);
+
+                       if (!mres.IsSet)
+                               Assert.Fail ("Finalizer didn't run after thread termination");
+               }
        }
 }
-#endif