2007-05-19 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Fri, 18 May 2007 08:35:41 +0000 (08:35 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 18 May 2007 08:35:41 +0000 (08:35 -0000)
* TraceListener.cs : in TraceTransfer(), use TraceEvent() (some
  derived classes depend on this change).
* DelimitedListTraceListener.cs : implemented.

* DelimitedListTraceListenerTest.cs : new test.

* System_test.dll.sources : added DelimitedListTraceListenerTest.cs.

svn path=/trunk/mcs/; revision=77614

mcs/class/System/System.Diagnostics/ChangeLog
mcs/class/System/System.Diagnostics/DelimitedListTraceListener.cs
mcs/class/System/System.Diagnostics/TraceListener.cs
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/ChangeLog
mcs/class/System/Test/System.Diagnostics/ChangeLog
mcs/class/System/Test/System.Diagnostics/DelimitedListTraceListenerTest.cs [new file with mode: 0644]

index ec8820b219ed4fce995b3171e892e3c664c4deb9..032f2fd2115f3302b7159be062d2086332b3f937 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-19  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * TraceListener.cs : in TraceTransfer(), use TraceEvent() (some
+         derived classes depend on this change).
+       * DelimitedListTraceListener.cs : implemented.
+
 2007-05-18  Atsushi Enomoto  <atsushi@ximian.com>
 
        * EventLogPermissionAccess.cs ProcessPriorityClass.cs
index ff9ab7384cf544e855cdfade0b9d686d6bb08c17..f570d072c2dc49f55ce21b05367bd17bd9019566 100644 (file)
@@ -35,6 +35,7 @@ using System.Collections;
 using System.Diagnostics;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Text;
 
 namespace System.Diagnostics
 {
@@ -87,36 +88,70 @@ namespace System.Diagnostics
                        return attributes;
                }
 
-               [MonoTODO]
                public override void TraceData (TraceEventCache eventCache,
                                                string source, TraceEventType eventType,
                                                int id, object data)
                {
-                       throw new NotImplementedException ();
+                       TraceCore (eventCache, source, eventType, id, null, data);
                }
 
-               [MonoTODO]
                public override void TraceData (TraceEventCache eventCache,
                                                string source, TraceEventType eventType,
                                                int id, params object [] data)
                {
-                       throw new NotImplementedException ();
+                       TraceCore (eventCache, source, eventType, id, null, data);
                }
 
-               [MonoTODO]
                public override void TraceEvent (TraceEventCache eventCache,
                                                 string source, TraceEventType eventType,
                                                 int id, string message)
                {
-                       throw new NotImplementedException ();
+                       TraceCore (eventCache, source, eventType, id, message);
                }
 
-               [MonoTODO]
                public override void TraceEvent (TraceEventCache eventCache,
                                                 string source, TraceEventType eventType,
                                                 int id, string format, params object [] args)
                {
-                       throw new NotImplementedException ();
+                       TraceCore (eventCache, source, eventType, id, String.Format (format, args));
+               }
+
+               void TraceCore (TraceEventCache c, string source, TraceEventType eventType, int id, string message, params object [] data)
+               {
+                       // source, eventType, id, message?, data-comma-separated
+                       Write (String.Format ("{1}{0}{2}{0}{3}{0}{4}{0}{5}{0}{6}{0}{7}{0}{8}{0}{9}{0}{10}{0}{11}{12}",
+                              delimiter,
+                              source != null ? "\"" + source.Replace ("\"", "\"\"") + "\"": null,
+                              eventType,
+                              id,
+                              message != null ? "\"" + message.Replace ("\"", "\"\"") + "\"" : null,
+                              FormatData (data),
+                              IsTarget (c, TraceOptions.ProcessId) ? c.ProcessId.ToString () : null,
+                              IsTarget (c, TraceOptions.LogicalOperationStack) ? FormatArray (c.LogicalOperationStack, ", ") : null,
+                              IsTarget (c, TraceOptions.ThreadId) ? c.ThreadId : null,
+                              IsTarget (c, TraceOptions.DateTime) ? c.DateTime.ToString ("o") : null,
+                              IsTarget (c, TraceOptions.Timestamp) ? c.Timestamp.ToString () : null,
+                              IsTarget (c, TraceOptions.Callstack) ? c.Callstack : null,
+                              Environment.NewLine));
+               }
+
+               bool IsTarget (TraceEventCache c, TraceOptions opt)
+               {
+                       return c != null && (TraceOutputOptions & opt) != 0;
+               }
+
+               string FormatData (object [] data)
+               {
+                       if (data == null || data.Length == 0)
+                               return null;
+                       StringBuilder sb = new StringBuilder ();
+                       for (int i = 0; i < data.Length; i++) {
+                               if (data [i] != null)
+                                       sb.Append ('"').Append (data [i].ToString ().Replace ("\"", "\"\"")).Append ('"');
+                               if (i + 1 < data.Length)
+                                       sb.Append (',');
+                       }
+                       return sb.ToString ();
                }
        }
 }
index d2a9ac35b450c292b0fa62e9027872060867a68a..bab828b89c2b3009540f63d8792f3c1df6e5f824 100644 (file)
@@ -221,7 +221,7 @@ namespace System.Diagnostics {
                }
 
 #if NET_2_0
-               static string FormatArray (ICollection list, string joiner)
+               internal static string FormatArray (ICollection list, string joiner)
                {
                        string [] arr = new string [list.Count];
                        int i = 0;
@@ -292,7 +292,7 @@ namespace System.Diagnostics {
                [ComVisible (false)]
                public virtual void TraceTransfer (TraceEventCache eventCache, string source, int id, string message, Guid relatedActivityId)
                {
-                       TraceData (eventCache, source, TraceEventType.Transfer, id, String.Format ("{0}, relatedActivityId={1}", message, relatedActivityId));
+                       TraceEvent (eventCache, source, TraceEventType.Transfer, id, String.Format ("{0}, relatedActivityId={1}", message, relatedActivityId));
                }
 
                [MonoTODO ("The property exists but the values are not considered")]
index c03b3daeb2301c841d25ef499046af1efc0db910..964c96e565d465c62596df56f5549f39a6d35099 100644 (file)
@@ -143,6 +143,7 @@ System.Configuration/SettingsPropertyCollectionTest.cs
 System.Configuration/SettingsPropertyTest.cs
 System.Configuration/SettingsPropertyValueCollectionTest.cs
 System.Configuration/SettingsPropertyValueTest.cs
+System.Diagnostics/DelimitedListTraceListenerTest.cs
 System.Diagnostics/EventLogTest.cs
 System.Diagnostics/StopwatchTest.cs
 System.Diagnostics/SourceSwitchTest.cs
index e0e9024ea094ba295a8bc77b509b97c50e7a5d64..a9328d532ede033d4f2e433f3304c43b16856f94 100644 (file)
@@ -1,3 +1,7 @@
+2007-05-19  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * System_test.dll.sources : added DelimitedListTraceListenerTest.cs.
+
 2007-04-19  Atsushi Enomoto  <atsushi@ximian.com>
 
        * System.dll.sources : added XmlWriterTraceListener.cs.
index 611aa7f45c171dbd25c1d5b27f3a14fae6b7b8b3..c3068d04fa1922fea2bb03dd8e80d68442cea7b3 100644 (file)
@@ -1,3 +1,7 @@
+2007-05-19  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * DelimitedListTraceListenerTest.cs : new test.
+
 2007-05-17  Atsushi Enomoto  <atsushi@ximian.com>
 
        * SwitchesTest.cs : added tests for BooleanSwitch Value.
diff --git a/mcs/class/System/Test/System.Diagnostics/DelimitedListTraceListenerTest.cs b/mcs/class/System/Test/System.Diagnostics/DelimitedListTraceListenerTest.cs
new file mode 100644 (file)
index 0000000..678fa4b
--- /dev/null
@@ -0,0 +1,138 @@
+//
+// DelimitedListTraceListenerTest.cs
+//
+// Author:
+//     Atsushi Enomoto  <atsushi@ximian.com>
+//
+// Copyright (C) 2007 Novell, Inc.
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using NUnit.Framework;
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Threading;
+
+namespace MonoTests.System.Diagnostics
+{
+       [TestFixture]
+       public class DelimitedListTraceListenerTest
+       {
+#if NET_2_0
+               string sample1 = "sample\n";
+
+               string sample2 = ";Error;4;;;;;;;;\n";
+
+               string sample3 = "\"bulldog\";Error;5;;;;;;;;\n\"bulldog\";Error;3;\"test event arg:arg1\";;;;;;;\n";
+
+               string sample4 = ";Error;2;;;;;;;;\n;Error;3;;;;;;;;\n";
+
+               string sample5 = ";Error;7;;\"XYZ\";;;;;;\n;Error;7;;\"ABC\",\"DEF\",\"123\";;;;;;\n";
+
+               string sample6 = "\"my name is \"\"tricky\"\"\";Transfer;0;\"hoge;hoge, relatedActivityId=00000000-0000-0000-0000-000000000000\";;;;;;;\n";
+
+               string sample7 = "Fail: error summary error details\n";
+
+               [Test]
+               public void WriteLine1 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       x.WriteLine ("sample");
+                       x.Close ();
+                       Assert.AreEqual (sample1, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void TraceEvent1 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       x.TraceEvent (null, null, TraceEventType.Error, 4, null);
+                       x.Close ();
+                       Assert.AreEqual (sample2, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void TraceEvent2 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       x.TraceEvent (null, "bulldog", TraceEventType.Error, 5);
+                       x.TraceEvent (null, "bulldog", TraceEventType.Error, 3, "test event arg:{0}", "arg1");
+                       x.Close ();
+                       Assert.AreEqual (sample3, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void TraceDataWithCache1 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       Trace.CorrelationManager.StartLogicalOperation ("op1"); // ... irrelevant?
+                       TraceEventCache cc = new TraceEventCache ();
+                       x.TraceData (cc, null, TraceEventType.Error, 2);
+                       x.TraceData (cc, null, TraceEventType.Error, 3);
+                       Trace.CorrelationManager.StopLogicalOperation ();
+                       x.Close ();
+                       Assert.AreEqual (sample4, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void TraceDataWithCache2 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       TraceEventCache cc = new TraceEventCache ();
+                       x.TraceData (cc, null, TraceEventType.Error, 7, "XYZ");
+                       x.TraceData (cc, null, TraceEventType.Error, 7, "ABC", "DEF", 123);
+                       x.Close ();
+                       Assert.AreEqual (sample5, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void TraceTransfer1 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       x.TraceTransfer (null, "my name is \"tricky\"", 0, "hoge;hoge", Guid.Empty);
+                       x.Close ();
+                       Assert.AreEqual (sample6, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Fail1 ()
+               {
+                       StringWriter sw = new StringWriter ();
+                       DelimitedListTraceListener x = new DelimitedListTraceListener (sw);
+                       TraceEventCache cc = new TraceEventCache ();
+                       x.Fail ("error summary", "error details");
+                       x.Close ();
+                       Assert.AreEqual (sample7, sw.ToString ().Replace ("\r\n", "\n"));
+               }
+#endif
+       }
+}
+