Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

237 lines
5.7 KiB
C#

//
// TraceTest.cs - NUnit Test Cases for System.Diagnostics.Trace
//
// Authors:
// Jonathan Pryor (jonpryor@vt.edu)
// Martin Willemoes Hansen (mwh@sysrq.dk)
//
// (C) Jonathan Pryor
// (C) 2003 Martin Willemoes Hansen
//
#if !MOBILE
// We want tracing enabled, so...
#define TRACE
using NUnit.Framework;
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;
namespace MonoTests.System.Diagnostics {
[TestFixture]
public class TraceTest {
private StringWriter buffer;
private TraceListener listener;
[SetUp]
public void GetReady ()
{
// We don't want to deal with the default listener, which can send the
// output to various places (Debug stream, Console.Out, ...)
// Trace.Listeners.Remove ("Default");
buffer = new StringWriter ();
listener = new TextWriterTraceListener (buffer, "TestOutput");
Trace.Listeners.Clear ();
Trace.Listeners.Add (listener);
Trace.AutoFlush = true;
}
[TearDown]
public void Clear ()
{
// Trace.Listeners.Add (new DefaultTraceListener ());
Trace.Listeners.Remove (listener);
}
// Make sure that when we get the output we expect....
[Test]
public void Tracing ()
{
Trace.IndentLevel = 0;
Trace.IndentSize = 4;
string value =
"Entering Main" + Environment.NewLine +
"Exiting Main" + Environment.NewLine;
Trace.WriteLine ("Entering Main");
Trace.WriteLine ("Exiting Main");
Assert.AreEqual (value, buffer.ToString (), "#Tr01");
}
// Make sure we get the output we expect in the presence of indenting...
[Test]
public void Indent ()
{
Trace.IndentLevel = 0;
Trace.IndentSize = 4;
string value =
"List of errors:" + Environment.NewLine +
" Error 1: File not found" + Environment.NewLine +
" Error 2: Directory not found" + Environment.NewLine +
"End of list of errors" + Environment.NewLine;
Trace.WriteLine ("List of errors:");
Trace.Indent ();
Assert.AreEqual (1, Trace.IndentLevel);
Trace.WriteLine ("Error 1: File not found");
Trace.WriteLine ("Error 2: Directory not found");
Trace.Unindent ();
Assert.AreEqual (0, Trace.IndentLevel);
Trace.WriteLine ("End of list of errors");
Assert.AreEqual (value, buffer.ToString(), "#In01");
}
// Make sure that TraceListener properties (IndentLevel, IndentSize) are
// modified when the corresponding Trace properties are changed.
[Test]
public void AddedTraceListenerProperties ()
{
TraceListener t1 = new TextWriterTraceListener (Console.Out);
TraceListener t2 = new TextWriterTraceListener (Console.Error);
Trace.Listeners.Add(t1);
Trace.Listeners.Add(t2);
const int ExpectedSize = 5;
const int ExpectedLevel = 2;
Trace.IndentSize = ExpectedSize;
Trace.IndentLevel = ExpectedLevel;
foreach (TraceListener t in Trace.Listeners) {
string ids = "#TATLP-S-" + t.Name;
string idl = "#TATLP-L-" + t.Name;
Assert.AreEqual (ExpectedSize, t.IndentSize, ids);
Assert.AreEqual (ExpectedLevel, t.IndentLevel, idl);
}
Trace.Listeners.Remove(t1);
Trace.Listeners.Remove(t2);
}
// Make sure that the TraceListener properties (IndentLevel, IndentSize)
// are properly modified when the TraceListener is added to the
// collection.
[Test]
public void Listeners_Add_Values()
{
const int ExpectedLevel = 0;
const int ExpectedSize = 4;
Trace.IndentLevel = ExpectedLevel;
Trace.IndentSize = ExpectedSize;
TraceListener tl = new TextWriterTraceListener(Console.Out);
tl.IndentLevel = 2*ExpectedLevel;
tl.IndentSize = 2*ExpectedSize;
Trace.Listeners.Add(tl);
// Assertion.Assert that the listener we added has been set to the correct indent
// level.
Assert.AreEqual (ExpectedLevel, tl.IndentLevel, "#LATL-L");
Assert.AreEqual (ExpectedSize, tl.IndentSize, "#LATL-S");
// Assertion.Assert that all listeners in the collection have the same level.
foreach (TraceListener t in Trace.Listeners)
{
string idl = "#LATL-L:" + t.Name;
string ids = "#LATL-S:" + t.Name;
Assert.AreEqual (ExpectedLevel, t.IndentLevel, idl);
Assert.AreEqual (ExpectedSize, t.IndentSize, ids);
}
}
// IndentSize, IndentLevel are thread-static
class MyTraceListener : TraceListener
{
public int Writes;
public int WriteLines;
public MyTraceListener ()
: base ("mt-test")
{
}
public override void Write (string msg)
{
++Writes;
}
public override void WriteLine (string msg)
{
++WriteLines;
}
}
class MultiThreadModify
{
public MyTraceListener listener = new MyTraceListener ();
public const int MaxIterations = 10000;
public String Exception = null;
public MultiThreadModify ()
{
Trace.Listeners.Add (listener);
}
public void Write ()
{
try {
for (int i = 0; i < MaxIterations; ++i)
Trace.WriteLine ("message " + i + "... ");
}
catch (Exception e) {
Exception = string.Format (
"#MTMW: Exception emitted from Trace.WriteLine: {0}", e);
}
}
public void Remove ()
{
try {
Trace.Listeners.Remove (listener);
}
catch (Exception e) {
Exception = string.Format (
"#MTMR: Exception emitted from Trace.Listeners.Remove: {0}", e);
}
}
}
[Test]
[Category ("NotWorking")]
// Is this even valid !?!?!?!
public void TestMultiThreadModify ()
{
MultiThreadModify m = new MultiThreadModify ();
Thread t1 = new Thread (new ThreadStart (m.Write));
Thread t2 = new Thread (new ThreadStart (m.Remove));
t1.Start ();
t2.Start ();
t1.Join ();
t2.Join ();
Assert.IsTrue (m.Exception == null, m.Exception);
Assert.AreEqual (MultiThreadModify.MaxIterations, m.listener.WriteLines,
"#tmtm: listener was removed before iterations were completed");
}
}
}
#endif