2 using System.Collections.Generic;
3 using System.Threading;
5 using System.Reflection;
7 using Mono.Debugger.Soft;
8 using Diag = System.Diagnostics;
11 using NUnit.Framework;
13 #pragma warning disable 0219
16 public class DebuggerTests
19 MethodMirror entry_point;
20 StepEventRequest step_req;
22 void AssertThrows<ExType> (Action del) where ExType : Exception {
30 Assert.IsTrue (thrown);
33 // No other way to pass arguments to the tests ?
34 public static bool listening = Environment.GetEnvironmentVariable ("DBG_SUSPEND") != null;
35 public static string runtime = Environment.GetEnvironmentVariable ("DBG_RUNTIME");
36 public static string agent_args = Environment.GetEnvironmentVariable ("DBG_AGENT_ARGS");
38 void Start (string[] args) {
40 var pi = new Diag.ProcessStartInfo ();
43 pi.FileName = runtime;
46 pi.Arguments = String.Join (" ", args);
47 vm = VirtualMachineManager.Launch (pi, new LaunchOptions { AgentArgs = agent_args });
49 Console.WriteLine ("Listening...");
50 vm = VirtualMachineManager.Listen (new IPEndPoint (IPAddress.Any, 10000));
53 vm.EnableEvents (EventType.AssemblyLoad);
55 Event vmstart = vm.GetNextEvent ();
56 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
65 /* Find out the entry point */
67 e = vm.GetNextEvent ();
69 if (e is AssemblyLoadEvent) {
70 AssemblyLoadEvent ae = (AssemblyLoadEvent)e;
71 entry_point = ae.Assembly.EntryPoint;
72 if (entry_point != null)
80 BreakpointEvent run_until (string name) {
82 MethodMirror m = entry_point.DeclaringType.GetMethod (name);
84 vm.SetBreakpoint (m, 0);
90 e = vm.GetNextEvent ();
91 if (e is BreakpointEvent)
95 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
96 Assert.AreEqual (m, (e as BreakpointEvent).Method);
98 return (e as BreakpointEvent);
101 Event single_step (ThreadMirror t) {
102 var req = vm.CreateStepRequest (t);
106 Event e = vm.GetNextEvent ();
107 Assert.IsTrue (e is StepEvent);
114 void check_arg_val (StackFrame frame, int pos, Type type, object eval) {
115 object val = frame.GetArgument (pos);
116 Assert.IsTrue (val is PrimitiveValue);
117 object v = (val as PrimitiveValue).Value;
118 Assert.AreEqual (type, v.GetType ());
120 Assert.IsTrue (Math.Abs ((float)eval - (float)v) < 0.0001);
121 else if (eval is double)
122 Assert.IsTrue (Math.Abs ((double)eval - (double)v) < 0.0001);
124 Assert.AreEqual (eval, v);
127 void AssertValue (object expected, object val) {
128 if (expected is string) {
129 Assert.IsTrue (val is StringMirror);
130 Assert.AreEqual (expected, (val as StringMirror).Value);
131 } else if (val is StructMirror && (val as StructMirror).Type.Name == "IntPtr") {
132 AssertValue (expected, (val as StructMirror).Fields [0]);
134 Assert.IsTrue (val is PrimitiveValue);
135 Assert.AreEqual (expected, (val as PrimitiveValue).Value);
140 public void SetUp () {
141 Start (new string [] { "dtest-app.exe" });
145 public void TearDown () {
149 if (step_req != null)
154 Event e = vm.GetNextEvent ();
156 if (e is VMDeathEvent)
164 public void SimpleBreakpoint () {
167 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp1");
168 Assert.IsNotNull (m);
170 vm.SetBreakpoint (m, 0);
174 e = vm.GetNextEvent ();
175 Assert.AreEqual (EventType.Breakpoint, e.EventType);
176 Assert.IsTrue (e is BreakpointEvent);
177 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
180 AssertThrows<ArgumentException> (delegate {
182 vm.SetBreakpoint (m, 1);
187 public void BreakpointsSameLocation () {
190 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp2");
191 Assert.IsNotNull (m);
193 vm.SetBreakpoint (m, 0);
194 vm.SetBreakpoint (m, 0);
198 e = vm.GetNextEvent ();
199 Assert.IsTrue (e is BreakpointEvent);
200 Assert.AreEqual (m, (e as BreakpointEvent).Method);
202 e = vm.GetNextEvent ();
203 Assert.IsTrue (e is BreakpointEvent);
204 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
208 public void BreakpointAlreadyJITted () {
209 Event e = run_until ("bp1");
211 /* Place a breakpoint on bp3 */
212 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp3");
213 Assert.IsNotNull (m);
214 vm.SetBreakpoint (m, 0);
216 /* Same with generic instances */
217 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp7");
218 Assert.IsNotNull (m2);
219 vm.SetBreakpoint (m2, 0);
223 e = vm.GetNextEvent ();
224 Assert.AreEqual (EventType.Breakpoint, e.EventType);
225 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
229 /* Non-shared instance */
230 e = vm.GetNextEvent ();
231 Assert.AreEqual (EventType.Breakpoint, e.EventType);
232 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
236 /* Shared instance */
237 e = vm.GetNextEvent ();
238 Assert.AreEqual (EventType.Breakpoint, e.EventType);
239 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
243 public void ClearBreakpoint () {
246 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
247 Assert.IsNotNull (m);
248 EventRequest req1 = vm.SetBreakpoint (m, 0);
249 EventRequest req2 = vm.SetBreakpoint (m, 0);
251 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
252 Assert.IsNotNull (m2);
253 vm.SetBreakpoint (m2, 0);
258 e = vm.GetNextEvent ();
259 Assert.AreEqual (EventType.Breakpoint, e.EventType);
260 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
261 e = vm.GetNextEvent ();
262 Assert.AreEqual (EventType.Breakpoint, e.EventType);
263 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
265 /* Clear one of them */
270 e = vm.GetNextEvent ();
271 Assert.AreEqual (EventType.Breakpoint, e.EventType);
272 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
274 /* Clear the other */
279 e = vm.GetNextEvent ();
280 Assert.AreEqual (EventType.Breakpoint, e.EventType);
281 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
285 public void ClearAllBreakpoints () {
288 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
289 Assert.IsNotNull (m);
290 vm.SetBreakpoint (m, 0);
292 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
293 Assert.IsNotNull (m2);
294 vm.SetBreakpoint (m2, 0);
296 vm.ClearAllBreakpoints ();
300 e = vm.GetNextEvent ();
301 Assert.IsTrue (!(e is BreakpointEvent));
302 if (e is VMDeathEvent)
307 public void BreakpointOnGShared () {
310 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp6");
311 Assert.IsNotNull (m);
313 vm.SetBreakpoint (m, 0);
317 e = vm.GetNextEvent ();
318 Assert.AreEqual (EventType.Breakpoint, e.EventType);
319 Assert.IsTrue (e is BreakpointEvent);
320 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
324 public void SingleStepping () {
325 Event e = run_until ("single_stepping");
327 var req = vm.CreateStepRequest (e.Thread);
334 e = vm.GetNextEvent ();
335 Assert.IsTrue (e is StepEvent);
336 Assert.AreEqual ("ss1", (e as StepEvent).Method.Name);
340 e = vm.GetNextEvent ();
341 Assert.IsTrue (e is StepEvent);
342 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
344 // Change to step over
346 req.Depth = StepDepth.Over;
351 e = vm.GetNextEvent ();
352 Assert.IsTrue (e is StepEvent);
353 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
355 // Change to step into
357 req.Depth = StepDepth.Into;
362 e = vm.GetNextEvent ();
363 Assert.IsTrue (e is StepEvent);
364 Assert.AreEqual ("ss3", (e as StepEvent).Method.Name);
366 // Change to step out
368 req.Depth = StepDepth.Out;
371 // Step back into single_stepping
373 e = vm.GetNextEvent ();
374 Assert.IsTrue (e is StepEvent);
375 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
377 // Change to step into
379 req.Depth = StepDepth.Into;
382 // Step into ss3_2 ()
384 e = vm.GetNextEvent ();
385 Assert.IsTrue (e is StepEvent);
386 Assert.AreEqual ("ss3_2", (e as StepEvent).Method.Name);
388 // Change to step over
390 req.Depth = StepDepth.Over;
393 // Step over ss3_2_2 ()
395 e = vm.GetNextEvent ();
396 Assert.IsTrue (e is StepEvent);
397 Assert.AreEqual ("ss3_2", (e as StepEvent).Method.Name);
399 // Recreate the request
403 // Step back into single_stepping () with the new request
405 e = vm.GetNextEvent ();
406 Assert.IsTrue (e is StepEvent);
407 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
409 // Change to step into
411 req.Depth = StepDepth.Into;
416 e = vm.GetNextEvent ();
417 Assert.IsTrue (e is StepEvent);
418 Assert.AreEqual ("ss4", (e as StepEvent).Method.Name);
420 // Change to StepSize.Line
422 req.Depth = StepDepth.Over;
423 req.Size = StepSize.Line;
426 // Step over ss1 (); ss1 ();
428 e = vm.GetNextEvent ();
429 Assert.IsTrue (e is StepEvent);
433 req.Depth = StepDepth.Into;
437 e = vm.GetNextEvent ();
438 Assert.IsTrue (e is StepEvent);
439 Assert.AreEqual ("ss2", (e as StepEvent).Method.Name);
444 e = run_until ("ss5");
446 // Add an assembly filter
447 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
450 // Step into is_even, skipping the linq stuff
452 e = vm.GetNextEvent ();
453 Assert.IsTrue (e is StepEvent);
454 Assert.AreEqual ("is_even", (e as StepEvent).Method.Name);
456 // FIXME: Check that single stepping works with lock (obj)
461 e = run_until ("ss6");
463 req = vm.CreateStepRequest (e.Thread);
464 req.Depth = StepDepth.Over;
467 // Check that single stepping works in out-of-line bblocks
469 e = vm.GetNextEvent ();
470 Assert.IsTrue (e is StepEvent);
472 e = vm.GetNextEvent ();
473 Assert.IsTrue (e is StepEvent);
474 Assert.AreEqual ("ss6", (e as StepEvent).Method.Name);
480 public void MethodEntryExit () {
481 run_until ("single_stepping");
483 var req1 = vm.CreateMethodEntryRequest ();
484 var req2 = vm.CreateMethodExitRequest ();
490 Event e = vm.GetNextEvent ();
491 Assert.IsTrue (e is MethodEntryEvent);
492 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
495 e = vm.GetNextEvent ();
496 Assert.IsTrue (e is MethodExitEvent);
497 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
504 public void CountFilter () {
505 run_until ("single_stepping");
507 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
508 Assert.IsNotNull (m2);
509 vm.SetBreakpoint (m2, 0);
511 var req1 = vm.CreateMethodEntryRequest ();
515 // Enter ss2, ss1 is skipped
517 Event e = vm.GetNextEvent ();
518 Assert.IsTrue (e is MethodEntryEvent);
519 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
521 // Breakpoint on ss3, the entry event is no longer reported
523 e = vm.GetNextEvent ();
524 Assert.IsTrue (e is BreakpointEvent);
530 public void Arguments () {
533 var e = run_until ("arg1");
535 StackFrame frame = e.Thread.GetFrames () [0];
537 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
538 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
539 check_arg_val (frame, 2, typeof (bool), true);
540 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
541 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
542 check_arg_val (frame, 5, typeof (char), 'F');
543 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
544 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
545 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
546 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
547 check_arg_val (frame, 10, typeof (float), 1.2345f);
548 check_arg_val (frame, 11, typeof (double), 6.78910);
550 e = run_until ("arg2");
552 frame = e.Thread.GetFrames () [0];
555 val = frame.GetArgument (0);
556 AssertValue ("FOO", val);
557 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
560 val = frame.GetArgument (1);
561 AssertValue (null, val);
564 val = frame.GetArgument (2);
565 AssertValue ("BLA", val);
568 val = frame.GetArgument (3);
569 AssertValue (42, val);
572 val = frame.GetArgument (4);
573 Assert.IsTrue (val is ObjectMirror);
574 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
577 val = frame.GetArgument (5);
578 Assert.IsTrue (val is ObjectMirror);
579 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
581 // this on static methods
582 val = frame.GetThis ();
583 AssertValue (null, val);
585 e = run_until ("arg3");
587 frame = e.Thread.GetFrames () [0];
590 val = frame.GetThis ();
591 Assert.IsTrue (val is ObjectMirror);
592 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
594 // objref in register
595 val = frame.GetArgument (0);
596 AssertValue ("BLA", val);
600 public void Arrays () {
603 var e = run_until ("o2");
605 StackFrame frame = e.Thread.GetFrames () [0];
608 val = frame.GetArgument (0);
609 Assert.IsTrue (val is ArrayMirror);
610 ArrayMirror arr = val as ArrayMirror;
611 Assert.AreEqual (2, arr.Length);
612 AssertValue ("BAR", arr [0]);
613 AssertValue ("BAZ", arr [1]);
615 var vals = arr.GetValues (0, 2);
616 Assert.AreEqual (2, vals.Count);
617 AssertValue ("BAR", vals [0]);
618 AssertValue ("BAZ", vals [1]);
620 arr [0] = vm.RootDomain.CreateString ("ABC");
621 AssertValue ("ABC", arr [0]);
623 arr [0] = vm.CreateValue (null);
624 AssertValue (null, arr [0]);
626 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
627 AssertValue ("D1", arr [0]);
628 AssertValue ("D2", arr [1]);
631 val = frame.GetArgument (1);
632 Assert.IsTrue (val is ArrayMirror);
633 arr = val as ArrayMirror;
634 Assert.AreEqual (2, arr.Length);
635 AssertValue (42, arr [0]);
636 AssertValue (43, arr [1]);
639 AssertThrows<IndexOutOfRangeException> (delegate () {
643 AssertThrows<IndexOutOfRangeException> (delegate () {
644 val = arr [Int32.MinValue];
647 AssertThrows<IndexOutOfRangeException> (delegate () {
648 vals = arr.GetValues (0, 3);
651 AssertThrows<IndexOutOfRangeException> (delegate () {
652 arr [2] = vm.CreateValue (null);
655 AssertThrows<IndexOutOfRangeException> (delegate () {
656 arr [Int32.MinValue] = vm.CreateValue (null);
659 AssertThrows<IndexOutOfRangeException> (delegate () {
660 arr.SetValues (0, new Value [] { null, null, null });
664 val = frame.GetArgument (2);
665 Assert.IsTrue (val is ArrayMirror);
666 arr = val as ArrayMirror;
667 Assert.AreEqual (2, arr.Rank);
668 Assert.AreEqual (4, arr.Length);
669 Assert.AreEqual (2, arr.GetLength (0));
670 Assert.AreEqual (2, arr.GetLength (1));
671 Assert.AreEqual (0, arr.GetLowerBound (0));
672 Assert.AreEqual (0, arr.GetLowerBound (1));
673 vals = arr.GetValues (0, 4);
674 AssertValue (1, vals [0]);
675 AssertValue (2, vals [1]);
676 AssertValue (3, vals [2]);
677 AssertValue (4, vals [3]);
679 val = frame.GetArgument (3);
680 Assert.IsTrue (val is ArrayMirror);
681 arr = val as ArrayMirror;
682 Assert.AreEqual (2, arr.Rank);
683 Assert.AreEqual (4, arr.Length);
684 Assert.AreEqual (2, arr.GetLength (0));
685 Assert.AreEqual (2, arr.GetLength (1));
686 Assert.AreEqual (1, arr.GetLowerBound (0));
687 Assert.AreEqual (3, arr.GetLowerBound (1));
689 AssertThrows<ArgumentOutOfRangeException> (delegate () {
692 AssertThrows<ArgumentOutOfRangeException> (delegate () {
696 AssertThrows<ArgumentOutOfRangeException> (delegate () {
697 arr.GetLowerBound (-1);
699 AssertThrows<ArgumentOutOfRangeException> (delegate () {
700 arr.GetLowerBound (2);
703 // arrays treated as generic collections
704 val = frame.GetArgument (4);
705 Assert.IsTrue (val is ArrayMirror);
706 arr = val as ArrayMirror;
710 public void Object_GetValue () {
711 var e = run_until ("o1");
712 var frame = e.Thread.GetFrames () [0];
714 object val = frame.GetThis ();
715 Assert.IsTrue (val is ObjectMirror);
716 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
717 ObjectMirror o = (val as ObjectMirror);
719 TypeMirror t = o.Type;
722 object f = o.GetValue (t.GetField ("field_i"));
724 f = o.GetValue (t.GetField ("field_s"));
725 AssertValue ("S", f);
726 f = o.GetValue (t.GetField ("field_enum"));
727 Assert.IsTrue (f is EnumMirror);
728 Assert.AreEqual (1, (f as EnumMirror).Value);
729 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
731 // Inherited object fields
732 TypeMirror parent = t.BaseType;
733 f = o.GetValue (parent.GetField ("base_field_i"));
735 f = o.GetValue (parent.GetField ("base_field_s"));
736 AssertValue ("T", f);
739 f = o.GetValue (o.Type.GetField ("static_i"));
743 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
744 Assert.AreEqual ("GClass`1", o2.Type.Name);
745 TypeMirror t2 = o2.Type;
746 f = o2.GetValue (t2.GetField ("field"));
749 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
750 Assert.AreEqual ("GClass`1", o3.Type.Name);
751 TypeMirror t3 = o3.Type;
752 f = o3.GetValue (t3.GetField ("field"));
753 AssertValue ("FOO", f);
756 AssertThrows<ArgumentNullException> (delegate () {
762 public void Object_GetValues () {
763 var e = run_until ("o1");
764 var frame = e.Thread.GetFrames () [0];
766 object val = frame.GetThis ();
767 Assert.IsTrue (val is ObjectMirror);
768 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
769 ObjectMirror o = (val as ObjectMirror);
771 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
773 TypeMirror t = o.Type;
775 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
779 AssertValue ("S", f);
782 AssertThrows<ArgumentNullException> (delegate () {
786 AssertThrows<ArgumentNullException> (delegate () {
787 o.GetValues (new FieldInfoMirror [] { null });
790 // field of another class
791 AssertThrows<ArgumentException> (delegate () {
792 o.GetValue (val2.Type.GetField ("field_j"));
796 void TestSetValue (ObjectMirror o, string field_name, object val) {
798 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
800 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
801 Value f = o.GetValue (o.Type.GetField (field_name));
802 AssertValue (val, f);
806 public void Object_SetValues () {
807 var e = run_until ("o1");
808 var frame = e.Thread.GetFrames () [0];
810 object val = frame.GetThis ();
811 Assert.IsTrue (val is ObjectMirror);
812 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
813 ObjectMirror o = (val as ObjectMirror);
815 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
817 TestSetValue (o, "field_i", 22);
818 TestSetValue (o, "field_bool1", false);
819 TestSetValue (o, "field_bool2", true);
820 TestSetValue (o, "field_char", 'B');
821 TestSetValue (o, "field_byte", (byte)129);
822 TestSetValue (o, "field_sbyte", (sbyte)-33);
823 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
824 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
825 TestSetValue (o, "field_long", Int64.MaxValue - 5);
826 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
827 TestSetValue (o, "field_float", 6.28f);
828 TestSetValue (o, "field_double", 6.28);
829 TestSetValue (o, "static_i", 23);
830 TestSetValue (o, "field_s", "CDEF");
835 f = o.GetValue (o.Type.GetField ("field_intptr"));
836 Assert.IsInstanceOfType (typeof (StructMirror), f);
837 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
841 FieldInfoMirror field = o.Type.GetField ("field_enum");
842 f = o.GetValue (field);
843 (f as EnumMirror).Value = 5;
844 o.SetValue (field, f);
845 f = o.GetValue (field);
846 Assert.AreEqual (5, (f as EnumMirror).Value);
849 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
850 f = o.GetValue (o.Type.GetField ("field_s"));
851 AssertValue (null, f);
854 field = o.Type.GetField ("generic_field_struct");
855 f = o.GetValue (field);
856 o.SetValue (field, f);
859 AssertThrows<ArgumentNullException> (delegate () {
860 o.SetValues (null, new Value [0]);
863 AssertThrows<ArgumentNullException> (delegate () {
864 o.SetValues (new FieldInfoMirror [0], null);
867 AssertThrows<ArgumentNullException> (delegate () {
868 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
871 // vtype with a wrong type
872 AssertThrows<ArgumentException> (delegate () {
873 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
876 // reference type not assignment compatible
877 AssertThrows<ArgumentException> (delegate () {
878 o.SetValue (o.Type.GetField ("field_class"), o);
881 // field of another class
882 AssertThrows<ArgumentException> (delegate () {
883 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
888 public void Type_SetValue () {
889 var e = run_until ("o1");
890 var frame = e.Thread.GetFrames () [0];
893 object val = frame.GetThis ();
894 Assert.IsTrue (val is ObjectMirror);
895 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
896 ObjectMirror o = (val as ObjectMirror);
898 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
900 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
901 f = o.Type.GetValue (o.Type.GetField ("static_i"));
905 AssertThrows<ArgumentNullException> (delegate () {
906 o.Type.SetValue (null, vm.CreateValue (0));
909 AssertThrows<ArgumentNullException> (delegate () {
910 o.Type.SetValue (o.Type.GetField ("static_i"), null);
913 // field of another class
914 AssertThrows<ArgumentException> (delegate () {
915 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
920 public void TypeInfo () {
921 Event e = run_until ("ti2");
922 StackFrame frame = e.Thread.GetFrames () [0];
927 t = frame.Method.GetParameters ()[0].ParameterType;
929 Assert.AreEqual ("String[]", t.Name);
930 Assert.AreEqual ("string[]", t.CSharpName);
931 Assert.AreEqual ("Array", t.BaseType.Name);
932 Assert.AreEqual (true, t.HasElementType);
933 Assert.AreEqual (true, t.IsArray);
934 Assert.AreEqual (1, t.GetArrayRank ());
935 Assert.AreEqual ("String", t.GetElementType ().Name);
937 t = frame.Method.GetParameters ()[2].ParameterType;
939 Assert.AreEqual ("Int32[,]", t.Name);
941 //Assert.AreEqual ("int[,]", t.CSharpName);
942 Assert.AreEqual ("Array", t.BaseType.Name);
943 Assert.AreEqual (true, t.HasElementType);
944 Assert.AreEqual (true, t.IsArray);
945 Assert.AreEqual (2, t.GetArrayRank ());
946 Assert.AreEqual ("Int32", t.GetElementType ().Name);
949 t = frame.Method.GetParameters ()[3].ParameterType;
951 //Assert.AreEqual ("Int32&", t.Name);
952 //Assert.AreEqual (true, t.IsByRef);
953 //Assert.AreEqual (true, t.HasElementType);
956 t = frame.Method.GetParameters ()[4].ParameterType;
958 //Assert.AreEqual ("Int32*", t.Name);
959 Assert.AreEqual (true, t.IsPointer);
960 Assert.AreEqual (true, t.HasElementType);
961 Assert.AreEqual ("Int32", t.GetElementType ().Name);
962 Assert.AreEqual (false, t.IsPrimitive);
965 t = frame.Method.GetParameters ()[5].ParameterType;
966 Assert.AreEqual (true, t.IsPrimitive);
969 t = frame.Method.GetParameters ()[6].ParameterType;
970 Assert.AreEqual ("AStruct", t.Name);
971 Assert.AreEqual (false, t.IsPrimitive);
972 Assert.AreEqual (true, t.IsValueType);
973 Assert.AreEqual (false, t.IsClass);
976 t = frame.Method.GetParameters ()[7].ParameterType;
977 Assert.AreEqual ("Tests", t.Name);
978 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
979 Assert.AreEqual (1, nested.Length);
980 Assert.AreEqual ("NestedClass", nested [0].Name);
981 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
982 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
985 t = frame.Method.GetParameters ()[9].ParameterType;
986 Assert.AreEqual ("GClass`1", t.Name);
989 t = frame.Method.GetParameters ()[10].ParameterType;
990 Assert.AreEqual ("AnEnum", t.Name);
991 Assert.IsTrue (t.IsEnum);
992 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
995 t = frame.Method.GetParameters ()[7].ParameterType;
997 var props = t.GetProperties ();
998 Assert.AreEqual (3, props.Length);
999 foreach (PropertyInfoMirror prop in props) {
1000 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1002 if (prop.Name == "IntProperty") {
1003 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1004 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1005 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1006 Assert.AreEqual (0, indexes.Length);
1007 } else if (prop.Name == "ReadOnlyProperty") {
1008 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1009 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1010 Assert.AreEqual (null, prop.GetSetMethod ());
1011 Assert.AreEqual (0, indexes.Length);
1012 } else if (prop.Name == "IndexedProperty") {
1013 Assert.AreEqual (1, indexes.Length);
1014 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1018 // custom attributes
1019 t = frame.Method.GetParameters ()[8].ParameterType;
1020 Assert.AreEqual ("Tests2", t.Name);
1021 var attrs = t.GetCustomAttributes (true);
1022 Assert.AreEqual (2, attrs.Length);
1023 foreach (var attr in attrs) {
1024 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1025 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1026 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1027 Assert.AreEqual (2, attr.NamedArguments.Count);
1028 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1029 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1030 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1031 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1032 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1033 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1034 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1035 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1036 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1038 Assert.Fail (attr.Constructor.DeclaringType.Name);
1044 public void FieldInfo () {
1045 Event e = run_until ("ti2");
1046 StackFrame frame = e.Thread.GetFrames () [0];
1050 t = frame.Method.GetParameters ()[8].ParameterType;
1051 Assert.AreEqual ("Tests2", t.Name);
1053 var fi = t.GetField ("field_j");
1054 var attrs = fi.GetCustomAttributes (true);
1055 Assert.AreEqual (1, attrs.Length);
1056 var attr = attrs [0];
1057 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1058 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1059 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1060 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1064 public void PropertyInfo () {
1065 Event e = run_until ("ti2");
1066 StackFrame frame = e.Thread.GetFrames () [0];
1070 t = frame.Method.GetParameters ()[8].ParameterType;
1071 Assert.AreEqual ("Tests2", t.Name);
1073 var pi = t.GetProperty ("AProperty");
1074 var attrs = pi.GetCustomAttributes (true);
1075 Assert.AreEqual (1, attrs.Length);
1076 var attr = attrs [0];
1077 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1078 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1079 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1080 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1084 public void Type_GetValue () {
1085 Event e = run_until ("o1");
1086 StackFrame frame = e.Thread.GetFrames () [0];
1088 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1090 TypeMirror t = o.Type;
1092 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1095 object f = t.GetValue (o.Type.GetField ("static_i"));
1096 AssertValue (55, f);
1098 f = t.GetValue (o.Type.GetField ("static_s"));
1099 AssertValue ("A", f);
1101 // literal static fields
1102 f = t.GetValue (o.Type.GetField ("literal_i"));
1103 AssertValue (56, f);
1105 f = t.GetValue (o.Type.GetField ("literal_s"));
1106 AssertValue ("B", f);
1108 // Inherited static fields
1109 TypeMirror parent = t.BaseType;
1110 f = t.GetValue (parent.GetField ("base_static_i"));
1111 AssertValue (57, f);
1113 f = t.GetValue (parent.GetField ("base_static_s"));
1114 AssertValue ("C", f);
1116 // Argument checking
1117 AssertThrows<ArgumentNullException> (delegate () {
1122 AssertThrows<ArgumentException> (delegate () {
1123 t.GetValue (o.Type.GetField ("field_i"));
1126 // field on another type
1127 AssertThrows<ArgumentException> (delegate () {
1128 t.GetValue (val2.Type.GetField ("static_field_j"));
1131 // special static field
1132 AssertThrows<ArgumentException> (delegate () {
1133 t.GetValue (t.GetField ("tls_i"));
1138 public void Type_GetValues () {
1139 Event e = run_until ("o1");
1140 StackFrame frame = e.Thread.GetFrames () [0];
1142 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1144 TypeMirror t = o.Type;
1147 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1148 object f = vals [0];
1149 AssertValue (55, f);
1152 AssertValue ("A", f);
1154 // Argument checking
1155 AssertThrows<ArgumentNullException> (delegate () {
1159 AssertThrows<ArgumentNullException> (delegate () {
1160 t.GetValues (new FieldInfoMirror [] { null });
1165 public void ObjRefs () {
1166 Event e = run_until ("objrefs1");
1167 StackFrame frame = e.Thread.GetFrames () [0];
1169 ObjectMirror o = frame.GetThis () as ObjectMirror;
1170 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1172 Assert.IsTrue (child.Address > 0);
1174 // Check that object references are internalized correctly
1175 Assert.AreEqual (o, frame.GetThis ());
1177 run_until ("objrefs2");
1179 // child should be gc'd now
1180 Assert.IsTrue (child.IsCollected);
1182 AssertThrows<ObjectCollectedException> (delegate () {
1183 TypeMirror t = child.Type;
1186 AssertThrows<ObjectCollectedException> (delegate () {
1187 long addr = child.Address;
1192 public void Type_GetObject () {
1193 Event e = run_until ("o1");
1194 StackFrame frame = e.Thread.GetFrames () [0];
1196 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1198 TypeMirror t = o.Type;
1200 Assert.AreEqual ("MonoType", t.GetTypeObject ().Type.Name);
1204 public void VTypes () {
1205 Event e = run_until ("vtypes1");
1206 StackFrame frame = e.Thread.GetFrames () [0];
1209 ObjectMirror o = frame.GetThis () as ObjectMirror;
1210 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1211 Assert.IsTrue (obj is StructMirror);
1212 var s = obj as StructMirror;
1213 Assert.AreEqual ("AStruct", s.Type.Name);
1214 AssertValue (42, s ["i"]);
1216 AssertValue ("S", obj);
1217 AssertValue (43, s ["k"]);
1218 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1219 Assert.IsTrue (obj is StructMirror);
1220 s = obj as StructMirror;
1221 Assert.AreEqual ("AStruct", s.Type.Name);
1222 AssertValue (42, s ["i"]);
1224 // vtypes as arguments
1225 s = frame.GetArgument (0) as StructMirror;
1226 AssertValue (44, s ["i"]);
1228 AssertValue ("T", obj);
1229 AssertValue (45, s ["k"]);
1231 // vtypes as array entries
1232 var arr = frame.GetArgument (1) as ArrayMirror;
1234 Assert.IsTrue (obj is StructMirror);
1235 s = obj as StructMirror;
1236 AssertValue (1, s ["i"]);
1237 AssertValue ("S1", s ["s"]);
1239 Assert.IsTrue (obj is StructMirror);
1240 s = obj as StructMirror;
1241 AssertValue (2, s ["i"]);
1242 AssertValue ("S2", s ["s"]);
1244 // Argument checking
1245 s = frame.GetArgument (0) as StructMirror;
1246 AssertThrows<ArgumentException> (delegate () {
1250 // generic vtype instances
1251 o = frame.GetThis () as ObjectMirror;
1252 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1253 Assert.IsTrue (obj is StructMirror);
1254 s = obj as StructMirror;
1255 Assert.AreEqual ("GStruct`1", s.Type.Name);
1256 AssertValue (42, s ["i"]);
1258 // this on vtype methods
1259 e = run_until ("vtypes2");
1261 e = single_step (e.Thread);
1263 frame = e.Thread.GetFrames () [0];
1265 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1266 obj = frame.GetThis ();
1268 Assert.IsTrue (obj is StructMirror);
1269 s = obj as StructMirror;
1270 AssertValue (44, s ["i"]);
1271 AssertValue ("T", s ["s"]);
1272 AssertValue (45, s ["k"]);
1274 // this on static vtype methods
1275 e = run_until ("vtypes3");
1277 e = single_step (e.Thread);
1279 frame = e.Thread.GetFrames () [0];
1281 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
1282 obj = frame.GetThis ();
1283 AssertValue (null, obj);
1287 public void AssemblyInfo () {
1288 Event e = run_until ("single_stepping");
1290 StackFrame frame = e.Thread.GetFrames () [0];
1292 var aname = frame.Method.DeclaringType.Assembly.GetName ();
1293 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
1295 ModuleMirror m = frame.Method.DeclaringType.Module;
1297 Assert.AreEqual ("dtest-app.exe", m.Name);
1298 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
1299 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
1300 Guid guid = m.ModuleVersionId;
1301 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
1302 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
1304 Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
1306 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
1307 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
1311 public void LocalsInfo () {
1312 Event e = run_until ("locals2");
1314 StackFrame frame = e.Thread.GetFrames () [0];
1316 var locals = frame.Method.GetLocals ();
1317 Assert.AreEqual (5, locals.Length);
1318 for (int i = 0; i < 5; ++i) {
1319 if (locals [i].Name == "args") {
1320 Assert.IsTrue (locals [i].IsArg);
1321 Assert.AreEqual ("String[]", locals [i].Type.Name);
1322 } else if (locals [i].Name == "arg") {
1323 Assert.IsTrue (locals [i].IsArg);
1324 Assert.AreEqual ("Int32", locals [i].Type.Name);
1325 } else if (locals [i].Name == "i") {
1326 Assert.IsFalse (locals [i].IsArg);
1327 Assert.AreEqual ("Int64", locals [i].Type.Name);
1328 } else if (locals [i].Name == "j") {
1329 Assert.IsFalse (locals [i].IsArg);
1330 Assert.AreEqual ("Int32", locals [i].Type.Name);
1331 } else if (locals [i].Name == "s") {
1332 Assert.IsFalse (locals [i].IsArg);
1333 Assert.AreEqual ("String", locals [i].Type.Name);
1341 public void Locals () {
1342 var be = run_until ("locals1");
1344 StackFrame frame = be.Thread.GetFrames () [0];
1346 MethodMirror m1 = frame.Method;
1348 be = run_until ("locals2");
1350 frame = be.Thread.GetFrames () [0];
1352 object val = frame.GetValue (frame.Method.GetLocal ("i"));
1353 AssertValue (0, val);
1356 var req = vm.CreateStepRequest (be.Thread);
1360 var e = vm.GetNextEvent ();
1361 Assert.IsTrue (e is StepEvent);
1362 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1364 // Execute s = "AB";
1366 e = vm.GetNextEvent ();
1367 Assert.IsTrue (e is StepEvent);
1368 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1370 frame = e.Thread.GetFrames () [0];
1372 val = frame.GetValue (frame.Method.GetLocal ("i"));
1373 AssertValue (42, val);
1375 LocalVariable[] locals = frame.Method.GetLocals ();
1376 var vals = frame.GetValues (locals);
1377 Assert.AreEqual (locals.Length, vals.Length);
1378 for (int i = 0; i < locals.Length; ++i) {
1379 if (locals [i].Name == "i")
1380 AssertValue (42, vals [i]);
1381 if (locals [i].Name == "s")
1382 AssertValue ("AB", vals [i]);
1385 // Argument checking
1388 AssertThrows<ArgumentNullException> (delegate () {
1389 frame.GetValue ((LocalVariable)null);
1391 // GetValue () local from another method
1392 AssertThrows<ArgumentException> (delegate () {
1393 frame.GetValue (m1.GetLocal ("foo"));
1397 AssertThrows<ArgumentNullException> (delegate () {
1398 frame.GetValue ((ParameterInfoMirror)null);
1400 // GetValue () local from another method
1401 AssertThrows<ArgumentException> (delegate () {
1402 frame.GetValue (m1.GetParameters ()[0]);
1405 // GetValues () null
1406 AssertThrows<ArgumentNullException> (delegate () {
1407 frame.GetValues (null);
1409 // GetValues () embedded null
1410 AssertThrows<ArgumentNullException> (delegate () {
1411 frame.GetValues (new LocalVariable [] { null });
1413 // GetValues () local from another method
1414 AssertThrows<ArgumentException> (delegate () {
1415 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
1418 AssertThrows<ArgumentException> (delegate () {
1419 val = frame.GetValue (frame.Method.ReturnParameter);
1422 // invalid stack frames
1424 e = vm.GetNextEvent ();
1425 Assert.IsTrue (e is StepEvent);
1426 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1428 AssertThrows<InvalidStackFrameException> (delegate () {
1429 frame.GetValue (frame.Method.GetLocal ("i"));
1436 public void Exit () {
1441 var e = vm.GetNextEvent ();
1442 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
1445 /* Could be a remote vm with no process */
1448 Assert.AreEqual (5, p.ExitCode);
1451 AssertThrows<VMDisconnectedException> (delegate () {
1460 public void Dispose () {
1465 var e = vm.GetNextEvent ();
1466 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
1469 /* Could be a remote vm with no process */
1472 Assert.AreEqual (3, p.ExitCode);
1475 AssertThrows<VMDisconnectedException> (delegate () {
1484 public void LineNumbers () {
1485 Event e = run_until ("line_numbers");
1487 step_req = vm.CreateStepRequest (e.Thread);
1488 step_req.Depth = StepDepth.Into;
1495 e = vm.GetNextEvent ();
1496 Assert.IsTrue (e is StepEvent);
1498 l = e.Thread.GetFrames ()[0].Location;
1500 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
1501 Assert.AreEqual ("ln1", l.Method.Name);
1503 int line_base = l.LineNumber;
1506 e = vm.GetNextEvent ();
1507 Assert.IsTrue (e is StepEvent);
1508 l = e.Thread.GetFrames ()[0].Location;
1509 Assert.AreEqual ("ln2", l.Method.Name);
1510 Assert.AreEqual (line_base + 6, l.LineNumber);
1513 e = vm.GetNextEvent ();
1514 Assert.IsTrue (e is StepEvent);
1515 l = e.Thread.GetFrames ()[0].Location;
1516 Assert.AreEqual ("ln1", l.Method.Name);
1517 Assert.AreEqual (line_base + 1, l.LineNumber);
1520 e = vm.GetNextEvent ();
1521 Assert.IsTrue (e is StepEvent);
1522 l = e.Thread.GetFrames ()[0].Location;
1523 Assert.AreEqual ("ln3", l.Method.Name);
1524 Assert.AreEqual (line_base + 10, l.LineNumber);
1527 e = vm.GetNextEvent ();
1528 Assert.IsTrue (e is StepEvent);
1529 l = e.Thread.GetFrames ()[0].Location;
1530 Assert.AreEqual ("ln1", l.Method.Name);
1531 Assert.AreEqual (line_base + 2, l.LineNumber);
1533 // GetSourceFiles ()
1534 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
1535 Assert.AreEqual (1, sources.Length);
1536 Assert.AreEqual ("dtest-app.cs", sources [0]);
1540 public void Suspend () {
1543 Start (new string [] { "dtest-app.exe", "suspend-test" });
1545 Event e = run_until ("suspend");
1547 ThreadMirror main = e.Thread;
1555 // The debuggee should be suspended while it is running the infinite loop
1557 StackFrame frame = main.GetFrames ()[0];
1558 Assert.AreEqual ("suspend", frame.Method.Name);
1562 // resuming when not suspended
1563 AssertThrows<InvalidOperationException> (delegate () {
1573 public void AssemblyLoad () {
1574 Event e = run_until ("assembly_load");
1578 e = vm.GetNextEvent ();
1579 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
1580 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
1582 var frames = e.Thread.GetFrames ();
1583 Assert.IsTrue (frames.Length > 0);
1584 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
1588 public void CreateValue () {
1591 v = vm.CreateValue (1);
1592 Assert.AreEqual (vm, v.VirtualMachine);
1593 Assert.AreEqual (1, v.Value);
1595 v = vm.CreateValue (null);
1596 Assert.AreEqual (vm, v.VirtualMachine);
1597 Assert.AreEqual (null, v.Value);
1599 // Argument checking
1600 AssertThrows <ArgumentException> (delegate () {
1601 v = vm.CreateValue ("FOO");
1606 public void CreateString () {
1607 StringMirror s = vm.RootDomain.CreateString ("ABC");
1609 Assert.AreEqual (vm, s.VirtualMachine);
1610 Assert.AreEqual ("ABC", s.Value);
1611 Assert.AreEqual (vm.RootDomain, s.Domain);
1613 // Argument checking
1614 AssertThrows <ArgumentNullException> (delegate () {
1615 s = vm.RootDomain.CreateString (null);
1620 public void Invoke () {
1621 Event e = run_until ("invoke1");
1623 StackFrame frame = e.Thread.GetFrames () [0];
1625 TypeMirror t = frame.Method.DeclaringType;
1626 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
1628 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
1634 m = t.GetMethod ("invoke_return_void");
1635 v = this_obj.InvokeMethod (e.Thread, m, null);
1639 m = t.GetMethod ("invoke_return_ref");
1640 v = this_obj.InvokeMethod (e.Thread, m, null);
1641 AssertValue ("ABC", v);
1644 m = t.GetMethod ("invoke_return_null");
1645 v = this_obj.InvokeMethod (e.Thread, m, null);
1646 AssertValue (null, v);
1649 m = t.GetMethod ("invoke_return_primitive");
1650 v = this_obj.InvokeMethod (e.Thread, m, null);
1651 AssertValue (42, v);
1654 m = t.GetMethod ("invoke_pass_primitive");
1655 Value[] args = new Value [] {
1656 vm.CreateValue ((byte)Byte.MaxValue),
1657 vm.CreateValue ((sbyte)SByte.MaxValue),
1658 vm.CreateValue ((short)1),
1659 vm.CreateValue ((ushort)1),
1660 vm.CreateValue ((int)1),
1661 vm.CreateValue ((uint)1),
1662 vm.CreateValue ((long)1),
1663 vm.CreateValue ((ulong)1),
1664 vm.CreateValue ('A'),
1665 vm.CreateValue (true),
1666 vm.CreateValue (3.14f),
1667 vm.CreateValue (3.14) };
1669 v = this_obj.InvokeMethod (e.Thread, m, args);
1670 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
1673 m = t.GetMethod ("invoke_pass_ref");
1674 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1675 AssertValue ("ABC", v);
1678 m = t.GetMethod ("invoke_pass_ref");
1679 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
1680 AssertValue (null, v);
1683 m = t.GetMethod ("invoke_static_pass_ref");
1684 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1685 AssertValue ("ABC", v);
1687 // static invoked using ObjectMirror.InvokeMethod
1688 m = t.GetMethod ("invoke_static_pass_ref");
1689 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1690 AssertValue ("ABC", v);
1692 // method which throws an exception
1694 m = t.GetMethod ("invoke_throws");
1695 v = this_obj.InvokeMethod (e.Thread, m, null);
1697 } catch (InvocationException ex) {
1698 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
1702 m = t.GetMethod (".ctor");
1703 v = t.InvokeMethod (e.Thread, m, null);
1704 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
1705 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
1707 // Argument checking
1710 AssertThrows<ArgumentNullException> (delegate {
1711 m = t.GetMethod ("invoke_pass_ref");
1712 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
1716 AssertThrows<ArgumentNullException> (delegate {
1717 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
1720 // invalid number of arguments
1721 m = t.GetMethod ("invoke_pass_ref");
1722 AssertThrows<ArgumentException> (delegate {
1723 v = this_obj.InvokeMethod (e.Thread, m, null);
1726 // invalid type of argument (ref != primitive)
1727 m = t.GetMethod ("invoke_pass_ref");
1728 AssertThrows<ArgumentException> (delegate {
1729 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
1732 // invalid type of argument (primitive != primitive)
1733 m = t.GetMethod ("invoke_pass_primitive_2");
1734 AssertThrows<ArgumentException> (delegate {
1735 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
1738 // invoking a non-static method as static
1739 m = t.GetMethod ("invoke_pass_ref");
1740 AssertThrows<ArgumentException> (delegate {
1741 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1744 // invoking a method defined in another class
1745 m = t2.GetMethod ("invoke");
1746 AssertThrows<ArgumentException> (delegate {
1747 v = this_obj.InvokeMethod (e.Thread, m, null);
1753 public void InvokeVType () {
1754 Event e = run_until ("invoke1");
1756 StackFrame frame = e.Thread.GetFrames () [0];
1758 var s = frame.GetArgument (1) as StructMirror;
1760 TypeMirror t = s.Type;
1765 // Pass struct as this, receive int
1766 m = t.GetMethod ("invoke_return_int");
1767 v = s.InvokeMethod (e.Thread, m, null);
1768 AssertValue (42, v);
1770 // Pass struct as this, receive intptr
1771 m = t.GetMethod ("invoke_return_intptr");
1772 v = s.InvokeMethod (e.Thread, m, null);
1773 AssertValue (43, v);
1776 m = t.GetMethod ("invoke_static");
1777 v = t.InvokeMethod (e.Thread, m, null);
1782 public void BreakpointDuringInvoke () {
1783 Event e = run_until ("invoke1");
1785 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
1786 Assert.IsNotNull (m);
1787 vm.SetBreakpoint (m, 0);
1789 StackFrame frame = e.Thread.GetFrames () [0];
1790 var o = frame.GetThis () as ObjectMirror;
1792 bool failed = false;
1794 bool finished = false;
1795 object wait = new object ();
1797 // Have to invoke in a separate thread as the invoke is suspended until we
1798 // resume after the breakpoint
1799 Thread t = new Thread (delegate () {
1801 o.InvokeMethod (e.Thread, m, null);
1807 Monitor.Pulse (wait);
1813 StackFrame invoke_frame = null;
1816 e = vm.GetNextEvent ();
1817 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
1818 // Check stack trace support and invokes
1819 var frames = e.Thread.GetFrames ();
1820 invoke_frame = frames [0];
1821 Assert.AreEqual ("invoke2", frames [0].Method.Name);
1822 Assert.IsTrue (frames [0].IsDebuggerInvoke);
1823 Assert.AreEqual ("invoke1", frames [1].Method.Name);
1828 // Check that the invoke frames are no longer valid
1829 AssertThrows<InvalidStackFrameException> (delegate {
1830 invoke_frame.GetThis ();
1835 Monitor.Wait (wait);
1838 // Check InvokeOptions.DisableBreakpoints flag
1839 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
1843 public void InvokeSingleThreaded () {
1846 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
1848 Event e = run_until ("invoke_single_threaded_2");
1850 StackFrame f = e.Thread.GetFrames ()[0];
1852 var obj = f.GetThis () as ObjectMirror;
1854 // Check that the counter value incremented by the other thread does not increase
1855 // during the invoke.
1856 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
1858 var m = obj.Type.GetMethod ("invoke_return_void");
1859 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
1861 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
1863 Assert.AreEqual ((int)counter1, (int)counter2);
1865 // Test multiple invokes done in succession
1866 m = obj.Type.GetMethod ("invoke_return_void");
1867 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
1869 // Test events during single-threaded invokes
1870 vm.EnableEvents (EventType.TypeLoad);
1871 m = obj.Type.GetMethod ("invoke_type_load");
1872 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
1876 e = vm.GetNextEvent ();
1877 Assert.AreEqual (EventType.TypeLoad, e.EventType);
1881 public void GetThreads () {
1886 public void Threads () {
1887 Event e = run_until ("threads");
1889 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
1891 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
1895 e = vm.GetNextEvent ();
1896 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
1897 var state = e.Thread.ThreadState;
1898 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
1902 e = vm.GetNextEvent ();
1903 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
1904 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
1908 public void Frame_SetValue () {
1909 Event e = run_until ("locals2");
1911 StackFrame frame = e.Thread.GetFrames () [0];
1914 var l = frame.Method.GetLocal ("i");
1915 frame.SetValue (l, vm.CreateValue ((long)55));
1916 AssertValue (55, frame.GetValue (l));
1919 l = frame.Method.GetLocal ("s");
1920 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
1921 AssertValue ("DEF", frame.GetValue (l));
1923 // argument as local
1924 l = frame.Method.GetLocal ("arg");
1925 frame.SetValue (l, vm.CreateValue (6));
1926 AssertValue (6, frame.GetValue (l));
1929 var p = frame.Method.GetParameters ()[1];
1930 frame.SetValue (p, vm.CreateValue (7));
1931 AssertValue (7, frame.GetValue (p));
1933 // argument checking
1936 AssertThrows<ArgumentNullException> (delegate () {
1937 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
1941 AssertThrows<ArgumentNullException> (delegate () {
1942 l = frame.Method.GetLocal ("i");
1943 frame.SetValue (l, null);
1946 // value of invalid type
1947 AssertThrows<ArgumentException> (delegate () {
1948 l = frame.Method.GetLocal ("i");
1949 frame.SetValue (l, vm.CreateValue (55));
1954 public void InvokeRegress () {
1955 Event e = run_until ("invoke1");
1957 StackFrame frame = e.Thread.GetFrames () [0];
1959 TypeMirror t = frame.Method.DeclaringType;
1960 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
1962 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
1968 m = t.GetMethod ("invoke_return_void");
1969 v = this_obj.InvokeMethod (e.Thread, m, null);
1972 // Check that the stack frames remain valid during the invoke
1973 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
1975 // do another invoke
1976 m = t.GetMethod ("invoke_return_void");
1977 v = this_obj.InvokeMethod (e.Thread, m, null);
1980 // Try a single step after the invoke
1981 var req = vm.CreateStepRequest (e.Thread);
1982 req.Depth = StepDepth.Into;
1983 req.Size = StepSize.Line;
1988 // Step into invoke2
1990 e = vm.GetNextEvent ();
1991 Assert.IsTrue (e is StepEvent);
1992 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
1996 frame = e.Thread.GetFrames () [0];
2000 public void Exceptions () {
2001 Event e = run_until ("exceptions");
2002 var req = vm.CreateExceptionRequest (null);
2007 e = vm.GetNextEvent ();
2008 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2009 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2011 var frames = e.Thread.GetFrames ();
2012 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2015 // exception type filter
2017 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
2020 // Skip the throwing of the second OverflowException
2023 e = vm.GetNextEvent ();
2024 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2025 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
2028 // exception type filter for subclasses
2029 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
2034 e = vm.GetNextEvent ();
2035 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2036 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2039 // Implicit exceptions
2040 req = vm.CreateExceptionRequest (null);
2045 e = vm.GetNextEvent ();
2046 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2047 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2050 // Argument checking
2051 AssertThrows<ArgumentException> (delegate {
2052 vm.CreateExceptionRequest (e.Thread.Type);
2057 public void Domains () {
2060 Start (new string [] { "dtest-app.exe", "domain-test" });
2062 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
2064 Event e = run_until ("domains");
2068 e = vm.GetNextEvent ();
2069 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
2071 var domain = (e as AppDomainCreateEvent).Domain;
2073 // Run until the callback in the domain
2074 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
2075 Assert.IsNotNull (m);
2076 vm.SetBreakpoint (m, 0);
2080 e = vm.GetNextEvent ();
2081 if (e is BreakpointEvent)
2085 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
2087 // d_method is from another domain
2088 MethodMirror d_method = (e as BreakpointEvent).Method;
2089 Assert.IsTrue (m != d_method);
2091 var frames = e.Thread.GetFrames ();
2092 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
2093 Assert.AreEqual ("invoke", frames [1].Method.Name);
2094 Assert.AreEqual ("domains", frames [2].Method.Name);
2096 // This is empty when receiving the AppDomainCreateEvent
2097 Assert.AreEqual ("domain", domain.FriendlyName);
2099 // Run until the unload
2102 e = vm.GetNextEvent ();
2103 if (e is AssemblyUnloadEvent) {
2109 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
2110 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
2112 // Run past the unload
2113 e = run_until ("domains_2");
2115 // Test access to unloaded types
2116 // FIXME: Add an exception type for this
2117 AssertThrows<Exception> (delegate {
2118 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
2123 public void DynamicMethods () {
2124 Event e = run_until ("dyn_call");
2126 var m = e.Thread.GetFrames ()[1].Method;
2127 Assert.AreEqual ("dyn_method", m.Name);
2129 // Test access to IL
2130 var body = m.GetMethodBody ();
2132 ILInstruction ins = body.Instructions [0];
2133 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2134 Assert.AreEqual ("FOO", ins.Operand);
2138 public void RefEmit () {
2141 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
2143 Event e = run_until ("ref_emit_call");
2145 var m = e.Thread.GetFrames ()[1].Method;
2146 Assert.AreEqual ("ref_emit_method", m.Name);
2148 // Test access to IL
2149 var body = m.GetMethodBody ();
2153 ins = body.Instructions [0];
2154 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2155 Assert.AreEqual ("FOO", ins.Operand);
2157 ins = body.Instructions [1];
2158 Assert.AreEqual (OpCodes.Call, ins.OpCode);
2159 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
2160 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
2164 public void IsAttached () {
2165 var f = entry_point.DeclaringType.GetField ("is_attached");
2167 Event e = run_until ("Main");
2169 AssertValue (true, entry_point.DeclaringType.GetValue (f));
2173 public void StackTraceInNative () {
2174 // Check that stack traces can be produced for threads in native code
2177 Start (new string [] { "dtest-app.exe", "frames-in-native" });
2179 var e = run_until ("frames_in_native");
2181 // FIXME: This is racy
2188 StackFrame[] frames = e.Thread.GetFrames ();
2190 int frame_index = -1;
2191 for (int i = 0; i < frames.Length; ++i) {
2192 if (frames [i].Method.Name == "Sleep") {
2198 Assert.IsTrue (frame_index != -1);
2199 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
2200 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
2201 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
2203 // Check that invokes are disabled for such threads
2204 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
2207 var m = t.GetMethod ("invoke_static_return_void");
2208 AssertThrows<InvalidOperationException> (delegate {
2209 t.InvokeMethod (e.Thread, m, null);
2214 public void VirtualMachine_CreateEnumMirror () {
2215 var e = run_until ("o1");
2216 var frame = e.Thread.GetFrames () [0];
2218 object val = frame.GetThis ();
2219 Assert.IsTrue (val is ObjectMirror);
2220 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
2221 ObjectMirror o = (val as ObjectMirror);
2223 FieldInfoMirror field = o.Type.GetField ("field_enum");
2224 Value f = o.GetValue (field);
2225 TypeMirror enumType = (f as EnumMirror).Type;
2227 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
2228 f = o.GetValue (field);
2229 Assert.AreEqual (1, (f as EnumMirror).Value);
2231 // Argument checking
2232 AssertThrows<ArgumentNullException> (delegate () {
2233 vm.CreateEnumMirror (enumType, null);
2236 AssertThrows<ArgumentNullException> (delegate () {
2237 vm.CreateEnumMirror (null, vm.CreateValue (1));
2241 AssertThrows<ArgumentException> (delegate () {
2242 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
2245 // value of a wrong type
2246 AssertThrows<ArgumentException> (delegate () {
2247 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));