2 using System.Collections.Generic;
3 using System.Threading;
5 using System.Reflection;
8 using Mono.Debugger.Soft;
9 using Diag = System.Diagnostics;
12 using NUnit.Framework;
14 #pragma warning disable 0219
17 public class DebuggerTests
20 MethodMirror entry_point;
21 StepEventRequest step_req;
23 void AssertThrows<ExType> (Action del) where ExType : Exception {
31 Assert.IsTrue (thrown);
34 // No other way to pass arguments to the tests ?
35 public static bool listening = Environment.GetEnvironmentVariable ("DBG_SUSPEND") != null;
36 public static string runtime = Environment.GetEnvironmentVariable ("DBG_RUNTIME");
37 public static string agent_args = Environment.GetEnvironmentVariable ("DBG_AGENT_ARGS");
39 void Start (string[] args) {
41 var pi = new Diag.ProcessStartInfo ();
44 pi.FileName = runtime;
47 pi.Arguments = String.Join (" ", args);
48 vm = VirtualMachineManager.Launch (pi, new LaunchOptions { AgentArgs = agent_args });
50 Console.WriteLine ("Listening...");
51 vm = VirtualMachineManager.Listen (new IPEndPoint (IPAddress.Any, 10000));
54 vm.EnableEvents (EventType.AssemblyLoad);
56 Event vmstart = vm.GetNextEvent ();
57 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
66 /* Find out the entry point */
68 e = vm.GetNextEvent ();
70 if (e is AssemblyLoadEvent) {
71 AssemblyLoadEvent ae = (AssemblyLoadEvent)e;
72 entry_point = ae.Assembly.EntryPoint;
73 if (entry_point != null)
81 BreakpointEvent run_until (string name) {
83 MethodMirror m = entry_point.DeclaringType.GetMethod (name);
85 vm.SetBreakpoint (m, 0);
91 e = vm.GetNextEvent ();
92 if (e is BreakpointEvent)
96 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
97 Assert.AreEqual (m, (e as BreakpointEvent).Method);
99 return (e as BreakpointEvent);
102 Event single_step (ThreadMirror t) {
103 var req = vm.CreateStepRequest (t);
107 Event e = vm.GetNextEvent ();
108 Assert.IsTrue (e is StepEvent);
115 void check_arg_val (StackFrame frame, int pos, Type type, object eval) {
116 object val = frame.GetArgument (pos);
117 Assert.IsTrue (val is PrimitiveValue);
118 object v = (val as PrimitiveValue).Value;
119 Assert.AreEqual (type, v.GetType ());
121 Assert.IsTrue (Math.Abs ((float)eval - (float)v) < 0.0001);
122 else if (eval is double)
123 Assert.IsTrue (Math.Abs ((double)eval - (double)v) < 0.0001);
125 Assert.AreEqual (eval, v);
128 void AssertValue (object expected, object val) {
129 if (expected is string) {
130 Assert.IsTrue (val is StringMirror);
131 Assert.AreEqual (expected, (val as StringMirror).Value);
132 } else if (val is StructMirror && (val as StructMirror).Type.Name == "IntPtr") {
133 AssertValue (expected, (val as StructMirror).Fields [0]);
135 Assert.IsTrue (val is PrimitiveValue);
136 Assert.AreEqual (expected, (val as PrimitiveValue).Value);
141 public void SetUp () {
142 Start (new string [] { "dtest-app.exe" });
146 public void TearDown () {
150 if (step_req != null)
155 Event e = vm.GetNextEvent ();
157 if (e is VMDeathEvent)
165 public void SimpleBreakpoint () {
168 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp1");
169 Assert.IsNotNull (m);
171 vm.SetBreakpoint (m, 0);
175 e = vm.GetNextEvent ();
176 Assert.AreEqual (EventType.Breakpoint, e.EventType);
177 Assert.IsTrue (e is BreakpointEvent);
178 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
181 AssertThrows<ArgumentException> (delegate {
183 vm.SetBreakpoint (m, 1);
188 public void BreakpointsSameLocation () {
191 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp2");
192 Assert.IsNotNull (m);
194 vm.SetBreakpoint (m, 0);
195 vm.SetBreakpoint (m, 0);
199 e = vm.GetNextEvent ();
200 Assert.IsTrue (e is BreakpointEvent);
201 Assert.AreEqual (m, (e as BreakpointEvent).Method);
203 e = vm.GetNextEvent ();
204 Assert.IsTrue (e is BreakpointEvent);
205 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
209 public void BreakpointAlreadyJITted () {
210 Event e = run_until ("bp1");
212 /* Place a breakpoint on bp3 */
213 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp3");
214 Assert.IsNotNull (m);
215 vm.SetBreakpoint (m, 0);
217 /* Same with generic instances */
218 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp7");
219 Assert.IsNotNull (m2);
220 vm.SetBreakpoint (m2, 0);
224 e = vm.GetNextEvent ();
225 Assert.AreEqual (EventType.Breakpoint, e.EventType);
226 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
230 /* Non-shared instance */
231 e = vm.GetNextEvent ();
232 Assert.AreEqual (EventType.Breakpoint, e.EventType);
233 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
237 /* Shared instance */
238 e = vm.GetNextEvent ();
239 Assert.AreEqual (EventType.Breakpoint, e.EventType);
240 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
244 public void ClearBreakpoint () {
247 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
248 Assert.IsNotNull (m);
249 EventRequest req1 = vm.SetBreakpoint (m, 0);
250 EventRequest req2 = vm.SetBreakpoint (m, 0);
252 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
253 Assert.IsNotNull (m2);
254 vm.SetBreakpoint (m2, 0);
259 e = vm.GetNextEvent ();
260 Assert.AreEqual (EventType.Breakpoint, e.EventType);
261 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
262 e = vm.GetNextEvent ();
263 Assert.AreEqual (EventType.Breakpoint, e.EventType);
264 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
266 /* Clear one of them */
271 e = vm.GetNextEvent ();
272 Assert.AreEqual (EventType.Breakpoint, e.EventType);
273 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
275 /* Clear the other */
280 e = vm.GetNextEvent ();
281 Assert.AreEqual (EventType.Breakpoint, e.EventType);
282 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
286 public void ClearAllBreakpoints () {
289 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
290 Assert.IsNotNull (m);
291 vm.SetBreakpoint (m, 0);
293 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
294 Assert.IsNotNull (m2);
295 vm.SetBreakpoint (m2, 0);
297 vm.ClearAllBreakpoints ();
301 e = vm.GetNextEvent ();
302 Assert.IsTrue (!(e is BreakpointEvent));
303 if (e is VMDeathEvent)
308 public void BreakpointOnGShared () {
311 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp6");
312 Assert.IsNotNull (m);
314 vm.SetBreakpoint (m, 0);
318 e = vm.GetNextEvent ();
319 Assert.AreEqual (EventType.Breakpoint, e.EventType);
320 Assert.IsTrue (e is BreakpointEvent);
321 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
325 public void SingleStepping () {
326 Event e = run_until ("single_stepping");
328 var req = vm.CreateStepRequest (e.Thread);
335 e = vm.GetNextEvent ();
336 Assert.IsTrue (e is StepEvent);
337 Assert.AreEqual ("ss1", (e as StepEvent).Method.Name);
341 e = vm.GetNextEvent ();
342 Assert.IsTrue (e is StepEvent);
343 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
345 // Change to step over
347 req.Depth = StepDepth.Over;
352 e = vm.GetNextEvent ();
353 Assert.IsTrue (e is StepEvent);
354 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
356 // Change to step into
358 req.Depth = StepDepth.Into;
363 e = vm.GetNextEvent ();
364 Assert.IsTrue (e is StepEvent);
365 Assert.AreEqual ("ss3", (e as StepEvent).Method.Name);
367 // Change to step out
369 req.Depth = StepDepth.Out;
372 // Step back into single_stepping
374 e = vm.GetNextEvent ();
375 Assert.IsTrue (e is StepEvent);
376 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
378 // Change to step into
380 req.Depth = StepDepth.Into;
383 // Step into ss3_2 ()
385 e = vm.GetNextEvent ();
386 Assert.IsTrue (e is StepEvent);
387 Assert.AreEqual ("ss3_2", (e as StepEvent).Method.Name);
389 // Change to step over
391 req.Depth = StepDepth.Over;
394 // Step over ss3_2_2 ()
396 e = vm.GetNextEvent ();
397 Assert.IsTrue (e is StepEvent);
398 Assert.AreEqual ("ss3_2", (e as StepEvent).Method.Name);
400 // Recreate the request
404 // Step back into single_stepping () with the new request
406 e = vm.GetNextEvent ();
407 Assert.IsTrue (e is StepEvent);
408 Assert.AreEqual ("single_stepping", (e as StepEvent).Method.Name);
410 // Change to step into
412 req.Depth = StepDepth.Into;
417 e = vm.GetNextEvent ();
418 Assert.IsTrue (e is StepEvent);
419 Assert.AreEqual ("ss4", (e as StepEvent).Method.Name);
421 // Change to StepSize.Line
423 req.Depth = StepDepth.Over;
424 req.Size = StepSize.Line;
427 // Step over ss1 (); ss1 ();
429 e = vm.GetNextEvent ();
430 Assert.IsTrue (e is StepEvent);
434 req.Depth = StepDepth.Into;
438 e = vm.GetNextEvent ();
439 Assert.IsTrue (e is StepEvent);
440 Assert.AreEqual ("ss2", (e as StepEvent).Method.Name);
445 e = run_until ("ss5");
447 // Add an assembly filter
448 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
451 // Step into is_even, skipping the linq stuff
453 e = vm.GetNextEvent ();
454 Assert.IsTrue (e is StepEvent);
455 Assert.AreEqual ("is_even", (e as StepEvent).Method.Name);
457 // FIXME: Check that single stepping works with lock (obj)
462 e = run_until ("ss6");
464 req = vm.CreateStepRequest (e.Thread);
465 req.Depth = StepDepth.Over;
468 // Check that single stepping works in out-of-line bblocks
470 e = vm.GetNextEvent ();
471 Assert.IsTrue (e is StepEvent);
473 e = vm.GetNextEvent ();
474 Assert.IsTrue (e is StepEvent);
475 Assert.AreEqual ("ss6", (e as StepEvent).Method.Name);
481 public void MethodEntryExit () {
482 run_until ("single_stepping");
484 var req1 = vm.CreateMethodEntryRequest ();
485 var req2 = vm.CreateMethodExitRequest ();
491 Event e = vm.GetNextEvent ();
492 Assert.IsTrue (e is MethodEntryEvent);
493 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
496 e = vm.GetNextEvent ();
497 Assert.IsTrue (e is MethodExitEvent);
498 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
505 public void CountFilter () {
506 run_until ("single_stepping");
508 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
509 Assert.IsNotNull (m2);
510 vm.SetBreakpoint (m2, 0);
512 var req1 = vm.CreateMethodEntryRequest ();
516 // Enter ss2, ss1 is skipped
518 Event e = vm.GetNextEvent ();
519 Assert.IsTrue (e is MethodEntryEvent);
520 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
522 // Breakpoint on ss3, the entry event is no longer reported
524 e = vm.GetNextEvent ();
525 Assert.IsTrue (e is BreakpointEvent);
531 public void Arguments () {
534 var e = run_until ("arg1");
536 StackFrame frame = e.Thread.GetFrames () [0];
538 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
539 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
540 check_arg_val (frame, 2, typeof (bool), true);
541 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
542 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
543 check_arg_val (frame, 5, typeof (char), 'F');
544 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
545 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
546 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
547 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
548 check_arg_val (frame, 10, typeof (float), 1.2345f);
549 check_arg_val (frame, 11, typeof (double), 6.78910);
551 e = run_until ("arg2");
553 frame = e.Thread.GetFrames () [0];
556 val = frame.GetArgument (0);
557 AssertValue ("FOO", val);
558 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
561 val = frame.GetArgument (1);
562 AssertValue (null, val);
565 val = frame.GetArgument (2);
566 AssertValue ("BLA", val);
569 val = frame.GetArgument (3);
570 AssertValue (42, val);
573 val = frame.GetArgument (4);
574 Assert.IsTrue (val is ObjectMirror);
575 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
578 val = frame.GetArgument (5);
579 Assert.IsTrue (val is ObjectMirror);
580 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
582 // this on static methods
583 val = frame.GetThis ();
584 AssertValue (null, val);
586 e = run_until ("arg3");
588 frame = e.Thread.GetFrames () [0];
591 val = frame.GetThis ();
592 Assert.IsTrue (val is ObjectMirror);
593 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
595 // objref in register
596 val = frame.GetArgument (0);
597 AssertValue ("BLA", val);
601 public void Arrays () {
604 var e = run_until ("o2");
606 StackFrame frame = e.Thread.GetFrames () [0];
609 val = frame.GetArgument (0);
610 Assert.IsTrue (val is ArrayMirror);
611 ArrayMirror arr = val as ArrayMirror;
612 Assert.AreEqual (2, arr.Length);
613 AssertValue ("BAR", arr [0]);
614 AssertValue ("BAZ", arr [1]);
616 var vals = arr.GetValues (0, 2);
617 Assert.AreEqual (2, vals.Count);
618 AssertValue ("BAR", vals [0]);
619 AssertValue ("BAZ", vals [1]);
621 arr [0] = vm.RootDomain.CreateString ("ABC");
622 AssertValue ("ABC", arr [0]);
624 arr [0] = vm.CreateValue (null);
625 AssertValue (null, arr [0]);
627 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
628 AssertValue ("D1", arr [0]);
629 AssertValue ("D2", arr [1]);
632 val = frame.GetArgument (1);
633 Assert.IsTrue (val is ArrayMirror);
634 arr = val as ArrayMirror;
635 Assert.AreEqual (2, arr.Length);
636 AssertValue (42, arr [0]);
637 AssertValue (43, arr [1]);
640 AssertThrows<IndexOutOfRangeException> (delegate () {
644 AssertThrows<IndexOutOfRangeException> (delegate () {
645 val = arr [Int32.MinValue];
648 AssertThrows<IndexOutOfRangeException> (delegate () {
649 vals = arr.GetValues (0, 3);
652 AssertThrows<IndexOutOfRangeException> (delegate () {
653 arr [2] = vm.CreateValue (null);
656 AssertThrows<IndexOutOfRangeException> (delegate () {
657 arr [Int32.MinValue] = vm.CreateValue (null);
660 AssertThrows<IndexOutOfRangeException> (delegate () {
661 arr.SetValues (0, new Value [] { null, null, null });
665 val = frame.GetArgument (2);
666 Assert.IsTrue (val is ArrayMirror);
667 arr = val as ArrayMirror;
668 Assert.AreEqual (2, arr.Rank);
669 Assert.AreEqual (4, arr.Length);
670 Assert.AreEqual (2, arr.GetLength (0));
671 Assert.AreEqual (2, arr.GetLength (1));
672 Assert.AreEqual (0, arr.GetLowerBound (0));
673 Assert.AreEqual (0, arr.GetLowerBound (1));
674 vals = arr.GetValues (0, 4);
675 AssertValue (1, vals [0]);
676 AssertValue (2, vals [1]);
677 AssertValue (3, vals [2]);
678 AssertValue (4, vals [3]);
680 val = frame.GetArgument (3);
681 Assert.IsTrue (val is ArrayMirror);
682 arr = val as ArrayMirror;
683 Assert.AreEqual (2, arr.Rank);
684 Assert.AreEqual (4, arr.Length);
685 Assert.AreEqual (2, arr.GetLength (0));
686 Assert.AreEqual (2, arr.GetLength (1));
687 Assert.AreEqual (1, arr.GetLowerBound (0));
688 Assert.AreEqual (3, arr.GetLowerBound (1));
690 AssertThrows<ArgumentOutOfRangeException> (delegate () {
693 AssertThrows<ArgumentOutOfRangeException> (delegate () {
697 AssertThrows<ArgumentOutOfRangeException> (delegate () {
698 arr.GetLowerBound (-1);
700 AssertThrows<ArgumentOutOfRangeException> (delegate () {
701 arr.GetLowerBound (2);
704 // arrays treated as generic collections
705 val = frame.GetArgument (4);
706 Assert.IsTrue (val is ArrayMirror);
707 arr = val as ArrayMirror;
711 public void Object_GetValue () {
712 var e = run_until ("o1");
713 var frame = e.Thread.GetFrames () [0];
715 object val = frame.GetThis ();
716 Assert.IsTrue (val is ObjectMirror);
717 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
718 ObjectMirror o = (val as ObjectMirror);
720 TypeMirror t = o.Type;
723 object f = o.GetValue (t.GetField ("field_i"));
725 f = o.GetValue (t.GetField ("field_s"));
726 AssertValue ("S", f);
727 f = o.GetValue (t.GetField ("field_enum"));
728 Assert.IsTrue (f is EnumMirror);
729 Assert.AreEqual (1, (f as EnumMirror).Value);
730 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
732 // Inherited object fields
733 TypeMirror parent = t.BaseType;
734 f = o.GetValue (parent.GetField ("base_field_i"));
736 f = o.GetValue (parent.GetField ("base_field_s"));
737 AssertValue ("T", f);
740 f = o.GetValue (o.Type.GetField ("static_i"));
744 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
745 Assert.AreEqual ("GClass`1", o2.Type.Name);
746 TypeMirror t2 = o2.Type;
747 f = o2.GetValue (t2.GetField ("field"));
750 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
751 Assert.AreEqual ("GClass`1", o3.Type.Name);
752 TypeMirror t3 = o3.Type;
753 f = o3.GetValue (t3.GetField ("field"));
754 AssertValue ("FOO", f);
757 AssertThrows<ArgumentNullException> (delegate () {
763 public void Object_GetValues () {
764 var e = run_until ("o1");
765 var frame = e.Thread.GetFrames () [0];
767 object val = frame.GetThis ();
768 Assert.IsTrue (val is ObjectMirror);
769 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
770 ObjectMirror o = (val as ObjectMirror);
772 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
774 TypeMirror t = o.Type;
776 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
780 AssertValue ("S", f);
783 AssertThrows<ArgumentNullException> (delegate () {
787 AssertThrows<ArgumentNullException> (delegate () {
788 o.GetValues (new FieldInfoMirror [] { null });
791 // field of another class
792 AssertThrows<ArgumentException> (delegate () {
793 o.GetValue (val2.Type.GetField ("field_j"));
797 void TestSetValue (ObjectMirror o, string field_name, object val) {
799 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
801 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
802 Value f = o.GetValue (o.Type.GetField (field_name));
803 AssertValue (val, f);
807 public void Object_SetValues () {
808 var e = run_until ("o1");
809 var frame = e.Thread.GetFrames () [0];
811 object val = frame.GetThis ();
812 Assert.IsTrue (val is ObjectMirror);
813 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
814 ObjectMirror o = (val as ObjectMirror);
816 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
818 TestSetValue (o, "field_i", 22);
819 TestSetValue (o, "field_bool1", false);
820 TestSetValue (o, "field_bool2", true);
821 TestSetValue (o, "field_char", 'B');
822 TestSetValue (o, "field_byte", (byte)129);
823 TestSetValue (o, "field_sbyte", (sbyte)-33);
824 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
825 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
826 TestSetValue (o, "field_long", Int64.MaxValue - 5);
827 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
828 TestSetValue (o, "field_float", 6.28f);
829 TestSetValue (o, "field_double", 6.28);
830 TestSetValue (o, "static_i", 23);
831 TestSetValue (o, "field_s", "CDEF");
836 f = o.GetValue (o.Type.GetField ("field_intptr"));
837 Assert.IsInstanceOfType (typeof (StructMirror), f);
838 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
842 FieldInfoMirror field = o.Type.GetField ("field_enum");
843 f = o.GetValue (field);
844 (f as EnumMirror).Value = 5;
845 o.SetValue (field, f);
846 f = o.GetValue (field);
847 Assert.AreEqual (5, (f as EnumMirror).Value);
850 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
851 f = o.GetValue (o.Type.GetField ("field_s"));
852 AssertValue (null, f);
855 field = o.Type.GetField ("generic_field_struct");
856 f = o.GetValue (field);
857 o.SetValue (field, f);
860 AssertThrows<ArgumentNullException> (delegate () {
861 o.SetValues (null, new Value [0]);
864 AssertThrows<ArgumentNullException> (delegate () {
865 o.SetValues (new FieldInfoMirror [0], null);
868 AssertThrows<ArgumentNullException> (delegate () {
869 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
872 // vtype with a wrong type
873 AssertThrows<ArgumentException> (delegate () {
874 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
877 // reference type not assignment compatible
878 AssertThrows<ArgumentException> (delegate () {
879 o.SetValue (o.Type.GetField ("field_class"), o);
882 // field of another class
883 AssertThrows<ArgumentException> (delegate () {
884 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
890 public void Type_SetValue () {
891 var e = run_until ("o1");
892 var frame = e.Thread.GetFrames () [0];
895 object val = frame.GetThis ();
896 Assert.IsTrue (val is ObjectMirror);
897 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
898 ObjectMirror o = (val as ObjectMirror);
900 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
902 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
903 f = o.Type.GetValue (o.Type.GetField ("static_i"));
906 o.Type.SetValue (o.Type.GetField ("static_s"), vm.RootDomain.CreateString ("B"));
907 f = o.Type.GetValue (o.Type.GetField ("static_s"));
908 AssertValue ("B", f);
911 AssertThrows<ArgumentNullException> (delegate () {
912 o.Type.SetValue (null, vm.CreateValue (0));
915 AssertThrows<ArgumentNullException> (delegate () {
916 o.Type.SetValue (o.Type.GetField ("static_i"), null);
919 // field of another class
920 AssertThrows<ArgumentException> (delegate () {
921 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
926 public void TypeInfo () {
927 Event e = run_until ("ti2");
928 StackFrame frame = e.Thread.GetFrames () [0];
933 t = frame.Method.GetParameters ()[0].ParameterType;
935 Assert.AreEqual ("String[]", t.Name);
936 Assert.AreEqual ("string[]", t.CSharpName);
937 Assert.AreEqual ("Array", t.BaseType.Name);
938 Assert.AreEqual (true, t.HasElementType);
939 Assert.AreEqual (true, t.IsArray);
940 Assert.AreEqual (1, t.GetArrayRank ());
941 Assert.AreEqual ("String", t.GetElementType ().Name);
943 t = frame.Method.GetParameters ()[2].ParameterType;
945 Assert.AreEqual ("Int32[,]", t.Name);
947 //Assert.AreEqual ("int[,]", t.CSharpName);
948 Assert.AreEqual ("Array", t.BaseType.Name);
949 Assert.AreEqual (true, t.HasElementType);
950 Assert.AreEqual (true, t.IsArray);
951 Assert.AreEqual (2, t.GetArrayRank ());
952 Assert.AreEqual ("Int32", t.GetElementType ().Name);
955 t = frame.Method.GetParameters ()[3].ParameterType;
957 //Assert.AreEqual ("Int32&", t.Name);
958 //Assert.AreEqual (true, t.IsByRef);
959 //Assert.AreEqual (true, t.HasElementType);
962 t = frame.Method.GetParameters ()[4].ParameterType;
964 //Assert.AreEqual ("Int32*", t.Name);
965 Assert.AreEqual (true, t.IsPointer);
966 Assert.AreEqual (true, t.HasElementType);
967 Assert.AreEqual ("Int32", t.GetElementType ().Name);
968 Assert.AreEqual (false, t.IsPrimitive);
971 t = frame.Method.GetParameters ()[5].ParameterType;
972 Assert.AreEqual (true, t.IsPrimitive);
975 t = frame.Method.GetParameters ()[6].ParameterType;
976 Assert.AreEqual ("AStruct", t.Name);
977 Assert.AreEqual (false, t.IsPrimitive);
978 Assert.AreEqual (true, t.IsValueType);
979 Assert.AreEqual (false, t.IsClass);
982 t = frame.Method.GetParameters ()[7].ParameterType;
983 Assert.AreEqual ("Tests", t.Name);
984 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
985 Assert.AreEqual (1, nested.Length);
986 Assert.AreEqual ("NestedClass", nested [0].Name);
987 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
988 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
991 t = frame.Method.GetParameters ()[9].ParameterType;
992 Assert.AreEqual ("GClass`1", t.Name);
995 t = frame.Method.GetParameters ()[10].ParameterType;
996 Assert.AreEqual ("AnEnum", t.Name);
997 Assert.IsTrue (t.IsEnum);
998 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
1001 t = frame.Method.GetParameters ()[7].ParameterType;
1003 var props = t.GetProperties ();
1004 Assert.AreEqual (3, props.Length);
1005 foreach (PropertyInfoMirror prop in props) {
1006 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1008 if (prop.Name == "IntProperty") {
1009 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1010 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1011 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1012 Assert.AreEqual (0, indexes.Length);
1013 } else if (prop.Name == "ReadOnlyProperty") {
1014 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1015 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1016 Assert.AreEqual (null, prop.GetSetMethod ());
1017 Assert.AreEqual (0, indexes.Length);
1018 } else if (prop.Name == "IndexedProperty") {
1019 Assert.AreEqual (1, indexes.Length);
1020 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1024 // custom attributes
1025 t = frame.Method.GetParameters ()[8].ParameterType;
1026 Assert.AreEqual ("Tests2", t.Name);
1027 var attrs = t.GetCustomAttributes (true);
1028 Assert.AreEqual (2, attrs.Length);
1029 foreach (var attr in attrs) {
1030 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1031 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1032 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1033 Assert.AreEqual (2, attr.NamedArguments.Count);
1034 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1035 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1036 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1037 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1038 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1039 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1040 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1041 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1042 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1044 Assert.Fail (attr.Constructor.DeclaringType.Name);
1050 public void FieldInfo () {
1051 Event e = run_until ("ti2");
1052 StackFrame frame = e.Thread.GetFrames () [0];
1056 t = frame.Method.GetParameters ()[8].ParameterType;
1057 Assert.AreEqual ("Tests2", t.Name);
1059 var fi = t.GetField ("field_j");
1060 var attrs = fi.GetCustomAttributes (true);
1061 Assert.AreEqual (1, attrs.Length);
1062 var attr = attrs [0];
1063 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1064 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1065 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1066 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1070 public void PropertyInfo () {
1071 Event e = run_until ("ti2");
1072 StackFrame frame = e.Thread.GetFrames () [0];
1076 t = frame.Method.GetParameters ()[8].ParameterType;
1077 Assert.AreEqual ("Tests2", t.Name);
1079 var pi = t.GetProperty ("AProperty");
1080 var attrs = pi.GetCustomAttributes (true);
1081 Assert.AreEqual (1, attrs.Length);
1082 var attr = attrs [0];
1083 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1084 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1085 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1086 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1090 public void Type_GetValue () {
1091 Event e = run_until ("o1");
1092 StackFrame frame = e.Thread.GetFrames () [0];
1094 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1096 TypeMirror t = o.Type;
1098 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1101 object f = t.GetValue (o.Type.GetField ("static_i"));
1102 AssertValue (55, f);
1104 f = t.GetValue (o.Type.GetField ("static_s"));
1105 AssertValue ("A", f);
1107 // literal static fields
1108 f = t.GetValue (o.Type.GetField ("literal_i"));
1109 AssertValue (56, f);
1111 f = t.GetValue (o.Type.GetField ("literal_s"));
1112 AssertValue ("B", f);
1114 // Inherited static fields
1115 TypeMirror parent = t.BaseType;
1116 f = t.GetValue (parent.GetField ("base_static_i"));
1117 AssertValue (57, f);
1119 f = t.GetValue (parent.GetField ("base_static_s"));
1120 AssertValue ("C", f);
1122 // Argument checking
1123 AssertThrows<ArgumentNullException> (delegate () {
1128 AssertThrows<ArgumentException> (delegate () {
1129 t.GetValue (o.Type.GetField ("field_i"));
1132 // field on another type
1133 AssertThrows<ArgumentException> (delegate () {
1134 t.GetValue (val2.Type.GetField ("static_field_j"));
1137 // special static field
1138 AssertThrows<ArgumentException> (delegate () {
1139 t.GetValue (t.GetField ("tls_i"));
1144 public void Type_GetValues () {
1145 Event e = run_until ("o1");
1146 StackFrame frame = e.Thread.GetFrames () [0];
1148 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1150 TypeMirror t = o.Type;
1153 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1154 object f = vals [0];
1155 AssertValue (55, f);
1158 AssertValue ("A", f);
1160 // Argument checking
1161 AssertThrows<ArgumentNullException> (delegate () {
1165 AssertThrows<ArgumentNullException> (delegate () {
1166 t.GetValues (new FieldInfoMirror [] { null });
1171 public void ObjRefs () {
1172 Event e = run_until ("objrefs1");
1173 StackFrame frame = e.Thread.GetFrames () [0];
1175 ObjectMirror o = frame.GetThis () as ObjectMirror;
1176 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1178 Assert.IsTrue (child.Address > 0);
1180 // Check that object references are internalized correctly
1181 Assert.AreEqual (o, frame.GetThis ());
1183 run_until ("objrefs2");
1185 // child should be gc'd now
1186 Assert.IsTrue (child.IsCollected);
1188 AssertThrows<ObjectCollectedException> (delegate () {
1189 TypeMirror t = child.Type;
1192 AssertThrows<ObjectCollectedException> (delegate () {
1193 long addr = child.Address;
1198 public void Type_GetObject () {
1199 Event e = run_until ("o1");
1200 StackFrame frame = e.Thread.GetFrames () [0];
1202 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1204 TypeMirror t = o.Type;
1206 Assert.AreEqual ("MonoType", t.GetTypeObject ().Type.Name);
1210 public void VTypes () {
1211 Event e = run_until ("vtypes1");
1212 StackFrame frame = e.Thread.GetFrames () [0];
1215 ObjectMirror o = frame.GetThis () as ObjectMirror;
1216 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1217 Assert.IsTrue (obj is StructMirror);
1218 var s = obj as StructMirror;
1219 Assert.AreEqual ("AStruct", s.Type.Name);
1220 AssertValue (42, s ["i"]);
1222 AssertValue ("S", obj);
1223 AssertValue (43, s ["k"]);
1224 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1225 Assert.IsTrue (obj is StructMirror);
1226 s = obj as StructMirror;
1227 Assert.AreEqual ("AStruct", s.Type.Name);
1228 AssertValue (42, s ["i"]);
1230 // vtypes as arguments
1231 s = frame.GetArgument (0) as StructMirror;
1232 AssertValue (44, s ["i"]);
1234 AssertValue ("T", obj);
1235 AssertValue (45, s ["k"]);
1237 // vtypes as array entries
1238 var arr = frame.GetArgument (1) as ArrayMirror;
1240 Assert.IsTrue (obj is StructMirror);
1241 s = obj as StructMirror;
1242 AssertValue (1, s ["i"]);
1243 AssertValue ("S1", s ["s"]);
1245 Assert.IsTrue (obj is StructMirror);
1246 s = obj as StructMirror;
1247 AssertValue (2, s ["i"]);
1248 AssertValue ("S2", s ["s"]);
1250 // Argument checking
1251 s = frame.GetArgument (0) as StructMirror;
1252 AssertThrows<ArgumentException> (delegate () {
1256 // generic vtype instances
1257 o = frame.GetThis () as ObjectMirror;
1258 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1259 Assert.IsTrue (obj is StructMirror);
1260 s = obj as StructMirror;
1261 Assert.AreEqual ("GStruct`1", s.Type.Name);
1262 AssertValue (42, s ["i"]);
1264 // this on vtype methods
1265 e = run_until ("vtypes2");
1267 e = single_step (e.Thread);
1269 frame = e.Thread.GetFrames () [0];
1271 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1272 obj = frame.GetThis ();
1274 Assert.IsTrue (obj is StructMirror);
1275 s = obj as StructMirror;
1276 AssertValue (44, s ["i"]);
1277 AssertValue ("T", s ["s"]);
1278 AssertValue (45, s ["k"]);
1280 // this on static vtype methods
1281 e = run_until ("vtypes3");
1283 e = single_step (e.Thread);
1285 frame = e.Thread.GetFrames () [0];
1287 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
1288 obj = frame.GetThis ();
1289 AssertValue (null, obj);
1293 public void AssemblyInfo () {
1294 Event e = run_until ("single_stepping");
1296 StackFrame frame = e.Thread.GetFrames () [0];
1298 var aname = frame.Method.DeclaringType.Assembly.GetName ();
1299 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
1301 ModuleMirror m = frame.Method.DeclaringType.Module;
1303 Assert.AreEqual ("dtest-app.exe", m.Name);
1304 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
1305 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
1306 Guid guid = m.ModuleVersionId;
1307 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
1308 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
1310 Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
1312 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
1313 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
1317 public void LocalsInfo () {
1318 Event e = run_until ("locals2");
1320 StackFrame frame = e.Thread.GetFrames () [0];
1322 var locals = frame.Method.GetLocals ();
1323 Assert.AreEqual (5, locals.Length);
1324 for (int i = 0; i < 5; ++i) {
1325 if (locals [i].Name == "args") {
1326 Assert.IsTrue (locals [i].IsArg);
1327 Assert.AreEqual ("String[]", locals [i].Type.Name);
1328 } else if (locals [i].Name == "arg") {
1329 Assert.IsTrue (locals [i].IsArg);
1330 Assert.AreEqual ("Int32", locals [i].Type.Name);
1331 } else if (locals [i].Name == "i") {
1332 Assert.IsFalse (locals [i].IsArg);
1333 Assert.AreEqual ("Int64", locals [i].Type.Name);
1334 } else if (locals [i].Name == "j") {
1335 Assert.IsFalse (locals [i].IsArg);
1336 Assert.AreEqual ("Int32", locals [i].Type.Name);
1337 } else if (locals [i].Name == "s") {
1338 Assert.IsFalse (locals [i].IsArg);
1339 Assert.AreEqual ("String", locals [i].Type.Name);
1347 public void Locals () {
1348 var be = run_until ("locals1");
1350 StackFrame frame = be.Thread.GetFrames () [0];
1352 MethodMirror m1 = frame.Method;
1354 be = run_until ("locals2");
1356 frame = be.Thread.GetFrames () [0];
1358 object val = frame.GetValue (frame.Method.GetLocal ("i"));
1359 AssertValue (0, val);
1362 var req = vm.CreateStepRequest (be.Thread);
1366 var e = vm.GetNextEvent ();
1367 Assert.IsTrue (e is StepEvent);
1368 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1370 // Execute s = "AB";
1372 e = vm.GetNextEvent ();
1373 Assert.IsTrue (e is StepEvent);
1374 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1376 frame = e.Thread.GetFrames () [0];
1378 val = frame.GetValue (frame.Method.GetLocal ("i"));
1379 AssertValue (42, val);
1381 LocalVariable[] locals = frame.Method.GetLocals ();
1382 var vals = frame.GetValues (locals);
1383 Assert.AreEqual (locals.Length, vals.Length);
1384 for (int i = 0; i < locals.Length; ++i) {
1385 if (locals [i].Name == "i")
1386 AssertValue (42, vals [i]);
1387 if (locals [i].Name == "s")
1388 AssertValue ("AB", vals [i]);
1391 // Argument checking
1394 AssertThrows<ArgumentNullException> (delegate () {
1395 frame.GetValue ((LocalVariable)null);
1397 // GetValue () local from another method
1398 AssertThrows<ArgumentException> (delegate () {
1399 frame.GetValue (m1.GetLocal ("foo"));
1403 AssertThrows<ArgumentNullException> (delegate () {
1404 frame.GetValue ((ParameterInfoMirror)null);
1406 // GetValue () local from another method
1407 AssertThrows<ArgumentException> (delegate () {
1408 frame.GetValue (m1.GetParameters ()[0]);
1411 // GetValues () null
1412 AssertThrows<ArgumentNullException> (delegate () {
1413 frame.GetValues (null);
1415 // GetValues () embedded null
1416 AssertThrows<ArgumentNullException> (delegate () {
1417 frame.GetValues (new LocalVariable [] { null });
1419 // GetValues () local from another method
1420 AssertThrows<ArgumentException> (delegate () {
1421 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
1424 AssertThrows<ArgumentException> (delegate () {
1425 val = frame.GetValue (frame.Method.ReturnParameter);
1428 // invalid stack frames
1430 e = vm.GetNextEvent ();
1431 Assert.IsTrue (e is StepEvent);
1432 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1434 AssertThrows<InvalidStackFrameException> (delegate () {
1435 frame.GetValue (frame.Method.GetLocal ("i"));
1442 public void GetVisibleVariables () {
1443 Event e = run_until ("locals4");
1446 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1447 Assert.AreEqual (2, locals.Count);
1448 var loc = locals.First (l => l.Name == "i");
1449 Assert.AreEqual ("Int64", loc.Type.Name);
1450 loc = locals.First (l => l.Name == "s");
1451 Assert.AreEqual ("String", loc.Type.Name);
1453 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1454 Assert.AreEqual ("i", loc.Name);
1455 Assert.AreEqual ("Int64", loc.Type.Name);
1457 e = run_until ("locals5");
1460 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1461 Assert.AreEqual (2, locals.Count);
1462 loc = locals.First (l => l.Name == "i");
1463 Assert.AreEqual ("String", loc.Type.Name);
1464 loc = locals.First (l => l.Name == "s");
1465 Assert.AreEqual ("String", loc.Type.Name);
1467 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1468 Assert.AreEqual ("i", loc.Name);
1469 Assert.AreEqual ("String", loc.Type.Name);
1471 // Variable in another scope
1472 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
1473 Assert.IsNull (loc);
1477 public void Exit () {
1482 var e = vm.GetNextEvent ();
1483 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
1486 /* Could be a remote vm with no process */
1489 Assert.AreEqual (5, p.ExitCode);
1492 AssertThrows<VMDisconnectedException> (delegate () {
1501 public void Dispose () {
1506 var e = vm.GetNextEvent ();
1507 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
1510 /* Could be a remote vm with no process */
1513 Assert.AreEqual (3, p.ExitCode);
1516 AssertThrows<VMDisconnectedException> (delegate () {
1525 public void LineNumbers () {
1526 Event e = run_until ("line_numbers");
1528 step_req = vm.CreateStepRequest (e.Thread);
1529 step_req.Depth = StepDepth.Into;
1536 e = vm.GetNextEvent ();
1537 Assert.IsTrue (e is StepEvent);
1539 l = e.Thread.GetFrames ()[0].Location;
1541 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
1542 Assert.AreEqual ("ln1", l.Method.Name);
1544 int line_base = l.LineNumber;
1547 e = vm.GetNextEvent ();
1548 Assert.IsTrue (e is StepEvent);
1549 l = e.Thread.GetFrames ()[0].Location;
1550 Assert.AreEqual ("ln2", l.Method.Name);
1551 Assert.AreEqual (line_base + 6, l.LineNumber);
1554 e = vm.GetNextEvent ();
1555 Assert.IsTrue (e is StepEvent);
1556 l = e.Thread.GetFrames ()[0].Location;
1557 Assert.AreEqual ("ln1", l.Method.Name);
1558 Assert.AreEqual (line_base + 1, l.LineNumber);
1561 e = vm.GetNextEvent ();
1562 Assert.IsTrue (e is StepEvent);
1563 l = e.Thread.GetFrames ()[0].Location;
1564 Assert.AreEqual ("ln3", l.Method.Name);
1565 Assert.AreEqual (line_base + 10, l.LineNumber);
1568 e = vm.GetNextEvent ();
1569 Assert.IsTrue (e is StepEvent);
1570 l = e.Thread.GetFrames ()[0].Location;
1571 Assert.AreEqual ("ln1", l.Method.Name);
1572 Assert.AreEqual (line_base + 2, l.LineNumber);
1574 // GetSourceFiles ()
1575 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
1576 Assert.AreEqual (1, sources.Length);
1577 Assert.AreEqual ("dtest-app.cs", sources [0]);
1579 sources = l.Method.DeclaringType.GetSourceFiles (true);
1580 Assert.AreEqual (1, sources.Length);
1581 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
1585 public void Suspend () {
1588 Start (new string [] { "dtest-app.exe", "suspend-test" });
1590 Event e = run_until ("suspend");
1592 ThreadMirror main = e.Thread;
1600 // The debuggee should be suspended while it is running the infinite loop
1602 StackFrame frame = main.GetFrames ()[0];
1603 Assert.AreEqual ("suspend", frame.Method.Name);
1607 // resuming when not suspended
1608 AssertThrows<InvalidOperationException> (delegate () {
1618 public void AssemblyLoad () {
1619 Event e = run_until ("assembly_load");
1623 e = vm.GetNextEvent ();
1624 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
1625 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
1627 var frames = e.Thread.GetFrames ();
1628 Assert.IsTrue (frames.Length > 0);
1629 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
1633 public void CreateValue () {
1636 v = vm.CreateValue (1);
1637 Assert.AreEqual (vm, v.VirtualMachine);
1638 Assert.AreEqual (1, v.Value);
1640 v = vm.CreateValue (null);
1641 Assert.AreEqual (vm, v.VirtualMachine);
1642 Assert.AreEqual (null, v.Value);
1644 // Argument checking
1645 AssertThrows <ArgumentException> (delegate () {
1646 v = vm.CreateValue ("FOO");
1651 public void CreateString () {
1652 StringMirror s = vm.RootDomain.CreateString ("ABC");
1654 Assert.AreEqual (vm, s.VirtualMachine);
1655 Assert.AreEqual ("ABC", s.Value);
1656 Assert.AreEqual (vm.RootDomain, s.Domain);
1659 StringBuilder sb = new StringBuilder ();
1660 for (int i = 0; i < 1024; ++i)
1662 s = vm.RootDomain.CreateString (sb.ToString ());
1664 // Argument checking
1665 AssertThrows <ArgumentNullException> (delegate () {
1666 s = vm.RootDomain.CreateString (null);
1672 public void CreateBoxedValue () {
1673 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
1675 Assert.AreEqual ("Int32", o.Type.Name);
1676 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
1678 // Argument checking
1679 AssertThrows <ArgumentNullException> (delegate () {
1680 vm.RootDomain.CreateBoxedValue (null);
1683 AssertThrows <ArgumentException> (delegate () {
1684 vm.RootDomain.CreateBoxedValue (o);
1689 public void Invoke () {
1690 Event e = run_until ("invoke1");
1692 StackFrame frame = e.Thread.GetFrames () [0];
1694 TypeMirror t = frame.Method.DeclaringType;
1695 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
1697 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
1703 m = t.GetMethod ("invoke_return_void");
1704 v = this_obj.InvokeMethod (e.Thread, m, null);
1708 m = t.GetMethod ("invoke_return_ref");
1709 v = this_obj.InvokeMethod (e.Thread, m, null);
1710 AssertValue ("ABC", v);
1713 m = t.GetMethod ("invoke_return_null");
1714 v = this_obj.InvokeMethod (e.Thread, m, null);
1715 AssertValue (null, v);
1718 m = t.GetMethod ("invoke_return_primitive");
1719 v = this_obj.InvokeMethod (e.Thread, m, null);
1720 AssertValue (42, v);
1723 m = t.GetMethod ("invoke_pass_primitive");
1724 Value[] args = new Value [] {
1725 vm.CreateValue ((byte)Byte.MaxValue),
1726 vm.CreateValue ((sbyte)SByte.MaxValue),
1727 vm.CreateValue ((short)1),
1728 vm.CreateValue ((ushort)1),
1729 vm.CreateValue ((int)1),
1730 vm.CreateValue ((uint)1),
1731 vm.CreateValue ((long)1),
1732 vm.CreateValue ((ulong)1),
1733 vm.CreateValue ('A'),
1734 vm.CreateValue (true),
1735 vm.CreateValue (3.14f),
1736 vm.CreateValue (3.14) };
1738 v = this_obj.InvokeMethod (e.Thread, m, args);
1739 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
1742 m = t.GetMethod ("invoke_pass_ref");
1743 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1744 AssertValue ("ABC", v);
1747 m = t.GetMethod ("invoke_pass_ref");
1748 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
1749 AssertValue (null, v);
1752 m = t.GetMethod ("invoke_static_pass_ref");
1753 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1754 AssertValue ("ABC", v);
1756 // static invoked using ObjectMirror.InvokeMethod
1757 m = t.GetMethod ("invoke_static_pass_ref");
1758 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1759 AssertValue ("ABC", v);
1761 // method which throws an exception
1763 m = t.GetMethod ("invoke_throws");
1764 v = this_obj.InvokeMethod (e.Thread, m, null);
1766 } catch (InvocationException ex) {
1767 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
1771 m = t.GetMethod (".ctor");
1772 v = t.InvokeMethod (e.Thread, m, null);
1773 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
1774 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
1776 // Argument checking
1779 AssertThrows<ArgumentNullException> (delegate {
1780 m = t.GetMethod ("invoke_pass_ref");
1781 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
1785 AssertThrows<ArgumentNullException> (delegate {
1786 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
1789 // invalid number of arguments
1790 m = t.GetMethod ("invoke_pass_ref");
1791 AssertThrows<ArgumentException> (delegate {
1792 v = this_obj.InvokeMethod (e.Thread, m, null);
1795 // invalid type of argument (ref != primitive)
1796 m = t.GetMethod ("invoke_pass_ref");
1797 AssertThrows<ArgumentException> (delegate {
1798 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
1801 // invalid type of argument (primitive != primitive)
1802 m = t.GetMethod ("invoke_pass_primitive_2");
1803 AssertThrows<ArgumentException> (delegate {
1804 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
1807 // invoking a non-static method as static
1808 m = t.GetMethod ("invoke_pass_ref");
1809 AssertThrows<ArgumentException> (delegate {
1810 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
1813 // invoking a method defined in another class
1814 m = t2.GetMethod ("invoke");
1815 AssertThrows<ArgumentException> (delegate {
1816 v = this_obj.InvokeMethod (e.Thread, m, null);
1821 public void InvokeVType () {
1822 Event e = run_until ("invoke1");
1824 StackFrame frame = e.Thread.GetFrames () [0];
1826 var s = frame.GetArgument (1) as StructMirror;
1828 TypeMirror t = s.Type;
1833 // Pass struct as this, receive int
1834 m = t.GetMethod ("invoke_return_int");
1835 v = s.InvokeMethod (e.Thread, m, null);
1836 AssertValue (42, v);
1838 // Pass struct as this, receive intptr
1839 m = t.GetMethod ("invoke_return_intptr");
1840 v = s.InvokeMethod (e.Thread, m, null);
1841 AssertValue (43, v);
1844 m = t.GetMethod ("invoke_static");
1845 v = t.InvokeMethod (e.Thread, m, null);
1848 // Pass generic struct as this
1849 s = frame.GetArgument (2) as StructMirror;
1851 m = t.GetMethod ("invoke_return_int");
1852 v = s.InvokeMethod (e.Thread, m, null);
1853 AssertValue (42, v);
1857 public void BreakpointDuringInvoke () {
1858 Event e = run_until ("invoke1");
1860 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
1861 Assert.IsNotNull (m);
1862 vm.SetBreakpoint (m, 0);
1864 StackFrame frame = e.Thread.GetFrames () [0];
1865 var o = frame.GetThis () as ObjectMirror;
1867 bool failed = false;
1869 bool finished = false;
1870 object wait = new object ();
1872 // Have to invoke in a separate thread as the invoke is suspended until we
1873 // resume after the breakpoint
1874 Thread t = new Thread (delegate () {
1876 o.InvokeMethod (e.Thread, m, null);
1882 Monitor.Pulse (wait);
1888 StackFrame invoke_frame = null;
1891 e = vm.GetNextEvent ();
1892 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
1893 // Check stack trace support and invokes
1894 var frames = e.Thread.GetFrames ();
1895 invoke_frame = frames [0];
1896 Assert.AreEqual ("invoke2", frames [0].Method.Name);
1897 Assert.IsTrue (frames [0].IsDebuggerInvoke);
1898 Assert.AreEqual ("invoke1", frames [1].Method.Name);
1903 // Check that the invoke frames are no longer valid
1904 AssertThrows<InvalidStackFrameException> (delegate {
1905 invoke_frame.GetThis ();
1910 Monitor.Wait (wait);
1913 // Check InvokeOptions.DisableBreakpoints flag
1914 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
1918 public void DisabledExceptionDuringInvoke () {
1919 Event e = run_until ("invoke_ex");
1921 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
1923 StackFrame frame = e.Thread.GetFrames () [0];
1924 var o = frame.GetThis () as ObjectMirror;
1926 var req = vm.CreateExceptionRequest (null);
1929 // Check InvokeOptions.DisableBreakpoints flag
1930 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
1936 public void InvokeSingleThreaded () {
1939 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
1941 Event e = run_until ("invoke_single_threaded_2");
1943 StackFrame f = e.Thread.GetFrames ()[0];
1945 var obj = f.GetThis () as ObjectMirror;
1947 // Check that the counter value incremented by the other thread does not increase
1948 // during the invoke.
1949 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
1951 var m = obj.Type.GetMethod ("invoke_return_void");
1952 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
1954 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
1956 Assert.AreEqual ((int)counter1, (int)counter2);
1958 // Test multiple invokes done in succession
1959 m = obj.Type.GetMethod ("invoke_return_void");
1960 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
1962 // Test events during single-threaded invokes
1963 vm.EnableEvents (EventType.TypeLoad);
1964 m = obj.Type.GetMethod ("invoke_type_load");
1965 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
1969 e = vm.GetNextEvent ();
1970 Assert.AreEqual (EventType.TypeLoad, e.EventType);
1974 public void GetThreads () {
1979 public void Threads () {
1980 Event e = run_until ("threads");
1982 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
1984 Assert.IsTrue (e.Thread.ThreadId > 0);
1986 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
1990 e = vm.GetNextEvent ();
1991 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
1992 var state = e.Thread.ThreadState;
1993 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
1997 e = vm.GetNextEvent ();
1998 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
1999 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
2003 public void Frame_SetValue () {
2004 Event e = run_until ("locals2");
2006 StackFrame frame = e.Thread.GetFrames () [0];
2009 var l = frame.Method.GetLocal ("i");
2010 frame.SetValue (l, vm.CreateValue ((long)55));
2011 AssertValue (55, frame.GetValue (l));
2014 l = frame.Method.GetLocal ("s");
2015 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
2016 AssertValue ("DEF", frame.GetValue (l));
2018 // argument as local
2019 l = frame.Method.GetLocal ("arg");
2020 frame.SetValue (l, vm.CreateValue (6));
2021 AssertValue (6, frame.GetValue (l));
2024 var p = frame.Method.GetParameters ()[1];
2025 frame.SetValue (p, vm.CreateValue (7));
2026 AssertValue (7, frame.GetValue (p));
2028 // argument checking
2031 AssertThrows<ArgumentNullException> (delegate () {
2032 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
2036 AssertThrows<ArgumentNullException> (delegate () {
2037 l = frame.Method.GetLocal ("i");
2038 frame.SetValue (l, null);
2041 // value of invalid type
2042 AssertThrows<ArgumentException> (delegate () {
2043 l = frame.Method.GetLocal ("i");
2044 frame.SetValue (l, vm.CreateValue (55));
2049 public void InvokeRegress () {
2050 Event e = run_until ("invoke1");
2052 StackFrame frame = e.Thread.GetFrames () [0];
2054 TypeMirror t = frame.Method.DeclaringType;
2055 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2057 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2063 m = t.GetMethod ("invoke_return_void");
2064 v = this_obj.InvokeMethod (e.Thread, m, null);
2067 // Check that the stack frames remain valid during the invoke
2068 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
2070 // do another invoke
2071 m = t.GetMethod ("invoke_return_void");
2072 v = this_obj.InvokeMethod (e.Thread, m, null);
2075 // Try a single step after the invoke
2076 var req = vm.CreateStepRequest (e.Thread);
2077 req.Depth = StepDepth.Into;
2078 req.Size = StepSize.Line;
2083 // Step into invoke2
2085 e = vm.GetNextEvent ();
2086 Assert.IsTrue (e is StepEvent);
2087 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
2091 frame = e.Thread.GetFrames () [0];
2095 public void Exceptions () {
2096 Event e = run_until ("exceptions");
2097 var req = vm.CreateExceptionRequest (null);
2102 e = vm.GetNextEvent ();
2103 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2104 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2106 var frames = e.Thread.GetFrames ();
2107 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2110 // exception type filter
2112 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
2115 // Skip the throwing of the second OverflowException
2118 e = vm.GetNextEvent ();
2119 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2120 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
2123 // exception type filter for subclasses
2124 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
2129 e = vm.GetNextEvent ();
2130 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2131 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2134 // Implicit exceptions
2135 req = vm.CreateExceptionRequest (null);
2140 e = vm.GetNextEvent ();
2141 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2142 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2145 // Argument checking
2146 AssertThrows<ArgumentException> (delegate {
2147 vm.CreateExceptionRequest (e.Thread.Type);
2152 public void EventSets () {
2154 // Create two filter which both match the same exception
2156 Event e = run_until ("exceptions");
2158 var req = vm.CreateExceptionRequest (null);
2161 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
2166 var es = vm.GetNextEventSet ();
2167 Assert.AreEqual (2, es.Events.Length);
2170 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2171 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2174 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2175 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2182 // Test single threaded invokes during processing of nullref exceptions.
2183 // These won't work if the exception handling is done from the sigsegv signal
2184 // handler, since the sigsegv signal is disabled until control returns from the
2188 [Category ("only3")]
2189 public void NullRefExceptionAndSingleThreadedInvoke () {
2190 Event e = run_until ("exceptions");
2191 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
2196 e = vm.GetNextEvent ();
2197 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2198 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2200 var ex = (e as ExceptionEvent).Exception;
2201 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2202 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
2206 public void Domains () {
2209 Start (new string [] { "dtest-app.exe", "domain-test" });
2211 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
2213 Event e = run_until ("domains");
2217 e = vm.GetNextEvent ();
2218 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
2220 var domain = (e as AppDomainCreateEvent).Domain;
2222 // Run until the callback in the domain
2223 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
2224 Assert.IsNotNull (m);
2225 vm.SetBreakpoint (m, 0);
2229 e = vm.GetNextEvent ();
2230 if (e is BreakpointEvent)
2234 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
2236 // d_method is from another domain
2237 MethodMirror d_method = (e as BreakpointEvent).Method;
2238 Assert.IsTrue (m != d_method);
2240 var frames = e.Thread.GetFrames ();
2241 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
2242 Assert.AreEqual ("invoke", frames [1].Method.Name);
2243 Assert.AreEqual ("domains", frames [2].Method.Name);
2245 // Test breakpoints on already JITted methods in other domains
2246 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
2247 Assert.IsNotNull (m);
2248 vm.SetBreakpoint (m, 0);
2252 e = vm.GetNextEvent ();
2253 if (e is BreakpointEvent)
2257 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
2259 // This is empty when receiving the AppDomainCreateEvent
2260 Assert.AreEqual ("domain", domain.FriendlyName);
2262 // Run until the unload
2265 e = vm.GetNextEvent ();
2266 if (e is AssemblyUnloadEvent) {
2272 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
2273 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
2275 // Run past the unload
2276 e = run_until ("domains_2");
2278 // Test access to unloaded types
2279 // FIXME: Add an exception type for this
2280 AssertThrows<Exception> (delegate {
2281 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
2286 public void DynamicMethods () {
2287 Event e = run_until ("dyn_call");
2289 var m = e.Thread.GetFrames ()[1].Method;
2290 Assert.AreEqual ("dyn_method", m.Name);
2292 // Test access to IL
2293 var body = m.GetMethodBody ();
2295 ILInstruction ins = body.Instructions [0];
2296 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2297 Assert.AreEqual ("FOO", ins.Operand);
2301 public void RefEmit () {
2304 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
2306 Event e = run_until ("ref_emit_call");
2308 var m = e.Thread.GetFrames ()[1].Method;
2309 Assert.AreEqual ("ref_emit_method", m.Name);
2311 // Test access to IL
2312 var body = m.GetMethodBody ();
2316 ins = body.Instructions [0];
2317 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2318 Assert.AreEqual ("FOO", ins.Operand);
2320 ins = body.Instructions [1];
2321 Assert.AreEqual (OpCodes.Call, ins.OpCode);
2322 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
2323 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
2327 public void IsAttached () {
2328 var f = entry_point.DeclaringType.GetField ("is_attached");
2330 Event e = run_until ("Main");
2332 AssertValue (true, entry_point.DeclaringType.GetValue (f));
2336 public void StackTraceInNative () {
2337 // Check that stack traces can be produced for threads in native code
2340 Start (new string [] { "dtest-app.exe", "frames-in-native" });
2342 var e = run_until ("frames_in_native");
2344 // FIXME: This is racy
2351 StackFrame[] frames = e.Thread.GetFrames ();
2353 int frame_index = -1;
2354 for (int i = 0; i < frames.Length; ++i) {
2355 if (frames [i].Method.Name == "Sleep") {
2361 Assert.IsTrue (frame_index != -1);
2362 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
2363 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
2364 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
2366 // Check that invokes are disabled for such threads
2367 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
2370 var m = t.GetMethod ("invoke_static_return_void");
2371 AssertThrows<InvalidOperationException> (delegate {
2372 t.InvokeMethod (e.Thread, m, null);
2377 public void VirtualMachine_CreateEnumMirror () {
2378 var e = run_until ("o1");
2379 var frame = e.Thread.GetFrames () [0];
2381 object val = frame.GetThis ();
2382 Assert.IsTrue (val is ObjectMirror);
2383 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
2384 ObjectMirror o = (val as ObjectMirror);
2386 FieldInfoMirror field = o.Type.GetField ("field_enum");
2387 Value f = o.GetValue (field);
2388 TypeMirror enumType = (f as EnumMirror).Type;
2390 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
2391 f = o.GetValue (field);
2392 Assert.AreEqual (1, (f as EnumMirror).Value);
2394 // Argument checking
2395 AssertThrows<ArgumentNullException> (delegate () {
2396 vm.CreateEnumMirror (enumType, null);
2399 AssertThrows<ArgumentNullException> (delegate () {
2400 vm.CreateEnumMirror (null, vm.CreateValue (1));
2404 AssertThrows<ArgumentException> (delegate () {
2405 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
2408 // value of a wrong type
2409 AssertThrows<ArgumentException> (delegate () {
2410 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
2415 public void VirtualMachine_EnableEvents_Breakpoint () {
2416 AssertThrows<ArgumentException> (delegate () {
2417 vm.EnableEvents (EventType.Breakpoint);