Make test function parsing robust
This commit enhances parsing of the test function in generate_test_code.py for
cases where return type and function name are on separate lines.
diff --git a/tests/scripts/test_generate_test_code.py b/tests/scripts/test_generate_test_code.py
index 29d9e4f..149159c 100755
--- a/tests/scripts/test_generate_test_code.py
+++ b/tests/scripts/test_generate_test_code.py
@@ -31,7 +31,7 @@
from generate_test_code import parse_until_pattern, GeneratorInputError
from generate_test_code import parse_suite_dependencies
from generate_test_code import parse_function_dependencies
-from generate_test_code import parse_function_signature, parse_function_code
+from generate_test_code import parse_function_arguments, parse_function_code
from generate_test_code import parse_functions, END_HEADER_REGEX
from generate_test_code import END_SUITE_HELPERS_REGEX, escaped_split
from generate_test_code import parse_test_data, gen_dep_check
@@ -476,7 +476,7 @@
class ParseFuncSignature(TestCase):
"""
- Test Suite for parse_function_signature().
+ Test Suite for parse_function_arguments().
"""
def test_int_and_char_params(self):
@@ -485,8 +485,7 @@
:return:
"""
line = 'void entropy_threshold( char * a, int b, int result )'
- name, args, local, arg_dispatch = parse_function_signature(line)
- self.assertEqual(name, 'entropy_threshold')
+ args, local, arg_dispatch = parse_function_arguments(line)
self.assertEqual(args, ['char*', 'int', 'int'])
self.assertEqual(local, '')
self.assertEqual(arg_dispatch, ['(char *) params[0]',
@@ -499,8 +498,7 @@
:return:
"""
line = 'void entropy_threshold( char * a, data_t * h, int result )'
- name, args, local, arg_dispatch = parse_function_signature(line)
- self.assertEqual(name, 'entropy_threshold')
+ args, local, arg_dispatch = parse_function_arguments(line)
self.assertEqual(args, ['char*', 'hex', 'int'])
self.assertEqual(local,
' data_t data1 = {(uint8_t *) params[1], '
@@ -509,21 +507,13 @@
'&data1',
'*( (int *) params[3] )'])
- def test_non_void_function(self):
- """
- Test invalid signature (non void).
- :return:
- """
- line = 'int entropy_threshold( char * a, data_t * h, int result )'
- self.assertRaises(ValueError, parse_function_signature, line)
-
def test_unsupported_arg(self):
"""
Test unsupported arguments (not among int, char * and data_t)
:return:
"""
- line = 'int entropy_threshold( char * a, data_t * h, int * result )'
- self.assertRaises(ValueError, parse_function_signature, line)
+ line = 'void entropy_threshold( char * a, data_t * h, char result )'
+ self.assertRaises(ValueError, parse_function_arguments, line)
def test_no_params(self):
"""
@@ -531,8 +521,7 @@
:return:
"""
line = 'void entropy_threshold()'
- name, args, local, arg_dispatch = parse_function_signature(line)
- self.assertEqual(name, 'entropy_threshold')
+ args, local, arg_dispatch = parse_function_arguments(line)
self.assertEqual(args, [])
self.assertEqual(local, '')
self.assertEqual(arg_dispatch, [])
@@ -554,8 +543,9 @@
function
'''
stream = StringIOWrapper('test_suite_ut.function', data)
- self.assertRaises(GeneratorInputError, parse_function_code, stream, [],
- [])
+ err_msg = 'file: test_suite_ut.function - Test functions not found!'
+ self.assertRaisesRegexp(GeneratorInputError, err_msg,
+ parse_function_code, stream, [], [])
def test_no_end_case_comment(self):
"""
@@ -568,17 +558,19 @@
}
'''
stream = StringIOWrapper('test_suite_ut.function', data)
- self.assertRaises(GeneratorInputError, parse_function_code, stream, [],
- [])
+ err_msg = r'file: test_suite_ut.function - '\
+ 'end case pattern .*? not found!'
+ self.assertRaisesRegexp(GeneratorInputError, err_msg,
+ parse_function_code, stream, [], [])
- @patch("generate_test_code.parse_function_signature")
+ @patch("generate_test_code.parse_function_arguments")
def test_function_called(self,
- parse_function_signature_mock):
+ parse_function_arguments_mock):
"""
Test parse_function_code()
:return:
"""
- parse_function_signature_mock.return_value = ('test_func', [], '', [])
+ parse_function_arguments_mock.return_value = ([], '', [])
data = '''
void test_func()
{
@@ -587,14 +579,14 @@
stream = StringIOWrapper('test_suite_ut.function', data)
self.assertRaises(GeneratorInputError, parse_function_code,
stream, [], [])
- self.assertTrue(parse_function_signature_mock.called)
- parse_function_signature_mock.assert_called_with('void test_func()\n')
+ self.assertTrue(parse_function_arguments_mock.called)
+ parse_function_arguments_mock.assert_called_with('void test_func()\n')
@patch("generate_test_code.gen_dispatch")
@patch("generate_test_code.gen_dependencies")
@patch("generate_test_code.gen_function_wrapper")
- @patch("generate_test_code.parse_function_signature")
- def test_return(self, parse_function_signature_mock,
+ @patch("generate_test_code.parse_function_arguments")
+ def test_return(self, parse_function_arguments_mock,
gen_function_wrapper_mock,
gen_dependencies_mock,
gen_dispatch_mock):
@@ -602,7 +594,7 @@
Test generated code.
:return:
"""
- parse_function_signature_mock.return_value = ('func', [], '', [])
+ parse_function_arguments_mock.return_value = ([], '', [])
gen_function_wrapper_mock.return_value = ''
gen_dependencies_mock.side_effect = gen_dependencies
gen_dispatch_mock.side_effect = gen_dispatch
@@ -617,8 +609,8 @@
stream = StringIOWrapper('test_suite_ut.function', data)
name, arg, code, dispatch_code = parse_function_code(stream, [], [])
- self.assertTrue(parse_function_signature_mock.called)
- parse_function_signature_mock.assert_called_with('void func()\n')
+ self.assertTrue(parse_function_arguments_mock.called)
+ parse_function_arguments_mock.assert_called_with('void func()\n')
gen_function_wrapper_mock.assert_called_with('test_func', '', [])
self.assertEqual(name, 'test_func')
self.assertEqual(arg, [])
@@ -638,8 +630,8 @@
@patch("generate_test_code.gen_dispatch")
@patch("generate_test_code.gen_dependencies")
@patch("generate_test_code.gen_function_wrapper")
- @patch("generate_test_code.parse_function_signature")
- def test_with_exit_label(self, parse_function_signature_mock,
+ @patch("generate_test_code.parse_function_arguments")
+ def test_with_exit_label(self, parse_function_arguments_mock,
gen_function_wrapper_mock,
gen_dependencies_mock,
gen_dispatch_mock):
@@ -647,7 +639,7 @@
Test when exit label is present.
:return:
"""
- parse_function_signature_mock.return_value = ('func', [], '', [])
+ parse_function_arguments_mock.return_value = ([], '', [])
gen_function_wrapper_mock.return_value = ''
gen_dependencies_mock.side_effect = gen_dependencies
gen_dispatch_mock.side_effect = gen_dispatch
@@ -678,6 +670,66 @@
'''
self.assertEqual(code, expected)
+ def test_non_void_function(self):
+ """
+ Test invalid signature (non void).
+ :return:
+ """
+ data = 'int entropy_threshold( char * a, data_t * h, int result )'
+ err_msg = 'file: test_suite_ut.function - Test functions not found!'
+ stream = StringIOWrapper('test_suite_ut.function', data)
+ self.assertRaisesRegexp(GeneratorInputError, err_msg,
+ parse_function_code, stream, [], [])
+
+ @patch("generate_test_code.gen_dispatch")
+ @patch("generate_test_code.gen_dependencies")
+ @patch("generate_test_code.gen_function_wrapper")
+ @patch("generate_test_code.parse_function_arguments")
+ def test_functio_name_on_newline(self, parse_function_arguments_mock,
+ gen_function_wrapper_mock,
+ gen_dependencies_mock,
+ gen_dispatch_mock):
+ """
+ Test when exit label is present.
+ :return:
+ """
+ parse_function_arguments_mock.return_value = ([], '', [])
+ gen_function_wrapper_mock.return_value = ''
+ gen_dependencies_mock.side_effect = gen_dependencies
+ gen_dispatch_mock.side_effect = gen_dispatch
+ data = '''
+void
+
+
+func()
+{
+ ba ba black sheep
+ have you any wool
+exit:
+ yes sir yes sir
+ 3 bags full
+}
+/* END_CASE */
+'''
+ stream = StringIOWrapper('test_suite_ut.function', data)
+ _, _, code, _ = parse_function_code(stream, [], [])
+
+ expected = '''#line 1 "test_suite_ut.function"
+
+void
+
+
+test_func()
+{
+ ba ba black sheep
+ have you any wool
+exit:
+ yes sir yes sir
+ 3 bags full
+}
+'''
+ self.assertEqual(code, expected)
+
class ParseFunction(TestCase):
"""