blob: 6c4ebfa4319b6db452a57919e96e422d0ad06523 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
// ****************************************************************
// This is free software licensed under the NUnit license. You
// may obtain a copy of the license as well as information regarding
// copyright ownership at http://nunit.org/?p=license&r=2.4.
// ****************************************************************
using System;
using System.Threading;
using System.Configuration;
using System.Collections.Specialized;
namespace NUnit.Core
{
/// <summary>
/// TestRunnerThread encapsulates running a test on a thread.
/// It knows how to create the thread based on configuration
/// settings and can cancel abort the test if necessary.
/// </summary>
public class TestRunnerThread
{
#region Private Fields
/// <summary>
/// The Test runner to be used in running tests on the thread
/// </summary>
private TestRunner runner;
/// <summary>
/// The System.Threading.Thread created by the object
/// </summary>
private Thread thread;
/// <summary>
/// Collection of TestRunner settings from the config file
/// </summary>
private NameValueCollection settings;
/// <summary>
/// The EventListener interface to receive test events
/// </summary>
private NUnit.Core.EventListener listener;
/// <summary>
/// Array of test names for ues by the thread proc
/// </summary>
//private string[] testNames;
private ITestFilter filter;
/// <summary>
/// Array of returned results
/// </summary>
private TestResult[] results;
#endregion
#region Properties
/// <summary>
/// True if the thread is executing
/// </summary>
public bool IsAlive
{
get { return this.thread.IsAlive; }
}
/// <summary>
/// Array of returned results
/// </summary>
public TestResult[] Results
{
get { return results; }
}
#endregion
#region Constructor
public TestRunnerThread( TestRunner runner )
{
this.runner = runner;
this.thread = new Thread( new ThreadStart( TestRunnerThreadProc ) );
thread.IsBackground = true;
thread.Name = "TestRunnerThread";
this.settings = (NameValueCollection)
ConfigurationSettings.GetConfig( "NUnit/TestRunner" );
if ( settings != null )
{
try
{
string apartment = settings["ApartmentState"];
if ( apartment != null )
thread.ApartmentState = (ApartmentState)
System.Enum.Parse( typeof( ApartmentState ), apartment, true );
string priority = settings["ThreadPriority"];
if ( priority != null )
thread.Priority = (ThreadPriority)
System.Enum.Parse( typeof( ThreadPriority ), priority, true );
}
catch( ArgumentException ex )
{
string msg = string.Format( "Invalid configuration setting in {0}",
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile );
throw new ArgumentException( msg, ex );
}
}
}
#endregion
#region Public Methods
public void Wait()
{
if ( this.thread.IsAlive )
this.thread.Join();
}
public void Cancel()
{
this.thread.Abort(); // Request abort first
// Wake up the thread if necessary
if ( ( this.thread.ThreadState & ThreadState.WaitSleepJoin ) != 0 )
this.thread.Interrupt();
}
public void StartRun( EventListener listener )
{
StartRun( listener, TestFilter.Empty );
}
public void StartRun( EventListener listener, ITestFilter filter )
{
this.listener = listener;
this.filter = filter;
thread.Start();
}
#endregion
#region Thread Proc
/// <summary>
/// The thread proc for our actual test run
/// </summary>
private void TestRunnerThreadProc()
{
try
{
results = new TestResult[] { runner.Run(this.listener, this.filter) };
}
catch (Exception ex)
{
throw new ApplicationException("Exception in TestRunnerThread", ex);
}
}
#endregion
}
}
|