]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - packages/Python/lldbsuite/test/lang/go/expressions/TestExpressions.py
Vendor import of lldb trunk r338536:
[FreeBSD/FreeBSD.git] / packages / Python / lldbsuite / test / lang / go / expressions / TestExpressions.py
1 """Test the go expression parser/interpreter."""
2
3 import os
4 import time
5 import unittest2
6 import lldb
7 from lldbsuite.test.decorators import *
8 from lldbsuite.test.lldbtest import *
9 from lldbsuite.test import lldbutil
10
11
12 class TestGoUserExpression(TestBase):
13
14     mydir = TestBase.compute_mydir(__file__)
15
16     @add_test_categories(['pyapi'])
17     @skipIfRemote  # Not remote test suit ready
18     @skipIfFreeBSD  # Test hanging on FreeBSD - llvm.org/pr37194
19     @skipUnlessGoInstalled
20     def test_with_dsym_and_python_api(self):
21         """Test GoASTUserExpress."""
22         self.buildGo()
23         self.launchProcess()
24         self.go_expressions()
25
26     def setUp(self):
27         # Call super's setUp().
28         TestBase.setUp(self)
29         # Find the line numbers to break inside main().
30         self.main_source = "main.go"
31         self.break_line = line_number(
32             self.main_source, '// Set breakpoint here.')
33
34     def check_builtin(self, name, size=0, typeclass=lldb.eTypeClassBuiltin):
35         tl = self.target().FindTypes(name)
36         self.assertEqual(1, len(tl))
37         t = list(tl)[0]
38         self.assertEqual(name, t.name)
39         self.assertEqual(typeclass, t.type)
40         if size > 0:
41             self.assertEqual(size, t.size)
42
43     def launchProcess(self):
44         exe = self.getBuildArtifact("a.out")
45
46         target = self.dbg.CreateTarget(exe)
47         self.assertTrue(target, VALID_TARGET)
48
49         bpt = target.BreakpointCreateByLocation(
50             self.main_source, self.break_line)
51         self.assertTrue(bpt, VALID_BREAKPOINT)
52
53         # Now launch the process, and do not stop at entry point.
54         process = target.LaunchSimple(
55             None, None, self.get_process_working_directory())
56
57         self.assertTrue(process, PROCESS_IS_VALID)
58
59         # The stop reason of the thread should be breakpoint.
60         thread_list = lldbutil.get_threads_stopped_at_breakpoint(process, bpt)
61
62         # Make sure we stopped at the first breakpoint.
63         self.assertTrue(
64             len(thread_list) != 0,
65             "No thread stopped at our breakpoint.")
66         self.assertTrue(len(thread_list) == 1,
67                         "More than one thread stopped at our breakpoint.")
68
69         frame = thread_list[0].GetFrameAtIndex(0)
70         self.assertTrue(frame, "Got a valid frame 0 frame.")
71
72     def go_expressions(self):
73         frame = self.frame()
74         v = frame.EvaluateExpression("1")
75         self.assertEqual(1, v.GetValueAsSigned())
76         x = frame.EvaluateExpression("x")
77         self.assertEqual(22, x.GetValueAsSigned())
78
79         a = frame.EvaluateExpression("a")
80         self.assertEqual(3, a.GetNumChildren())
81         a0 = a.GetChildAtIndex(0)
82         self.assertEqual(8, a0.GetValueAsSigned())
83
84         # Array indexing
85         a0 = frame.EvaluateExpression("a[0]")
86         self.assertEqual(8, a0.GetValueAsSigned())
87
88         # Slice indexing
89         b1 = frame.EvaluateExpression("b[1]")
90         self.assertEqual(9, b1.GetValueAsSigned())
91
92         # Test global in this package
93         g = frame.EvaluateExpression("myGlobal")
94         self.assertEqual(17, g.GetValueAsSigned(), str(g))
95
96         # Global with package name
97         g = frame.EvaluateExpression("main.myGlobal")
98         self.assertEqual(17, g.GetValueAsSigned(), str(g))
99
100         # Global with quoted package name
101         g = frame.EvaluateExpression('"main".myGlobal')
102         self.assertEqual(17, g.GetValueAsSigned(), str(g))
103
104         # Casting with package local type
105         s = frame.EvaluateExpression("*(*myStruct)(i.data)")
106         sb = s.GetChildMemberWithName("a")
107         self.assertEqual(2, sb.GetValueAsSigned())
108
109         # casting with explicit package
110         s = frame.EvaluateExpression("*(*main.myStruct)(i.data)")
111         sb = s.GetChildMemberWithName("a")
112         self.assertEqual(2, sb.GetValueAsSigned())
113
114         # Casting quoted package
115         s = frame.EvaluateExpression('*(*"main".myStruct)(i.data)')
116         sb = s.GetChildMemberWithName("b")
117         self.assertEqual(-1, sb.GetValueAsSigned())
118
119 if __name__ == '__main__':
120     import atexit
121     lldb.SBDebugger.Initialize()
122     atexit.register(lambda: lldb.SBDebugger.Terminate())
123     unittest2.main()