public void TracingEventListenerDoesNotDeadlock() { QueuingEventListener upstreamListener = new QueuingEventListener(); EventQueue upstreamListenerQueue = upstreamListener.Events; // Install a TraceListener sending TestOutput events to the upstreamListener. // This simulates RemoteTestRunner.StartTextCapture, where TestContext installs such a TraceListener. TextWriter traceWriter = new EventListenerTextWriter(upstreamListener, TestOutputType.Trace); const string TraceListenerName = "TracingEventListenerDoesNotDeadlock"; TraceListener feedingTraceToUpstreamListener = new TextWriterTraceListener(traceWriter, TraceListenerName); try { Trace.Listeners.Add(feedingTraceToUpstreamListener); // downstreamListenerToTrace simulates an EventListener installed e.g. by an Addin, // which may call Trace within the EventListener methods: TracingEventListener downstreamListenerToTrace = new TracingEventListener(); using (EventPump pump = new EventPump(downstreamListenerToTrace, upstreamListenerQueue, false)) { pump.Name = "TracingEventListenerDoesNotDeadlock"; pump.Start(); const int Repetitions = 10; for (int i = 0; i < Repetitions; i++) { foreach (Event e in events) { Trace.WriteLine("Before sending {0} event.", e.GetType().Name); e.Send(upstreamListener); Trace.WriteLine("After sending {0} event.", e.GetType().Name); } } } } finally { Trace.Listeners.Remove(TraceListenerName); feedingTraceToUpstreamListener.Dispose(); } }
public void TracingEventListenerDoesNotDeadlock() { QueuingEventListener upstreamListener = new QueuingEventListener(); EventQueue upstreamListenerQueue = upstreamListener.Events; // Install a TraceListener sending TestOutput events to the upstreamListener. // This simulates RemoteTestRunner.StartTextCapture, where TestContext installs such a TraceListener. TextWriter traceWriter = new EventListenerTextWriter(upstreamListener, TestOutputType.Trace); const string TraceListenerName = "TracingEventListenerDoesNotDeadlock"; TraceListener feedingTraceToUpstreamListener = new TextWriterTraceListener(traceWriter, TraceListenerName); try { Trace.Listeners.Add(feedingTraceToUpstreamListener); // downstreamListenerToTrace simulates an EventListener installed e.g. by an Addin, // which may call Trace within the EventListener methods: TracingEventListener downstreamListenerToTrace = new TracingEventListener(); using (EventPump pump = new EventPump(downstreamListenerToTrace, upstreamListenerQueue, false)) { pump.Name = "TracingEventListenerDoesNotDeadlock"; pump.Start(); const int Repetitions = 10; for (int i = 0; i < Repetitions; i++) { foreach (Event e in events) { Trace.WriteLine("Before sending {0} event.", e.GetType().Name); e.Send(upstreamListener); Trace.WriteLine("After sending {0} event.", e.GetType().Name); } } } } finally { Trace.Listeners.Remove(TraceListenerName); feedingTraceToUpstreamListener.Dispose(); } }