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