1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest some SBStructuredData API.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprechtclass TestStructuredDataAPI(TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
16*99451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    def test(self):
19*99451b44SJordan Rupprecht        self.structured_data_api_test()
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
22*99451b44SJordan Rupprecht    def structured_data_api_test(self):
23*99451b44SJordan Rupprecht        error = lldb.SBError()
24*99451b44SJordan Rupprecht        s = lldb.SBStream()
25*99451b44SJordan Rupprecht        s.Print(
26*99451b44SJordan Rupprecht            "{\"key_dict\":{\"key_string\":\"STRING\",\"key_int\":3,\"key_float\":2.99,\"key_bool\":true,\"key_array\":[\"23\",\"arr\"]}}")
27*99451b44SJordan Rupprecht        example = lldb.SBStructuredData()
28*99451b44SJordan Rupprecht
29*99451b44SJordan Rupprecht        # Check SetFromJSON API for dictionaries, integers, floating point
30*99451b44SJordan Rupprecht        # values, strings and arrays
31*99451b44SJordan Rupprecht        error = example.SetFromJSON(s)
32*99451b44SJordan Rupprecht        if not error.Success():
33*99451b44SJordan Rupprecht            self.fail("FAILED:   " + error.GetCString())
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        # Tests for invalid data type
36*99451b44SJordan Rupprecht        self.invalid_struct_test(example)
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
39*99451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
40*99451b44SJordan Rupprecht
41*99451b44SJordan Rupprecht        # Tests for dictionary data type
42*99451b44SJordan Rupprecht        self.dictionary_struct_test(example)
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht        # Tests for string data type
45*99451b44SJordan Rupprecht        self.string_struct_test(dict_struct)
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprecht        # Tests for integer data type
48*99451b44SJordan Rupprecht        self.int_struct_test(dict_struct)
49*99451b44SJordan Rupprecht
50*99451b44SJordan Rupprecht        # Tests for floating point data type
51*99451b44SJordan Rupprecht        self.double_struct_test(dict_struct)
52*99451b44SJordan Rupprecht
53*99451b44SJordan Rupprecht        # Tests for boolean data type
54*99451b44SJordan Rupprecht        self.bool_struct_test(dict_struct)
55*99451b44SJordan Rupprecht
56*99451b44SJordan Rupprecht        # Tests for array data type
57*99451b44SJordan Rupprecht        self.array_struct_test(dict_struct)
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprecht    def invalid_struct_test(self, example):
60*99451b44SJordan Rupprecht        invalid_struct = lldb.SBStructuredData()
61*99451b44SJordan Rupprecht        invalid_struct = example.GetValueForKey("invalid_key")
62*99451b44SJordan Rupprecht        if invalid_struct.IsValid():
63*99451b44SJordan Rupprecht            self.fail("An invalid object should have been returned")
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht        # Check Type API
66*99451b44SJordan Rupprecht        if not invalid_struct.GetType() == lldb.eStructuredDataTypeInvalid:
67*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(invalid_struct.GetType()))
68*99451b44SJordan Rupprecht
69*99451b44SJordan Rupprecht    def dictionary_struct_test(self, example):
70*99451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'dictionary' type
71*99451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
72*99451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
73*99451b44SJordan Rupprecht        if not dict_struct.IsValid():
74*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
75*99451b44SJordan Rupprecht
76*99451b44SJordan Rupprecht        # Check Type API
77*99451b44SJordan Rupprecht        if not dict_struct.GetType() == lldb.eStructuredDataTypeDictionary:
78*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(dict_struct.GetType()))
79*99451b44SJordan Rupprecht
80*99451b44SJordan Rupprecht        # Check Size API for 'dictionary' type
81*99451b44SJordan Rupprecht        if not dict_struct.GetSize() == 5:
82*99451b44SJordan Rupprecht            self.fail("Wrong no of elements returned: " +
83*99451b44SJordan Rupprecht                      str(dict_struct.GetSize()))
84*99451b44SJordan Rupprecht
85*99451b44SJordan Rupprecht    def string_struct_test(self, dict_struct):
86*99451b44SJordan Rupprecht        string_struct = lldb.SBStructuredData()
87*99451b44SJordan Rupprecht        string_struct = dict_struct.GetValueForKey("key_string")
88*99451b44SJordan Rupprecht        if not string_struct.IsValid():
89*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
90*99451b44SJordan Rupprecht
91*99451b44SJordan Rupprecht        # Check Type API
92*99451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
93*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
94*99451b44SJordan Rupprecht
95*99451b44SJordan Rupprecht        # Check API returning 'string' value
96*99451b44SJordan Rupprecht        output = string_struct.GetStringValue(25)
97*99451b44SJordan Rupprecht        if not "STRING" in output:
98*99451b44SJordan Rupprecht            self.fail("wrong output: " + output)
99*99451b44SJordan Rupprecht
100*99451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
101*99451b44SJordan Rupprecht        # (e.g. getting an integer from a string type structure)
102*99451b44SJordan Rupprecht        output = string_struct.GetIntegerValue()
103*99451b44SJordan Rupprecht        if output:
104*99451b44SJordan Rupprecht            self.fail(
105*99451b44SJordan Rupprecht                "Valid integer value " +
106*99451b44SJordan Rupprecht                str(output) +
107*99451b44SJordan Rupprecht                " returned for a string object")
108*99451b44SJordan Rupprecht
109*99451b44SJordan Rupprecht    def int_struct_test(self, dict_struct):
110*99451b44SJordan Rupprecht        # Check a valid SBStructuredData containing an 'integer' by
111*99451b44SJordan Rupprecht        int_struct = lldb.SBStructuredData()
112*99451b44SJordan Rupprecht        int_struct = dict_struct.GetValueForKey("key_int")
113*99451b44SJordan Rupprecht        if not int_struct.IsValid():
114*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
115*99451b44SJordan Rupprecht
116*99451b44SJordan Rupprecht        # Check Type API
117*99451b44SJordan Rupprecht        if not int_struct.GetType() == lldb.eStructuredDataTypeInteger:
118*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(int_struct.GetType()))
119*99451b44SJordan Rupprecht
120*99451b44SJordan Rupprecht        # Check API returning 'integer' value
121*99451b44SJordan Rupprecht        output = int_struct.GetIntegerValue()
122*99451b44SJordan Rupprecht        if not output == 3:
123*99451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
124*99451b44SJordan Rupprecht
125*99451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
126*99451b44SJordan Rupprecht        # (e.g. getting a string value from an integer type structure)
127*99451b44SJordan Rupprecht        output = int_struct.GetStringValue(25)
128*99451b44SJordan Rupprecht        if output:
129*99451b44SJordan Rupprecht            self.fail(
130*99451b44SJordan Rupprecht                "Valid string " +
131*99451b44SJordan Rupprecht                output +
132*99451b44SJordan Rupprecht                " returned for an integer object")
133*99451b44SJordan Rupprecht
134*99451b44SJordan Rupprecht    def double_struct_test(self, dict_struct):
135*99451b44SJordan Rupprecht        floating_point_struct = lldb.SBStructuredData()
136*99451b44SJordan Rupprecht        floating_point_struct = dict_struct.GetValueForKey("key_float")
137*99451b44SJordan Rupprecht        if not floating_point_struct.IsValid():
138*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
139*99451b44SJordan Rupprecht
140*99451b44SJordan Rupprecht        # Check Type API
141*99451b44SJordan Rupprecht        if not floating_point_struct.GetType() == lldb.eStructuredDataTypeFloat:
142*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " +
143*99451b44SJordan Rupprecht                      str(floating_point_struct.GetType()))
144*99451b44SJordan Rupprecht
145*99451b44SJordan Rupprecht        # Check API returning 'double' value
146*99451b44SJordan Rupprecht        output = floating_point_struct.GetFloatValue()
147*99451b44SJordan Rupprecht        if not output == 2.99:
148*99451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
149*99451b44SJordan Rupprecht
150*99451b44SJordan Rupprecht    def bool_struct_test(self, dict_struct):
151*99451b44SJordan Rupprecht        bool_struct = lldb.SBStructuredData()
152*99451b44SJordan Rupprecht        bool_struct = dict_struct.GetValueForKey("key_bool")
153*99451b44SJordan Rupprecht        if not bool_struct.IsValid():
154*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
155*99451b44SJordan Rupprecht
156*99451b44SJordan Rupprecht        # Check Type API
157*99451b44SJordan Rupprecht        if not bool_struct.GetType() == lldb.eStructuredDataTypeBoolean:
158*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(bool_struct.GetType()))
159*99451b44SJordan Rupprecht
160*99451b44SJordan Rupprecht        # Check API returning 'bool' value
161*99451b44SJordan Rupprecht        output = bool_struct.GetBooleanValue()
162*99451b44SJordan Rupprecht        if not output:
163*99451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
164*99451b44SJordan Rupprecht
165*99451b44SJordan Rupprecht    def array_struct_test(self, dict_struct):
166*99451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'array' type
167*99451b44SJordan Rupprecht        array_struct = lldb.SBStructuredData()
168*99451b44SJordan Rupprecht        array_struct = dict_struct.GetValueForKey("key_array")
169*99451b44SJordan Rupprecht        if not array_struct.IsValid():
170*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
171*99451b44SJordan Rupprecht
172*99451b44SJordan Rupprecht        # Check Type API
173*99451b44SJordan Rupprecht        if not array_struct.GetType() == lldb.eStructuredDataTypeArray:
174*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(array_struct.GetType()))
175*99451b44SJordan Rupprecht
176*99451b44SJordan Rupprecht        # Check Size API for 'array' type
177*99451b44SJordan Rupprecht        if not array_struct.GetSize() == 2:
178*99451b44SJordan Rupprecht            self.fail("Wrong no of elements returned: " +
179*99451b44SJordan Rupprecht                      str(array_struct.GetSize()))
180*99451b44SJordan Rupprecht
181*99451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData for different 'array'
182*99451b44SJordan Rupprecht        # indices
183*99451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(0)
184*99451b44SJordan Rupprecht        if not string_struct.IsValid():
185*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
186*99451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
187*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
188*99451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
189*99451b44SJordan Rupprecht        if not output == "23":
190*99451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
191*99451b44SJordan Rupprecht
192*99451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(1)
193*99451b44SJordan Rupprecht        if not string_struct.IsValid():
194*99451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
195*99451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
196*99451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
197*99451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
198*99451b44SJordan Rupprecht        if not output == "arr":
199*99451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
200