199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest some SBStructuredData API.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass TestStructuredDataAPI(TestBase):
1499451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def test(self):
1799451b44SJordan Rupprecht        self.structured_data_api_test()
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    def structured_data_api_test(self):
2099451b44SJordan Rupprecht        error = lldb.SBError()
2199451b44SJordan Rupprecht        s = lldb.SBStream()
2299451b44SJordan Rupprecht        s.Print(
2399451b44SJordan Rupprecht            "{\"key_dict\":{\"key_string\":\"STRING\",\"key_int\":3,\"key_float\":2.99,\"key_bool\":true,\"key_array\":[\"23\",\"arr\"]}}")
2499451b44SJordan Rupprecht        example = lldb.SBStructuredData()
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht        # Check SetFromJSON API for dictionaries, integers, floating point
2799451b44SJordan Rupprecht        # values, strings and arrays
2899451b44SJordan Rupprecht        error = example.SetFromJSON(s)
2999451b44SJordan Rupprecht        if not error.Success():
3099451b44SJordan Rupprecht            self.fail("FAILED:   " + error.GetCString())
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        # Tests for invalid data type
3399451b44SJordan Rupprecht        self.invalid_struct_test(example)
3499451b44SJordan Rupprecht
35afaeb6afSJim Ingham        # Test that GetDescription works:
36afaeb6afSJim Ingham        s.Clear()
37afaeb6afSJim Ingham        error = example.GetDescription(s)
38*779bbbf2SDave Lee        self.assertSuccess(error, "GetDescription works")
39afaeb6afSJim Ingham        if not "key_float" in s.GetData():
40afaeb6afSJim Ingham            self.fail("FAILED: could not find key_float in description output")
41afaeb6afSJim Ingham
4299451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
4399451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        # Tests for dictionary data type
4699451b44SJordan Rupprecht        self.dictionary_struct_test(example)
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        # Tests for string data type
4999451b44SJordan Rupprecht        self.string_struct_test(dict_struct)
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        # Tests for integer data type
5299451b44SJordan Rupprecht        self.int_struct_test(dict_struct)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        # Tests for floating point data type
5599451b44SJordan Rupprecht        self.double_struct_test(dict_struct)
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht        # Tests for boolean data type
5899451b44SJordan Rupprecht        self.bool_struct_test(dict_struct)
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        # Tests for array data type
6199451b44SJordan Rupprecht        self.array_struct_test(dict_struct)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht    def invalid_struct_test(self, example):
6499451b44SJordan Rupprecht        invalid_struct = lldb.SBStructuredData()
6599451b44SJordan Rupprecht        invalid_struct = example.GetValueForKey("invalid_key")
6699451b44SJordan Rupprecht        if invalid_struct.IsValid():
6799451b44SJordan Rupprecht            self.fail("An invalid object should have been returned")
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        # Check Type API
7099451b44SJordan Rupprecht        if not invalid_struct.GetType() == lldb.eStructuredDataTypeInvalid:
7199451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(invalid_struct.GetType()))
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht    def dictionary_struct_test(self, example):
7499451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'dictionary' type
7599451b44SJordan Rupprecht        dict_struct = lldb.SBStructuredData()
7699451b44SJordan Rupprecht        dict_struct = example.GetValueForKey("key_dict")
7799451b44SJordan Rupprecht        if not dict_struct.IsValid():
7899451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        # Check Type API
8199451b44SJordan Rupprecht        if not dict_struct.GetType() == lldb.eStructuredDataTypeDictionary:
8299451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(dict_struct.GetType()))
8399451b44SJordan Rupprecht
8499451b44SJordan Rupprecht        # Check Size API for 'dictionary' type
8599451b44SJordan Rupprecht        if not dict_struct.GetSize() == 5:
8699451b44SJordan Rupprecht            self.fail("Wrong no of elements returned: " +
8799451b44SJordan Rupprecht                      str(dict_struct.GetSize()))
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht    def string_struct_test(self, dict_struct):
9099451b44SJordan Rupprecht        string_struct = lldb.SBStructuredData()
9199451b44SJordan Rupprecht        string_struct = dict_struct.GetValueForKey("key_string")
9299451b44SJordan Rupprecht        if not string_struct.IsValid():
9399451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        # Check Type API
9699451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
9799451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        # Check API returning 'string' value
10099451b44SJordan Rupprecht        output = string_struct.GetStringValue(25)
10199451b44SJordan Rupprecht        if not "STRING" in output:
10299451b44SJordan Rupprecht            self.fail("wrong output: " + output)
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
10599451b44SJordan Rupprecht        # (e.g. getting an integer from a string type structure)
10699451b44SJordan Rupprecht        output = string_struct.GetIntegerValue()
10799451b44SJordan Rupprecht        if output:
10899451b44SJordan Rupprecht            self.fail(
10999451b44SJordan Rupprecht                "Valid integer value " +
11099451b44SJordan Rupprecht                str(output) +
11199451b44SJordan Rupprecht                " returned for a string object")
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht    def int_struct_test(self, dict_struct):
11499451b44SJordan Rupprecht        # Check a valid SBStructuredData containing an 'integer' by
11599451b44SJordan Rupprecht        int_struct = lldb.SBStructuredData()
11699451b44SJordan Rupprecht        int_struct = dict_struct.GetValueForKey("key_int")
11799451b44SJordan Rupprecht        if not int_struct.IsValid():
11899451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht        # Check Type API
12199451b44SJordan Rupprecht        if not int_struct.GetType() == lldb.eStructuredDataTypeInteger:
12299451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(int_struct.GetType()))
12399451b44SJordan Rupprecht
12499451b44SJordan Rupprecht        # Check API returning 'integer' value
12599451b44SJordan Rupprecht        output = int_struct.GetIntegerValue()
12699451b44SJordan Rupprecht        if not output == 3:
12799451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht        # Calling wrong API on a SBStructuredData
13099451b44SJordan Rupprecht        # (e.g. getting a string value from an integer type structure)
13199451b44SJordan Rupprecht        output = int_struct.GetStringValue(25)
13299451b44SJordan Rupprecht        if output:
13399451b44SJordan Rupprecht            self.fail(
13499451b44SJordan Rupprecht                "Valid string " +
13599451b44SJordan Rupprecht                output +
13699451b44SJordan Rupprecht                " returned for an integer object")
13799451b44SJordan Rupprecht
13899451b44SJordan Rupprecht    def double_struct_test(self, dict_struct):
13999451b44SJordan Rupprecht        floating_point_struct = lldb.SBStructuredData()
14099451b44SJordan Rupprecht        floating_point_struct = dict_struct.GetValueForKey("key_float")
14199451b44SJordan Rupprecht        if not floating_point_struct.IsValid():
14299451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
14399451b44SJordan Rupprecht
14499451b44SJordan Rupprecht        # Check Type API
14599451b44SJordan Rupprecht        if not floating_point_struct.GetType() == lldb.eStructuredDataTypeFloat:
14699451b44SJordan Rupprecht            self.fail("Wrong type returned: " +
14799451b44SJordan Rupprecht                      str(floating_point_struct.GetType()))
14899451b44SJordan Rupprecht
14999451b44SJordan Rupprecht        # Check API returning 'double' value
15099451b44SJordan Rupprecht        output = floating_point_struct.GetFloatValue()
15199451b44SJordan Rupprecht        if not output == 2.99:
15299451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht    def bool_struct_test(self, dict_struct):
15599451b44SJordan Rupprecht        bool_struct = lldb.SBStructuredData()
15699451b44SJordan Rupprecht        bool_struct = dict_struct.GetValueForKey("key_bool")
15799451b44SJordan Rupprecht        if not bool_struct.IsValid():
15899451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
15999451b44SJordan Rupprecht
16099451b44SJordan Rupprecht        # Check Type API
16199451b44SJordan Rupprecht        if not bool_struct.GetType() == lldb.eStructuredDataTypeBoolean:
16299451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(bool_struct.GetType()))
16399451b44SJordan Rupprecht
16499451b44SJordan Rupprecht        # Check API returning 'bool' value
16599451b44SJordan Rupprecht        output = bool_struct.GetBooleanValue()
16699451b44SJordan Rupprecht        if not output:
16799451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
16899451b44SJordan Rupprecht
16999451b44SJordan Rupprecht    def array_struct_test(self, dict_struct):
17099451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData of 'array' type
17199451b44SJordan Rupprecht        array_struct = lldb.SBStructuredData()
17299451b44SJordan Rupprecht        array_struct = dict_struct.GetValueForKey("key_array")
17399451b44SJordan Rupprecht        if not array_struct.IsValid():
17499451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
17599451b44SJordan Rupprecht
17699451b44SJordan Rupprecht        # Check Type API
17799451b44SJordan Rupprecht        if not array_struct.GetType() == lldb.eStructuredDataTypeArray:
17899451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(array_struct.GetType()))
17999451b44SJordan Rupprecht
18099451b44SJordan Rupprecht        # Check Size API for 'array' type
18199451b44SJordan Rupprecht        if not array_struct.GetSize() == 2:
18299451b44SJordan Rupprecht            self.fail("Wrong no of elements returned: " +
18399451b44SJordan Rupprecht                      str(array_struct.GetSize()))
18499451b44SJordan Rupprecht
18599451b44SJordan Rupprecht        # Check API returning a valid SBStructuredData for different 'array'
18699451b44SJordan Rupprecht        # indices
18799451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(0)
18899451b44SJordan Rupprecht        if not string_struct.IsValid():
18999451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
19099451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
19199451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
19299451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
19399451b44SJordan Rupprecht        if not output == "23":
19499451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
19599451b44SJordan Rupprecht
19699451b44SJordan Rupprecht        string_struct = array_struct.GetItemAtIndex(1)
19799451b44SJordan Rupprecht        if not string_struct.IsValid():
19899451b44SJordan Rupprecht            self.fail("A valid object should have been returned")
19999451b44SJordan Rupprecht        if not string_struct.GetType() == lldb.eStructuredDataTypeString:
20099451b44SJordan Rupprecht            self.fail("Wrong type returned: " + str(string_struct.GetType()))
20199451b44SJordan Rupprecht        output = string_struct.GetStringValue(5)
20299451b44SJordan Rupprecht        if not output == "arr":
20399451b44SJordan Rupprecht            self.fail("wrong output: " + str(output))
204