xref: /llvm-project/lldb/test/API/python_api/sbstructureddata/TestStructuredDataAPI.py (revision 585523750e2bbe374d1cb3bf4ff9d53de29b9593)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest some SBStructuredData API.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
112f88c07cSAlex Langfordimport json
1299451b44SJordan Rupprecht
132238dcc3SJonas Devlieghere
1499451b44SJordan Rupprechtclass TestStructuredDataAPI(TestBase):
1599451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def test(self):
1899451b44SJordan Rupprecht        self.structured_data_api_test()
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def structured_data_api_test(self):
2199451b44SJordan Rupprecht        error = lldb.SBError()
2299451b44SJordan Rupprecht        s = lldb.SBStream()
232f88c07cSAlex Langford
242f88c07cSAlex Langford        dict_str = json.dumps(
251370a1cbSMed Ismail Bennani            {
261370a1cbSMed Ismail Bennani                "key_dict": {
271370a1cbSMed Ismail Bennani                    "key_string": "STRING",
281370a1cbSMed Ismail Bennani                    "key_uint": 0xFFFFFFFF00000000,
291370a1cbSMed Ismail Bennani                    "key_sint": -42,
302f88c07cSAlex Langford                    "key_float": 2.99,
312f88c07cSAlex Langford                    "key_bool": True,
321370a1cbSMed Ismail Bennani                    "key_array": ["23", "arr"],
331370a1cbSMed Ismail Bennani                }
341370a1cbSMed Ismail Bennani            }
351370a1cbSMed Ismail Bennani        )
362f88c07cSAlex Langford        s.Print(dict_str)
3799451b44SJordan Rupprecht        example = lldb.SBStructuredData()
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Check SetFromJSON API for dictionaries, integers, floating point
4099451b44SJordan Rupprecht        # values, strings and arrays
4199451b44SJordan Rupprecht        error = example.SetFromJSON(s)
4299451b44SJordan Rupprecht        if not error.Success():
4399451b44SJordan Rupprecht            self.fail("FAILED:   " + error.GetCString())
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        # Tests for invalid data type
4699451b44SJordan Rupprecht        self.invalid_struct_test(example)
4799451b44SJordan Rupprecht
48afaeb6afSJim Ingham        # Test that GetDescription works:
49afaeb6afSJim Ingham        s.Clear()
50afaeb6afSJim Ingham        error = example.GetDescription(s)
51779bbbf2SDave Lee        self.assertSuccess(error, "GetDescription works")
52afaeb6afSJim Ingham        if not "key_float" in s.GetData():
53afaeb6afSJim Ingham            self.fail("FAILED: could not find key_float in description output")
54afaeb6afSJim Ingham
5599451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
5699451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        # Tests for dictionary data type
5999451b44SJordan Rupprecht        self.dictionary_struct_test(example)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # Tests for string data type
6299451b44SJordan Rupprecht        self.string_struct_test(dict_struct)
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        # Tests for integer data type
652f88c07cSAlex Langford        self.uint_struct_test(dict_struct)
6699451b44SJordan Rupprecht
671370a1cbSMed Ismail Bennani        # Tests for integer data type
681370a1cbSMed Ismail Bennani        self.sint_struct_test(dict_struct)
691370a1cbSMed Ismail Bennani
7099451b44SJordan Rupprecht        # Tests for floating point data type
7199451b44SJordan Rupprecht        self.double_struct_test(dict_struct)
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        # Tests for boolean data type
7499451b44SJordan Rupprecht        self.bool_struct_test(dict_struct)
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        # Tests for array data type
7799451b44SJordan Rupprecht        self.array_struct_test(dict_struct)
7899451b44SJordan Rupprecht
7957bd8823SMed Ismail Bennani        s.Clear()
8057bd8823SMed Ismail Bennani        self.assertSuccess(example.GetAsJSON(s))
8157bd8823SMed Ismail Bennani        py_obj = json.loads(s.GetData())
8257bd8823SMed Ismail Bennani        self.assertTrue(py_obj)
8357bd8823SMed Ismail Bennani        self.assertIn("key_dict", py_obj)
8457bd8823SMed Ismail Bennani
8557bd8823SMed Ismail Bennani        py_dict = py_obj["key_dict"]
8657bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_string"], "STRING")
8757bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_uint"], 0xFFFFFFFF00000000)
8857bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_sint"], -42)
8957bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_float"], 2.99)
9057bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_bool"], True)
9157bd8823SMed Ismail Bennani        self.assertEqual(py_dict["key_array"], ["23", "arr"])
9257bd8823SMed Ismail Bennani
9357bd8823SMed Ismail Bennani        class MyRandomClass:
9457bd8823SMed Ismail Bennani            payload = "foo"
9557bd8823SMed Ismail Bennani
9657bd8823SMed Ismail Bennani        py_dict["key_generic"] = MyRandomClass()
9757bd8823SMed Ismail Bennani
9857bd8823SMed Ismail Bennani        stp = lldb.SBScriptObject(py_dict, lldb.eScriptLanguagePython)
9957bd8823SMed Ismail Bennani        self.assertEqual(stp.ptr, py_dict)
10057bd8823SMed Ismail Bennani
10157bd8823SMed Ismail Bennani        sd = lldb.SBStructuredData(stp, self.dbg)
10257bd8823SMed Ismail Bennani        self.assertTrue(sd.IsValid())
10357bd8823SMed Ismail Bennani        self.assertEqual(sd.GetSize(), len(py_dict))
10457bd8823SMed Ismail Bennani
10557bd8823SMed Ismail Bennani        generic_sd = sd.GetValueForKey("key_generic")
10657bd8823SMed Ismail Bennani        self.assertTrue(generic_sd.IsValid())
10757bd8823SMed Ismail Bennani        self.assertEqual(generic_sd.GetType(), lldb.eStructuredDataTypeGeneric)
10857bd8823SMed Ismail Bennani
10957bd8823SMed Ismail Bennani        my_random_class = generic_sd.GetGenericValue()
11057bd8823SMed Ismail Bennani        self.assertTrue(my_random_class)
11157bd8823SMed Ismail Bennani        self.assertEqual(my_random_class.payload, MyRandomClass.payload)
11257bd8823SMed Ismail Bennani
113*58552375SMed Ismail Bennani        example = lldb.SBStructuredData()
114*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON("1"))
115*58552375SMed Ismail Bennani        self.assertEqual(example.GetType(), lldb.eStructuredDataTypeInteger)
116*58552375SMed Ismail Bennani        self.assertEqual(example.GetIntegerValue(), 1)
117*58552375SMed Ismail Bennani
118*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON("4.19"))
119*58552375SMed Ismail Bennani        self.assertEqual(example.GetType(), lldb.eStructuredDataTypeFloat)
120*58552375SMed Ismail Bennani        self.assertEqual(example.GetFloatValue(), 4.19)
121*58552375SMed Ismail Bennani
122*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON('"Bonjour, 123!"'))
123*58552375SMed Ismail Bennani        self.assertEqual(example.GetType(), lldb.eStructuredDataTypeString)
124*58552375SMed Ismail Bennani        self.assertEqual(example.GetStringValue(42), "Bonjour, 123!")
125*58552375SMed Ismail Bennani
126*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON("true"))
127*58552375SMed Ismail Bennani        self.assertEqual(example.GetType(), lldb.eStructuredDataTypeBoolean)
128*58552375SMed Ismail Bennani        self.assertTrue(example.GetBooleanValue())
129*58552375SMed Ismail Bennani
130*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON("null"))
131*58552375SMed Ismail Bennani        self.assertEqual(example.GetType(), lldb.eStructuredDataTypeNull)
132*58552375SMed Ismail Bennani
133*58552375SMed Ismail Bennani        example_arr = [1, 2.3, "4", {"5": False}]
134*58552375SMed Ismail Bennani        arr_str = json.dumps(example_arr)
135*58552375SMed Ismail Bennani        s.Clear()
136*58552375SMed Ismail Bennani        s.Print(arr_str)
137*58552375SMed Ismail Bennani        self.assertSuccess(example.SetFromJSON(s))
138*58552375SMed Ismail Bennani
139*58552375SMed Ismail Bennani        s.Clear()
140*58552375SMed Ismail Bennani        self.assertSuccess(example.GetAsJSON(s))
141*58552375SMed Ismail Bennani        sb_data = json.loads(s.GetData())
142*58552375SMed Ismail Bennani        self.assertEqual(sb_data, example_arr)
143*58552375SMed Ismail Bennani
14499451b44SJordan Rupprecht    def invalid_struct_test(self, example):
14599451b44SJordan Rupprecht        invalid_struct = lldb.SBStructuredData()
14699451b44SJordan Rupprecht        invalid_struct = example.GetValueForKey("invalid_key")
14799451b44SJordan Rupprecht        if invalid_struct.IsValid():
14899451b44SJordan Rupprecht            self.fail("An invalid object should have been returned")
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht        # Check Type API
15199451b44SJordan Rupprecht        if not invalid_struct.GetType() == lldb.eStructuredDataTypeInvalid:
15299451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(invalid_struct.GetType()))
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht    def dictionary_struct_test(self, example):
15599451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'dictionary' type
15699451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
15799451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
15899451b44SJordan Rupprecht        if not dict_struct.IsValid():
15999451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
16099451b44SJordan Rupprecht
16199451b44SJordan Rupprecht        # Check Type API
16299451b44SJordan Rupprecht        if not dict_struct.GetType() == lldb.eStructuredDataTypeDictionary:
16399451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(dict_struct.GetType()))
16499451b44SJordan Rupprecht
16599451b44SJordan Rupprecht        # Check Size API for 'dictionary' type
1661370a1cbSMed Ismail Bennani        if not dict_struct.GetSize() == 6:
1672238dcc3SJonas Devlieghere            self.fail("Wrong no of elements returned: " + str(dict_struct.GetSize()))
16899451b44SJordan Rupprecht
16999451b44SJordan Rupprecht    def string_struct_test(self, dict_struct):
17099451b44SJordan Rupprecht        string_struct = lldb.SBStructuredData()
17199451b44SJordan Rupprecht        string_struct = dict_struct.GetValueForKey("key_string")
17299451b44SJordan Rupprecht        if not string_struct.IsValid():
17399451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
17499451b44SJordan Rupprecht
17599451b44SJordan Rupprecht        # Check Type API
17699451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
17799451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
17899451b44SJordan Rupprecht
17999451b44SJordan Rupprecht        # Check API returning 'string' value
18099451b44SJordan Rupprecht        output = string_struct.GetStringValue(25)
18199451b44SJordan Rupprecht        if not "STRING" in output:
18299451b44SJordan Rupprecht            self.fail("wrong output: " + output)
18399451b44SJordan Rupprecht
18499451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
18599451b44SJordan Rupprecht        # (e.g. getting an integer from a string type structure)
18699451b44SJordan Rupprecht        output = string_struct.GetIntegerValue()
18799451b44SJordan Rupprecht        if output:
18899451b44SJordan Rupprecht            self.fail(
1892238dcc3SJonas Devlieghere                "Valid integer value " + str(output) + " returned for a string object"
1902238dcc3SJonas Devlieghere            )
19199451b44SJordan Rupprecht
1922f88c07cSAlex Langford    def uint_struct_test(self, dict_struct):
1932f88c07cSAlex Langford        # Check a valid SBStructuredData containing an unsigned integer.
1942f88c07cSAlex Langford        # We intentionally make this larger than what an int64_t can hold but
1952f88c07cSAlex Langford        # still small enough to fit a uint64_t
1962f88c07cSAlex Langford        uint_struct = lldb.SBStructuredData()
1972f88c07cSAlex Langford        uint_struct = dict_struct.GetValueForKey("key_uint")
1982f88c07cSAlex Langford        if not uint_struct.IsValid():
19999451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
20099451b44SJordan Rupprecht
20199451b44SJordan Rupprecht        # Check Type API
2022f88c07cSAlex Langford        if not uint_struct.GetType() == lldb.eStructuredDataTypeInteger:
2032f88c07cSAlex Langford            self.fail("Wrong type returned: " + str(uint_struct.GetType()))
20499451b44SJordan Rupprecht
2051370a1cbSMed Ismail Bennani        # Check API returning unsigned integer value
2061370a1cbSMed Ismail Bennani        output = uint_struct.GetUnsignedIntegerValue()
2072238dcc3SJonas Devlieghere        if not output == 0xFFFFFFFF00000000:
20899451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
20999451b44SJordan Rupprecht
21099451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
21199451b44SJordan Rupprecht        # (e.g. getting a string value from an integer type structure)
2122f88c07cSAlex Langford        output = uint_struct.GetStringValue(25)
21399451b44SJordan Rupprecht        if output:
2141370a1cbSMed Ismail Bennani            self.fail("Valid string " + output + " returned for an integer object")
2151370a1cbSMed Ismail Bennani
2161370a1cbSMed Ismail Bennani    def sint_struct_test(self, dict_struct):
2171370a1cbSMed Ismail Bennani        # Check a valid SBStructuredData containing an signed integer.
2181370a1cbSMed Ismail Bennani        # We intentionally make this smaller than what an uint64_t can hold but
2191370a1cbSMed Ismail Bennani        # still small enough to fit a int64_t
2201370a1cbSMed Ismail Bennani        sint_struct = lldb.SBStructuredData()
2211370a1cbSMed Ismail Bennani        sint_struct = dict_struct.GetValueForKey("key_sint")
2221370a1cbSMed Ismail Bennani        if not sint_struct.IsValid():
2231370a1cbSMed Ismail Bennani            self.fail("A valid object should have been returned")
2241370a1cbSMed Ismail Bennani
2251370a1cbSMed Ismail Bennani        # Check Type API
2261370a1cbSMed Ismail Bennani        if not sint_struct.GetType() == lldb.eStructuredDataTypeSignedInteger:
2271370a1cbSMed Ismail Bennani            self.fail("Wrong type returned: " + str(sint_struct.GetType()))
2281370a1cbSMed Ismail Bennani
2291370a1cbSMed Ismail Bennani        # Check API returning signed integer value
2301370a1cbSMed Ismail Bennani        output = sint_struct.GetSignedIntegerValue()
2311370a1cbSMed Ismail Bennani        if not output == -42:
2321370a1cbSMed Ismail Bennani            self.fail("wrong output: " + str(output))
2331370a1cbSMed Ismail Bennani
2341370a1cbSMed Ismail Bennani        # Calling wrong API on a SBStructuredData
2351370a1cbSMed Ismail Bennani        # (e.g. getting a string value from an integer type structure)
2361370a1cbSMed Ismail Bennani        output = sint_struct.GetStringValue(69)
2371370a1cbSMed Ismail Bennani        if output:
2382238dcc3SJonas Devlieghere            self.fail("Valid string " + output + " returned for an integer object")
23999451b44SJordan Rupprecht
24099451b44SJordan Rupprecht    def double_struct_test(self, dict_struct):
24199451b44SJordan Rupprecht        floating_point_struct = lldb.SBStructuredData()
24299451b44SJordan Rupprecht        floating_point_struct = dict_struct.GetValueForKey("key_float")
24399451b44SJordan Rupprecht        if not floating_point_struct.IsValid():
24499451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
24599451b44SJordan Rupprecht
24699451b44SJordan Rupprecht        # Check Type API
24799451b44SJordan Rupprecht        if not floating_point_struct.GetType() == lldb.eStructuredDataTypeFloat:
2482238dcc3SJonas Devlieghere            self.fail("Wrong type returned: " + str(floating_point_struct.GetType()))
24999451b44SJordan Rupprecht
25099451b44SJordan Rupprecht        # Check API returning 'double' value
25199451b44SJordan Rupprecht        output = floating_point_struct.GetFloatValue()
25299451b44SJordan Rupprecht        if not output == 2.99:
25399451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
25499451b44SJordan Rupprecht
25599451b44SJordan Rupprecht    def bool_struct_test(self, dict_struct):
25699451b44SJordan Rupprecht        bool_struct = lldb.SBStructuredData()
25799451b44SJordan Rupprecht        bool_struct = dict_struct.GetValueForKey("key_bool")
25899451b44SJordan Rupprecht        if not bool_struct.IsValid():
25999451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
26099451b44SJordan Rupprecht
26199451b44SJordan Rupprecht        # Check Type API
26299451b44SJordan Rupprecht        if not bool_struct.GetType() == lldb.eStructuredDataTypeBoolean:
26399451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(bool_struct.GetType()))
26499451b44SJordan Rupprecht
26599451b44SJordan Rupprecht        # Check API returning 'bool' value
26699451b44SJordan Rupprecht        output = bool_struct.GetBooleanValue()
26799451b44SJordan Rupprecht        if not output:
26899451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
26999451b44SJordan Rupprecht
27099451b44SJordan Rupprecht    def array_struct_test(self, dict_struct):
27199451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'array' type
27299451b44SJordan Rupprecht        array_struct = lldb.SBStructuredData()
27399451b44SJordan Rupprecht        array_struct = dict_struct.GetValueForKey("key_array")
27499451b44SJordan Rupprecht        if not array_struct.IsValid():
27599451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
27699451b44SJordan Rupprecht
27799451b44SJordan Rupprecht        # Check Type API
27899451b44SJordan Rupprecht        if not array_struct.GetType() == lldb.eStructuredDataTypeArray:
27999451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(array_struct.GetType()))
28099451b44SJordan Rupprecht
28199451b44SJordan Rupprecht        # Check Size API for 'array' type
28299451b44SJordan Rupprecht        if not array_struct.GetSize() == 2:
2832238dcc3SJonas Devlieghere            self.fail("Wrong no of elements returned: " + str(array_struct.GetSize()))
28499451b44SJordan Rupprecht
28599451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData for different 'array'
28699451b44SJordan Rupprecht        # indices
28799451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(0)
28899451b44SJordan Rupprecht        if not string_struct.IsValid():
28999451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
29099451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
29199451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
29299451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
29399451b44SJordan Rupprecht        if not output == "23":
29499451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
29599451b44SJordan Rupprecht
29699451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(1)
29799451b44SJordan Rupprecht        if not string_struct.IsValid():
29899451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
29999451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
30099451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
30199451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
30299451b44SJordan Rupprecht        if not output == "arr":
30399451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
304