Hi!
Here are the test for System.Threading.Thread.
The problem is that this test doesn't run well with mono, when running
it in mono, it gets a Segmentation Fault (as described in:
http://bugzilla.ximian.com/show_bug.cgi?id=34323 ), or it hangs mono.
Somebody can add this to the CVS (i haven't cvs account).
The patch is attached.
The "ThreadTest.cs" and "AllTests.cs" are in a new directory called
System.Threading (mcs/class/corlib/Test/System.Threading) that should be
created.
Best wishes.
--
Eduardo Garcia Cebollero <[EMAIL PROTECTED]>
Index: AllTests.cs
===================================================================
RCS file: /mono/mcs/class/corlib/Test/AllTests.cs,v
retrieving revision 1.17
diff -u -r1.17 AllTests.cs
--- AllTests.cs 28 Oct 2002 03:10:23 -0000 1.17
+++ AllTests.cs 21 Nov 2002 02:39:38 -0000
@@ -32,6 +32,7 @@
suite.AddTest(System.Resources.AllTests.Suite);
suite.AddTest(System.Runtime.Serialization.AllTests.Suite);
suite.AddTest(System.Runtime.CompilerServices.AllTests.Suite);
+ suite.AddTest(System.Threading.AllTests.Suite);
// suite.AddTest(System.Security.Policy.AllTests.Suite);
return suite;
}
Index: corlib_linux_test.args
===================================================================
RCS file: /mono/mcs/class/corlib/Test/corlib_linux_test.args,v
retrieving revision 1.12
diff -u -r1.12 corlib_linux_test.args
--- corlib_linux_test.args 17 Nov 2002 21:55:50 -0000 1.12
+++ corlib_linux_test.args 21 Nov 2002 02:39:38 -0000
@@ -122,3 +122,5 @@
System.Text/ASCIIEncodingTest.cs
System.Text/AllTests.cs
System.Text/StringBuilderTest.cs
+System.Threading/AllTests.cs
+System.Threading/ThreadTest.cs
// Testsuite.System.AllSystemTests.cs
//
// Mario Martinez ([EMAIL PROTECTED])
//
// (C) Ximian, Inc. http://www.ximian.com
//
using System;
using NUnit.Framework;
namespace MonoTests.System.Threading {
/// <summary>
/// Combines all available unit tests into one test suite.
/// </summary>
public class AllTests : TestCase {
public AllTests(string name) : base(name) {}
public static ITest Suite
{
get
{
TestSuite suite = new TestSuite();
suite.AddTest(ThreadTest.Suite);
return suite;
}
}
}
}
// ThreadTest.cs - NUnit Test Cases for the System.Threading.Thread class
//
// Eduardo Garcia Cebollero ([EMAIL PROTECTED])
//
// (C) Eduardo Garcia Cebollero.
// (C) Ximian, Inc. http://www.ximian.com
//
using NUnit.Framework;
using System;
using System.Threading;
namespace MonoTests.System.Threading
{
public class ThreadTest : TestCase
{
public ThreadTest () :
base ("MonoTests.System.Threading.ThreadTest testsuite") {}
public ThreadTest (string name) : base (name) {}
protected override void SetUp () {}
public static ITest Suite
{
get
{
return new TestSuite (typeof (ThreadTest));
}
}
//Some Classes to test as threads
private class C1Test
{
public int cnt;
public Thread thread1;
public bool endm1;
public bool endm2;
public C1Test()
{
thread1 = (Thread)null;
this.cnt = 0;
endm1 = endm2 = false;
}
public void TestMethod()
{
while (cnt < 10)
{
cnt++;
}
endm1 = true;
}
public void TestMethod2()
{
if (!(thread1==(Thread)null) )
{
thread1.Join();
}
endm2 = true;
}
}
private class C2Test
{
public int cnt;
public bool run = false;
public C2Test()
{
this.cnt = 0;
}
public void TestMethod()
{
run = true;
while (true)
{
if (cnt < 1000)
cnt++;
else
cnt = 0;
}
}
}
private class C3Test
{
public C1Test sub_class;
public Thread sub_thread;
public C3Test()
{
sub_class = new C1Test();
sub_thread = new Thread(new
ThreadStart(sub_class.TestMethod));
}
public void TestMethod1()
{
sub_thread.Start();
sub_thread.Abort();
}
}
private class C4Test
{
public C1Test class1;
public C1Test class2;
public Thread thread1;
public Thread thread2;
public bool T1ON ;
public bool T2ON ;
public C4Test()
{
T1ON = false;
T2ON = false;
class1 = new C1Test();
class2 = new C1Test();
thread1 = new Thread(new
ThreadStart(class1.TestMethod));
thread2 = new Thread(new
ThreadStart(class2.TestMethod));
}
public void TestMethod1()
{
thread1.Start();
while (!thread1.IsAlive);
T1ON = true;
thread2.Start();
while (!thread2.IsAlive);
T2ON = true;
thread2.Abort();
while (thread2.IsAlive);
T2ON = false;
thread1.Abort();
while (thread2.IsAlive);
T1ON = false;
}
public void TestMethod2()
{
thread1.Start();
thread1.Join();
}
}
public void TestCtor1()
{
C1Test test1 = new C1Test();
try
{
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
}
catch (Exception e)
{
Fail ("#01 Unexpected Exception Thrown: " + e.ToString
());
}
}
//TODO: Test to make a constructor in a thread :)
public void TestStart()
{
{
C1Test test1 = new C1Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
try
{
TestThread.Start();
}
catch (Exception e)
{
Fail ("#12 Unexpected Exception Thrown: " + e.ToString
());
}
TestThread.Join();
AssertEquals("#13 Thread Not started: ", 10,test1.cnt);
}
{
bool errorThrown = false;
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
TestThread.Start();
TestThread.Abort();
try
{
TestThread.Start();
}
catch(ThreadStateException)
{
errorThrown = true;
}
Assert ("#14 no ThreadStateException trown", errorThrown);
}
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
TestThread.Start();
while(!test1.run);
bool started = (TestThread.ThreadState == ThreadState.Running);
AssertEquals("#15 Thread Is not in the correct state: ",
started , test1.run);
}
}
public void TestApartment()
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
ApartmentState before = TestThread.ApartmentState;
TestThread.Start();
while(!TestThread.IsAlive);
ApartmentState after = TestThread.ApartmentState;
TestThread.Abort();
AssertEquals("#21 Apartment State Changed when not
needed",before,after);
}
public void TestApartmentState()
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
ApartmentState before = TestThread.ApartmentState;
TestThread.Start();
while(!TestThread.IsAlive);
ApartmentState after = TestThread.ApartmentState;
TestThread.Abort();
AssertEquals("#31 Apartment State Changed when not needed:
",before,after);
}
public void TestPriority()
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
ThreadPriority after = TestThread.Priority;
TestThread.Start();
while(!TestThread.IsAlive);
ThreadPriority before = TestThread.Priority;
TestThread.Abort();
AssertEquals("#41 Priority Changed when not needed:
",before,after);
}
public void TestIsBackground()
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
TestThread.Start();
while(!TestThread.IsAlive);
bool state = TestThread.IsBackground;
TestThread.Abort();
AssertEquals("#51 IsBackground not set at the default state:
", state, false);
}
public void TestName()
{
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod));
TestThread.Start();
while(!TestThread.IsAlive);
string name = TestThread.Name;
AssertEquals("#61 Name set when mustn't be set: ", name,
(string)null);
string newname = "Testing....";
TestThread.Name = newname;
AssertEquals("#62 Name not set when must be set:
",TestThread.Name,newname);
TestThread.Abort();
}
public void TestNestedThreads1()
{
C3Test test1 = new C3Test();
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod1));
try
{
TestThread.Start();
while(!TestThread.IsAlive);
TestThread.Abort();
}
catch(Exception e)
{
Fail("#71 Unexpected Exception" + e.Message);
}
}
public void TestNestedThreads2()
{
C4Test test1 = new C4Test();
test1.thread1.Start();
test1.thread1.Abort();
while(test1.thread1.IsAlive);
Thread TestThread = new Thread(new
ThreadStart(test1.TestMethod1));
try
{
TestThread.Start();
TestThread.Abort();
}
catch(Exception e)
{
Fail("#81 Unexpected Exception" + e.ToString());
}
}
public void TestJoin1()
{
C1Test test1 = new C1Test();
C1Test test2 = new C1Test();
Thread thread1 = new Thread(new ThreadStart(test1.TestMethod));
Thread thread2 = new Thread(new
ThreadStart(test1.TestMethod2));
try
{
thread1.Start();
thread2.Start();
thread2.Join();
}
catch(Exception e)
{
Fail("#91 Unexpected Exception " + e.ToString());
}
}
}
}