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 // ****************************************************************
9 using System
.Collections
;
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
18 public class RemoteTestRunner
: ProxyTestRunner
21 public RemoteTestRunner() : this( 0 ) { }
23 public RemoteTestRunner( int runnerID
) : base( runnerID
) { }
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 ) )
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;