EventLogger.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //
  2. // Copyright (c) 2007 Novell, Inc.
  3. //
  4. // Authors:
  5. // Rolf Bjarne Kvinge ([email protected])
  6. //
  7. using System;
  8. using System.Text;
  9. using System.IO;
  10. using NUnit.Framework;
  11. using System.Windows.Forms;
  12. using System.ComponentModel;
  13. using System.Drawing;
  14. using System.Collections;
  15. using System.Reflection;
  16. using System.Reflection.Emit;
  17. namespace MonoTests.System.Windows.Forms
  18. {
  19. public class EventLogger
  20. {
  21. public class EventLog : ArrayList
  22. {
  23. public bool PrintAdds = false;
  24. new public int Add (object obj)
  25. {
  26. if (PrintAdds)
  27. Console.WriteLine ("{1} EventLog: {0}", obj, DateTime.Now.ToLongTimeString ());
  28. return base.Add (obj);
  29. }
  30. }
  31. private EventLog log;
  32. private object instance;
  33. public bool PrintAdds {
  34. get { return log.PrintAdds; }
  35. set { log.PrintAdds = value; }
  36. }
  37. // Tests if all the names in Names are in log with the order given in Names.
  38. public bool ContainsEventsOrdered (params string [] Names)
  39. {
  40. if (Names.Length == 0)
  41. return true;
  42. int n = 0;
  43. for (int i = 0; i < log.Count; i++) {
  44. if ((string) log [i] == Names [n]) {
  45. n++;
  46. if (n == Names.Length)
  47. return true;
  48. }
  49. }
  50. if (n == Names.Length) {
  51. return true;
  52. } else {
  53. Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");
  54. return false;
  55. }
  56. }
  57. public int CountEvents (string Name)
  58. {
  59. int count = 0;
  60. foreach (string str in log) {
  61. if (Name.Equals (str)) {
  62. count++;
  63. }
  64. }
  65. return count;
  66. }
  67. public bool EventRaised (string Name)
  68. {
  69. return log.Contains (Name);
  70. }
  71. public int EventsRaised {
  72. get {
  73. return log.Count;
  74. }
  75. }
  76. public string EventsJoined ()
  77. {
  78. return EventsJoined (";");
  79. }
  80. public string EventsJoined (string separator)
  81. {
  82. return string.Join (";", ToArray ());
  83. }
  84. public void Clear ()
  85. {
  86. log.Clear ();
  87. }
  88. public string [] ToArray ()
  89. {
  90. string [] result = new string [log.Count];
  91. log.CopyTo (result);
  92. return result;
  93. }
  94. public EventLogger (object item)
  95. {
  96. if (item == null) {
  97. throw new ArgumentNullException ("item");
  98. }
  99. log = new EventLog ();
  100. Type itemType = item.GetType ();
  101. AssemblyName name = new AssemblyName ();
  102. name.Name = "EventLoggerAssembly";
  103. AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
  104. ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
  105. Type ListType = log.GetType ();
  106. TypeBuilder logType = module.DefineType ("Logger");
  107. FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
  108. ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
  109. logCtor.DefineParameter (1, ParameterAttributes.None, "test");
  110. logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
  111. ILGenerator logIL = logCtor.GetILGenerator ();
  112. logIL.Emit (OpCodes.Ldarg_0);
  113. logIL.Emit (OpCodes.Ldarg_1);
  114. logIL.Emit (OpCodes.Stfld, logField);
  115. foreach (EventInfo Event in itemType.GetEvents ()) {
  116. ILGenerator il;
  117. MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
  118. MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
  119. method.DefineParameter (1, ParameterAttributes.None, "test");
  120. method.DefineParameter (2, ParameterAttributes.None, "test2");
  121. il = method.GetILGenerator ();
  122. il.Emit (OpCodes.Ldarg_0);
  123. il.Emit (OpCodes.Ldfld, logField);
  124. il.Emit (OpCodes.Ldstr, Event.Name);
  125. il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
  126. il.Emit (OpCodes.Pop);
  127. il.Emit (OpCodes.Ret);
  128. logIL.Emit (OpCodes.Ldarg_2);
  129. logIL.Emit (OpCodes.Ldarg_0);
  130. logIL.Emit (OpCodes.Dup);
  131. logIL.Emit (OpCodes.Ldvirtftn, method);
  132. logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
  133. logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
  134. }
  135. logIL.Emit (OpCodes.Ret);
  136. Type builtLogType = logType.CreateType ();
  137. instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
  138. TestHelper.RemoveWarning (instance);
  139. //assembly.Save ("EventLoggerAssembly.dll");
  140. }
  141. }
  142. }