// $Id$ // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // using System; using System.Threading; using Etch4.Util.Test; using NUnit.Framework; namespace Org.Apache.Etch.Bindings.Csharp.Util { [TestFixture] public class TestMonitor { private const double REL_ERROR = 100000; /** @ */ [Test] public void construct1() { testconstruct1( null ); testconstruct1( "a" ); testconstruct1( "b" ); } private void testconstruct1( String descr ) { Monitor m = new Monitor( descr ); Assert.AreEqual( descr, m.GetDescription() ); Assert.IsNull( m.Get() ); } /** @ */ [Test] public void construct2() { testconstruct2( null, null ); testconstruct2( null, true ); testconstruct2( null, 1 ); testconstruct2( null, "abc" ); testconstruct2( null, 3.14159 ); testconstruct2( "a", null ); testconstruct2( "b", true ); testconstruct2( "c", 1 ); testconstruct2( "d", "abc" ); testconstruct2( "e", 3.14159 ); } private void testconstruct2( String descr, Object value ) { Monitor m = new Monitor( descr, value ); Assert.AreEqual( descr, m.GetDescription() ); Assert.AreEqual( value, m.Get() ); } /** @ */ [Test] public void mToString() { Assert.AreEqual("Monitor : ", new Monitor(null, null).ToString()); Assert.AreEqual( "Monitor : True", new Monitor( null, true ).ToString() ); Assert.AreEqual( "Monitor : 1", new Monitor( null, 1 ).ToString() ); Assert.AreEqual( "Monitor : abc", new Monitor( null, "abc" ).ToString() ); Assert.AreEqual( "Monitor : 3.14159", new Monitor( null, 3.14159 ).ToString() ); Assert.AreEqual( "Monitor a: ", new Monitor( "a", null ).ToString() ); Assert.AreEqual( "Monitor b: True", new Monitor( "b", true ).ToString() ); Assert.AreEqual( "Monitor c: 1", new Monitor( "c", 1 ).ToString() ); Assert.AreEqual( "Monitor d: abc", new Monitor( "d", "abc" ).ToString() ); Assert.AreEqual( "Monitor e: 3.14159", new Monitor( "e", 3.14159 ).ToString() ); } /** @ */ [Test] public void Set1() { Monitor m = new Monitor( "a", null ); Assert.AreEqual( null, m.Set( 1 ) ); Assert.AreEqual( 1, m.Set( 2 ) ); Assert.AreEqual( 2, m.Set( null ) ); Assert.AreEqual( null, m.Set( null ) ); } /** @ */ [Test] public void Set2() { Monitor m = new Monitor( "a", 1 ); Assert.AreEqual( 1, m.Set( 2 ) ); Assert.AreEqual( 2, m.Set( null ) ); Assert.AreEqual( null, m.Set( null ) ); } /** @ */ [Test] public void SetGet() { Monitor m = new Monitor( "a", 1 ); Assert.AreEqual( 1, m.Set( 2 ) ); Assert.AreEqual( 2, m.Get() ); Assert.AreEqual( 2, m.Set( null ) ); Assert.AreEqual( null, m.Get() ); Assert.AreEqual( null, m.Set( null ) ); Assert.AreEqual( null, m.Get() ); } /** @ */ [Ignore] [Test] public void Setsync() { Monitor m = new Monitor( "a", null ); bool[] flag = new bool[2000]; Thread t = new Thread(new ThreadStart( delegate() { for (int i = 0; i < 1000; i++) { int? x = m.Set( i ); flag[x.GetValueOrDefault()] = true; } })); Thread t1 = TestHelp.Delay(1000, t); Thread t2 = TestHelp.Delay(1000, new Thread(new ThreadStart(delegate() { for (int i = 1000; i < 2000; i++) { int? x = m.Set( i ); flag[x.GetValueOrDefault()] = true; } } ))); t1.Start(); t2.Start(); t1.Join(); t2.Join(); int? x1 = m.Set( null ); flag[x1.GetValueOrDefault()] = true; foreach (bool b in flag) Assert.IsTrue( b ); } /** @ */ [Test] public void waitUntilEq1() { Monitor m = new Monitor( "a", null ); m.WaitUntilEq( null ); m.WaitUntilEq( null, 0 ); m.Set( 1 ); m.WaitUntilEq( 1 ); m.WaitUntilEq( 1, 0 ); m.Set( 2 ); m.WaitUntilEq( 2 ); m.WaitUntilEq( 2, 0 ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilEq2() { Monitor m = new Monitor( "a", 1 ); m.WaitUntilEq( 2, 1 ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilEq3() { Monitor m = new Monitor( "a", null ); m.WaitUntilEq( 2, 1 ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilEq4() { Monitor m = new Monitor( "a", 1 ); m.WaitUntilEq( null, 1 ); } /** @ */ [Test] public void waitUntilNotEq1() { Monitor m = new Monitor( "a", null ); m.WaitUntilNotEq( 1 ); m.WaitUntilNotEq( 1, 0 ); m.Set( 1 ); m.WaitUntilNotEq( null ); m.WaitUntilNotEq( null, 0 ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilNotEq2() { Monitor m = new Monitor( "a", null ); m.WaitUntilNotEq( null, 1 ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilNotEq3() { Monitor m = new Monitor( "a", 1 ); m.WaitUntilNotEq( 1, 1 ); } /** @ */ [Test] public void waitUntilEqAndSet1() { Monitor m = new Monitor( "a", null ); Assert.AreEqual( null, m.WaitUntilEqAndSet( null, 1 ) ); Assert.AreEqual( 1, m.WaitUntilEqAndSet( 1, 2 ) ); Assert.AreEqual( 2, m.WaitUntilEqAndSet( 2, null ) ); Assert.AreEqual( null, m.WaitUntilEqAndSet( null, null ) ); Assert.AreEqual( null, m.WaitUntilEqAndSet( null, 0, 1 ) ); Assert.AreEqual( 1, m.WaitUntilEqAndSet( 1, 0, 2 ) ); Assert.AreEqual( 2, m.WaitUntilEqAndSet( 2, 0, null ) ); Assert.AreEqual( null, m.WaitUntilEqAndSet( null, 0, null ) ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilEqAndSet2() { Monitor m = new Monitor( "a", null ); try { m.WaitUntilEqAndSet( 1, 1, 2 ); } finally { Assert.AreEqual( null, m.Get() ); } } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilEqAndSet3() { Monitor m = new Monitor( "a", 1 ); try { m.WaitUntilEqAndSet( null, 1, 2 ); } finally { Assert.AreEqual( 1, m.Get() ); } } /** @ */ [Test] public void waitUntilNotEqAndSet1() { Monitor m = new Monitor( "a", null ); Assert.AreEqual( null, m.WaitUntilNotEqAndSet( 2, 1 ) ); Assert.AreEqual( 1, m.WaitUntilNotEqAndSet( 3, 2 ) ); Assert.AreEqual( 2, m.WaitUntilNotEqAndSet( 4, null ) ); Assert.AreEqual( null, m.WaitUntilNotEqAndSet( 5, null ) ); Assert.AreEqual( null, m.WaitUntilNotEqAndSet( 2, 0, 1 ) ); Assert.AreEqual( 1, m.WaitUntilNotEqAndSet( 3, 0, 2 ) ); Assert.AreEqual( 2, m.WaitUntilNotEqAndSet( 4, 0, null ) ); Assert.AreEqual( null, m.WaitUntilNotEqAndSet( 5, 0, null ) ); } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilNotEqAndSet2() { Monitor m = new Monitor( "a", null ); try { m.WaitUntilNotEqAndSet( null, 1, 1 ); } finally { Assert.AreEqual( null, m.Get() ); } } /** @ */ [Test] [ExpectedException(typeof(ThreadInterruptedException))] public void waitUntilNotEqAndSet3() { Monitor m = new Monitor( "a", 1 ); try { m.WaitUntilNotEqAndSet( 1, 1, null ); } finally { Assert.AreEqual( 1, m.Get() ); } } /** @ */ [Test] public void waitUntilEq5() { Monitor m = new Monitor( "a", null ); Thread t = TestHelp.delayAndStart( 200, new Thread(new ThreadStart(delegate() { m.Set( 1 ); }))); long t0 = HPTimer.Now(); m.WaitUntilEq( 1 ); double t1 = (HPTimer.Now() - t0) / 1000000.0; TestHelp.AssertRelError( 200, t1, REL_ERROR ); t.Join(); } /** @ */ [Test] public void waitUntilNotEq4() { Monitor m = new Monitor( "a", null ); Thread t = TestHelp.delayAndStart( 200, new Thread(new ThreadStart(delegate() { m.Set( 1 ); }))); long t0 = HPTimer.Now(); m.WaitUntilNotEq( null ); double t1 = (HPTimer.Now() - t0) / 1000000.0; TestHelp.AssertRelError( 200, t1, REL_ERROR ); t.Join(); } /** @ */ [Test] public void waitUntilEqAndSet4() { Monitor m = new Monitor( "a", null ); Thread t = TestHelp.delayAndStart( 200, new Thread(new ThreadStart(delegate() { m.Set( 1 ); }))); long t0 = HPTimer.Now(); m.WaitUntilEqAndSet( 1, 2 ); double t1 = (HPTimer.Now() - t0) / 1000000.0; // TODO is there a better way for choosing relative error? TestHelp.AssertRelError( 200, t1, REL_ERROR ); t.Join(); } /** @ */ [Test] public void waitUntilNotEqAndSet4() { Monitor m = new Monitor("a", null); Thread t = TestHelp.delayAndStart(200, new Thread(new ThreadStart(delegate() { m.Set(1); }))); long t0 = HPTimer.Now(); m.WaitUntilNotEqAndSet( null, 2 ); double t1 = (HPTimer.Now() - t0) / 1000000.0; TestHelp.AssertRelError( 200, t1, REL_ERROR ); t.Join(); } } }