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