2010-06-03 Jb Evain <jbevain@novell.com>
[mcs.git] / nunit24 / NUnitCore / core / RemoteTestRunner.cs
blobb4a69c5bec1d9b8a838bb221e80aa930b13021f9
1 // ****************************************************************
2 // Copyright 2007, Charlie Poole
3 // This is free software licensed under the NUnit license. You may
4 // obtain a copy of the license at http://nunit.org/?p=license&r=2.4
5 // ****************************************************************
7 namespace NUnit.Core
9 using System.Collections;
10 using System;
12 /// <summary>
13 /// RemoteTestRunner is tailored for use as the initial runner to
14 /// receive control in a remote domain. It provides isolation for the return
15 /// value by using a ThreadedTestRunner and for the events through use of
16 /// an EventPump.
17 /// </summary>
18 public class RemoteTestRunner : ProxyTestRunner
20 #region Constructors
21 public RemoteTestRunner() : this( 0 ) { }
23 public RemoteTestRunner( int runnerID ) : base( runnerID ) { }
24 #endregion
26 #region Method Overrides
27 public override bool Load(TestPackage package)
29 NTrace.Info( "Loading test package " + package.Name );
31 // Initialize ExtensionHost if not already done
32 if ( !CoreExtensions.Host.Initialized )
33 CoreExtensions.Host.InitializeService();
35 // Delayed creation of downstream runner allows us to
36 // use a different runner type based on the package
37 bool useThreadedRunner = package.GetSetting( "UseThreadedRunner", true );
39 TestRunner runner = new SimpleTestRunner( this.runnerID );
40 if ( useThreadedRunner )
41 runner = new ThreadedTestRunner( runner );
43 this.TestRunner = runner;
45 return base.Load (package);
48 public override TestResult Run( EventListener listener )
50 return Run( listener, TestFilter.Empty );
53 public override TestResult Run( EventListener listener, ITestFilter filter )
55 NTrace.Debug( "Running test synchronously" );
56 QueuingEventListener queue = new QueuingEventListener();
58 StartTextCapture( queue );
60 using( EventPump pump = new EventPump( listener, queue.Events, true ) )
62 pump.Start();
63 return base.Run( queue, filter );
67 public override void BeginRun( EventListener listener )
69 BeginRun( listener, TestFilter.Empty );
72 public override void BeginRun( EventListener listener, ITestFilter filter )
74 NTrace.Debug( "Running test asynchronously" );
75 QueuingEventListener queue = new QueuingEventListener();
77 StartTextCapture( queue );
79 EventPump pump = new EventPump( listener, queue.Events, true);
80 pump.Start(); // Will run till RunFinished is received
81 // TODO: Make sure the thread is cleaned up if we abort the run
83 base.BeginRun( queue, filter );
86 private void StartTextCapture( EventListener queue )
88 TestContext.Out = new EventListenerTextWriter( queue, TestOutputType.Out );
89 TestContext.Error = new EventListenerTextWriter( queue, TestOutputType.Error );
90 TestContext.TraceWriter = new EventListenerTextWriter( queue, TestOutputType.Trace );
91 TestContext.Tracing = true;
92 TestContext.LogWriter = new EventListenerTextWriter( queue, TestOutputType.Log );
93 TestContext.Logging = true;
95 #endregion