diff options
Diffstat (limited to 'tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py')
-rwxr-xr-x | tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py new file mode 100755 index 000000000..111ffb3cb --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py @@ -0,0 +1,325 @@ +"""Test for SDLRPC SmartFactory generator. + +Verifies format specific functions and produced source code. + +""" +import collections +import codecs +import os +import unittest +import uuid + +from mock import MagicMock +from mock import call + +from generator.generators import SmartFactorySDLRPC +from generator import Model + + +EXPECTED_NOTIFICATION_RESULT = ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""") + +EXPECTED_REQ_RESP_RESULT = "".join([EXPECTED_NOTIFICATION_RESULT, ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""")]) + +DESCRIPTION = [u"Description Line1", u"Description Line2"] + +DESIGN_DESCRIPTION = [u"Design Line1"] + +ISSUES = [Model.Issue(value=u"Issue1"), + Model.Issue(value=u"Issue2"), + Model.Issue(value=u"Issue3")] + +TODOS = [u"Do1", u"Do2"] + + +class Test(unittest.TestCase): + + """Test for SLDRPC SmartFactory generator. + + This class holds set of test cases for the SDLRPC SmartFactory generator. + + """ + + def test_gen_schema_params_fill(self): + """Test feature that allows to create format specific PARAMS. + + Verifies SDLRPC implementation of the _gen_schema_params_fill + method. + + """ + + generator = SmartFactorySDLRPC.CodeGenerator() + + self.assertEqual(generator._gen_schema_params_fill("request"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill(u"request"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill("response"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill(u"response"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill("notification"), + EXPECTED_NOTIFICATION_RESULT, + "Invalid code generation for notification") + + self.assertEqual(generator._gen_schema_params_fill(u"notification"), + EXPECTED_NOTIFICATION_RESULT, + "Invalid code generation for notification") + + self.assertEqual(generator._gen_schema_params_fill("some text"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation") + + self.assertEqual(generator._gen_schema_params_fill(u"some text"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation") + + def test_full_generation(self): + """Test full generation using SDLPRC SmartSchema generator. + + Creates output files which is captured by the mock and compare them + with sample files with correct code. This test requires valid + test_expected_sdlrpc.h and test_expected_sdlrpc.cc in the same as + this module. + + """ + + expected_h_file_content = open("test_expected_sdlrpc.h", "r").read() + expected_cc_file_content = open("test_expected_sdlrpc.cc", "r").read() + + generator = SmartFactorySDLRPC.CodeGenerator() + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"response"] = Model.EnumElement( + name=u"response") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + elements1 = collections.OrderedDict() + elements1[u"name1"] = Model.EnumElement( + name=u"name1", + design_description=DESIGN_DESCRIPTION, + todos=TODOS, + value=u"1") + elements1[u"name2"] = Model.EnumElement( + name="name2", + description=DESCRIPTION, + issues=ISSUES, + internal_name=u"internal_name2") + + enum1 = Model.Enum(name=u"Enum1", + todos=TODOS, + elements=elements1) + + elements2 = collections.OrderedDict() + elements2[u"xxx"] = Model.EnumElement(name=u"xxx", + internal_name=u"val_1") + elements2[u"yyy"] = Model.EnumElement(name=u"yyy", + internal_name=u"val_2", + value=u"100") + elements2[u"zzz"] = Model.EnumElement(name=u"val_3") + + enum2 = Model.Enum(name=u"E2", + elements=elements2) + + elements3 = collections.OrderedDict() + elements3["1"] = Model.EnumElement(name="xxx", + internal_name="_1") + elements3["2"] = Model.EnumElement(name="xxx", + internal_name="_2") + elements3["3"] = Model.EnumElement(name="xxx", + internal_name="_3") + enum3 = Model.Enum(name="Enum_new2", + elements=elements3) + + elements4 = collections.OrderedDict() + elements4["name1"] = Model.EnumElement(name="xxx", + internal_name="_11") + elements4["name2"] = Model.EnumElement(name="xxx", + internal_name="_22") + enum4 = Model.Enum(name="Enum_new4", + elements=elements4) + + enums = collections.OrderedDict() + enums["Enum1"] = enum1 + enums["Enum2"] = enum2 + enums["Enum3"] = enum3 + enums["Enum4"] = enum4 + enums["messageType"] = message_type + + params1 = collections.OrderedDict() + params1["1"] = Model.FunctionParam( + name="param1", + design_description=DESIGN_DESCRIPTION, + description=DESCRIPTION, + issues=ISSUES, + todos=TODOS, + param_type=enum4, + default_value=elements4["name1"]) + params1["2"] = Model.FunctionParam( + name="param2", + param_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + default_value=elements1["name1"]) + + functions = collections.OrderedDict() + functions["Function1"] = Model.Function( + name="Function1", + function_id=elements1["name1"], + message_type=message_type_elements["request"], + params=params1) + functions["Function2"] = Model.Function( + name="Function2", + function_id=elements2["xxx"], + message_type=message_type_elements["response"]) + functions["Function3"] = Model.Function( + name="Function2", + function_id=elements2["yyy"], + message_type=message_type_elements["notification"]) + + members1 = collections.OrderedDict() + members1["m1"] = Model.Param(name="intParam", + param_type=Model.Integer(max_value=2)) + members1["m11"] = Model.Param(name="doubleParam", + param_type=Model.Double(min_value=0.333), + is_mandatory=False) + members1["m222"] = Model.Param(name="boolParam", + param_type=Model.Boolean()) + members1["m2"] = Model.Param(name="structParam", + param_type=Model.Struct(name="Struct2")) + members1["aaa"] = Model.Param(name="enumParam", + param_type=enum1) + members1["bbb"] = Model.Param(name="enumParam1", + param_type=enum1) + members1["xxx"] = Model.Param( + name="enumSubset1", + param_type=Model.EnumSubset( + name="sub", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + is_mandatory=False) + members1["1"] = Model.Param( + name="arrayOfInt", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=Model.Boolean()), + is_mandatory=False) + members1["2"] = Model.Param( + name="arrayOfEnum1", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=enum1), + is_mandatory=False) + members1["3"] = Model.Param( + name="arrayOfEnum3", + param_type=Model.Array(min_size=10, + max_size=40, + element_type=enum3), + is_mandatory=True) + members1["4"] = Model.Param( + name="arrayOfEnum4", + param_type=Model.Array( + min_size=10, + max_size=41, + element_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}))) + members1["5"] = Model.Param( + name="arrayOfEnum5", + param_type=Model.Array( + min_size=10, + max_size=42, + element_type=Model.EnumSubset( + name="sub2", + enum=enum1, + allowed_elements={"e1": elements1["name2"]}))) + members1["6"] = Model.Param( + name="arrayOfEnum6", + param_type=Model.Array( + min_size=10, + max_size=43, + element_type=Model.EnumSubset( + name="sub3", + enum=enum4, + allowed_elements={"e1": elements4["name2"]}))) + + structs = collections.OrderedDict() + structs["Struct1"] = Model.Struct( + name="Struct1", + design_description=DESIGN_DESCRIPTION, + issues=ISSUES, + members=members1) + structs["Struct2"] = Model.Struct(name="Struct2", + issues=ISSUES) + + interface = Model.Interface(enums=enums, + structs=structs, + functions=functions, + params={"param1": "value1", + "param2": "value2"}) + + os.path.exists = MagicMock(return_value=True) + uuid.uuid1 = MagicMock( + return_value=uuid.UUID("12345678123456781234567812345678")) + codecs.open = MagicMock() + + generator.generate(interface=interface, + filename="Test.xml", + namespace="XXX::YYY::ZZZ", + destination_dir="/some/test/dir") + + os.path.exists.assert_has_calls([call('/some/test/dir')]) + + open_result = codecs.open + mock_calls = open_result.mock_calls + + self.assertEqual(mock_calls[0], + call('/some/test/dir/Test.h', + mode='w', + encoding='utf-8'), + "Invalid header file creation") + + self.assertEqual(mock_calls[4], + call('/some/test/dir/Test.cc', + mode='w', + encoding='utf-8'), + "Invalid source file creation") + + self.assertEqual(str(mock_calls[2])[27:-2].replace("\\n", "\n"), + expected_h_file_content, + "Invalid header file content") + + self.assertEqual(str(mock_calls[6])[27:-2].replace("\\n", "\n"), + expected_cc_file_content, + "Invalid source file content") |