1a8e1175bSopenharmony_ci#!/usr/bin/env python3
2a8e1175bSopenharmony_ci# Unit test for generate_test_code.py
3a8e1175bSopenharmony_ci#
4a8e1175bSopenharmony_ci# Copyright The Mbed TLS Contributors
5a8e1175bSopenharmony_ci# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6a8e1175bSopenharmony_ci
7a8e1175bSopenharmony_ci"""
8a8e1175bSopenharmony_ciUnit tests for generate_test_code.py
9a8e1175bSopenharmony_ci"""
10a8e1175bSopenharmony_ci
11a8e1175bSopenharmony_cifrom io import StringIO
12a8e1175bSopenharmony_cifrom unittest import TestCase, main as unittest_main
13a8e1175bSopenharmony_cifrom unittest.mock import patch
14a8e1175bSopenharmony_ci
15a8e1175bSopenharmony_cifrom generate_test_code import gen_dependencies, gen_dependencies_one_line
16a8e1175bSopenharmony_cifrom generate_test_code import gen_function_wrapper, gen_dispatch
17a8e1175bSopenharmony_cifrom generate_test_code import parse_until_pattern, GeneratorInputError
18a8e1175bSopenharmony_cifrom generate_test_code import parse_suite_dependencies
19a8e1175bSopenharmony_cifrom generate_test_code import parse_function_dependencies
20a8e1175bSopenharmony_cifrom generate_test_code import parse_function_arguments, parse_function_code
21a8e1175bSopenharmony_cifrom generate_test_code import parse_functions, END_HEADER_REGEX
22a8e1175bSopenharmony_cifrom generate_test_code import END_SUITE_HELPERS_REGEX, escaped_split
23a8e1175bSopenharmony_cifrom generate_test_code import parse_test_data, gen_dep_check
24a8e1175bSopenharmony_cifrom generate_test_code import gen_expression_check, write_dependencies
25a8e1175bSopenharmony_cifrom generate_test_code import write_parameters, gen_suite_dep_checks
26a8e1175bSopenharmony_cifrom generate_test_code import gen_from_test_data
27a8e1175bSopenharmony_ci
28a8e1175bSopenharmony_ci
29a8e1175bSopenharmony_ciclass GenDep(TestCase):
30a8e1175bSopenharmony_ci    """
31a8e1175bSopenharmony_ci    Test suite for function gen_dep()
32a8e1175bSopenharmony_ci    """
33a8e1175bSopenharmony_ci
34a8e1175bSopenharmony_ci    def test_dependencies_list(self):
35a8e1175bSopenharmony_ci        """
36a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
37a8e1175bSopenharmony_ci        dependency list.
38a8e1175bSopenharmony_ci        :return:
39a8e1175bSopenharmony_ci        """
40a8e1175bSopenharmony_ci        dependencies = ['DEP1', 'DEP2']
41a8e1175bSopenharmony_ci        dep_start, dep_end = gen_dependencies(dependencies)
42a8e1175bSopenharmony_ci        preprocessor1, preprocessor2 = dep_start.splitlines()
43a8e1175bSopenharmony_ci        endif1, endif2 = dep_end.splitlines()
44a8e1175bSopenharmony_ci        self.assertEqual(preprocessor1, '#if defined(DEP1)',
45a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
46a8e1175bSopenharmony_ci        self.assertEqual(preprocessor2, '#if defined(DEP2)',
47a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
48a8e1175bSopenharmony_ci        self.assertEqual(endif1, '#endif /* DEP2 */',
49a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
50a8e1175bSopenharmony_ci        self.assertEqual(endif2, '#endif /* DEP1 */',
51a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
52a8e1175bSopenharmony_ci
53a8e1175bSopenharmony_ci    def test_disabled_dependencies_list(self):
54a8e1175bSopenharmony_ci        """
55a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
56a8e1175bSopenharmony_ci        dependency list.
57a8e1175bSopenharmony_ci        :return:
58a8e1175bSopenharmony_ci        """
59a8e1175bSopenharmony_ci        dependencies = ['!DEP1', '!DEP2']
60a8e1175bSopenharmony_ci        dep_start, dep_end = gen_dependencies(dependencies)
61a8e1175bSopenharmony_ci        preprocessor1, preprocessor2 = dep_start.splitlines()
62a8e1175bSopenharmony_ci        endif1, endif2 = dep_end.splitlines()
63a8e1175bSopenharmony_ci        self.assertEqual(preprocessor1, '#if !defined(DEP1)',
64a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
65a8e1175bSopenharmony_ci        self.assertEqual(preprocessor2, '#if !defined(DEP2)',
66a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
67a8e1175bSopenharmony_ci        self.assertEqual(endif1, '#endif /* !DEP2 */',
68a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
69a8e1175bSopenharmony_ci        self.assertEqual(endif2, '#endif /* !DEP1 */',
70a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
71a8e1175bSopenharmony_ci
72a8e1175bSopenharmony_ci    def test_mixed_dependencies_list(self):
73a8e1175bSopenharmony_ci        """
74a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
75a8e1175bSopenharmony_ci        dependency list.
76a8e1175bSopenharmony_ci        :return:
77a8e1175bSopenharmony_ci        """
78a8e1175bSopenharmony_ci        dependencies = ['!DEP1', 'DEP2']
79a8e1175bSopenharmony_ci        dep_start, dep_end = gen_dependencies(dependencies)
80a8e1175bSopenharmony_ci        preprocessor1, preprocessor2 = dep_start.splitlines()
81a8e1175bSopenharmony_ci        endif1, endif2 = dep_end.splitlines()
82a8e1175bSopenharmony_ci        self.assertEqual(preprocessor1, '#if !defined(DEP1)',
83a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
84a8e1175bSopenharmony_ci        self.assertEqual(preprocessor2, '#if defined(DEP2)',
85a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
86a8e1175bSopenharmony_ci        self.assertEqual(endif1, '#endif /* DEP2 */',
87a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
88a8e1175bSopenharmony_ci        self.assertEqual(endif2, '#endif /* !DEP1 */',
89a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
90a8e1175bSopenharmony_ci
91a8e1175bSopenharmony_ci    def test_empty_dependencies_list(self):
92a8e1175bSopenharmony_ci        """
93a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
94a8e1175bSopenharmony_ci        dependency list.
95a8e1175bSopenharmony_ci        :return:
96a8e1175bSopenharmony_ci        """
97a8e1175bSopenharmony_ci        dependencies = []
98a8e1175bSopenharmony_ci        dep_start, dep_end = gen_dependencies(dependencies)
99a8e1175bSopenharmony_ci        self.assertEqual(dep_start, '', 'Preprocessor generated incorrectly')
100a8e1175bSopenharmony_ci        self.assertEqual(dep_end, '', 'Preprocessor generated incorrectly')
101a8e1175bSopenharmony_ci
102a8e1175bSopenharmony_ci    def test_large_dependencies_list(self):
103a8e1175bSopenharmony_ci        """
104a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
105a8e1175bSopenharmony_ci        dependency list.
106a8e1175bSopenharmony_ci        :return:
107a8e1175bSopenharmony_ci        """
108a8e1175bSopenharmony_ci        dependencies = []
109a8e1175bSopenharmony_ci        count = 10
110a8e1175bSopenharmony_ci        for i in range(count):
111a8e1175bSopenharmony_ci            dependencies.append('DEP%d' % i)
112a8e1175bSopenharmony_ci        dep_start, dep_end = gen_dependencies(dependencies)
113a8e1175bSopenharmony_ci        self.assertEqual(len(dep_start.splitlines()), count,
114a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
115a8e1175bSopenharmony_ci        self.assertEqual(len(dep_end.splitlines()), count,
116a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
117a8e1175bSopenharmony_ci
118a8e1175bSopenharmony_ci
119a8e1175bSopenharmony_ciclass GenDepOneLine(TestCase):
120a8e1175bSopenharmony_ci    """
121a8e1175bSopenharmony_ci    Test Suite for testing gen_dependencies_one_line()
122a8e1175bSopenharmony_ci    """
123a8e1175bSopenharmony_ci
124a8e1175bSopenharmony_ci    def test_dependencies_list(self):
125a8e1175bSopenharmony_ci        """
126a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
127a8e1175bSopenharmony_ci        dependency list.
128a8e1175bSopenharmony_ci        :return:
129a8e1175bSopenharmony_ci        """
130a8e1175bSopenharmony_ci        dependencies = ['DEP1', 'DEP2']
131a8e1175bSopenharmony_ci        dep_str = gen_dependencies_one_line(dependencies)
132a8e1175bSopenharmony_ci        self.assertEqual(dep_str, '#if defined(DEP1) && defined(DEP2)',
133a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
134a8e1175bSopenharmony_ci
135a8e1175bSopenharmony_ci    def test_disabled_dependencies_list(self):
136a8e1175bSopenharmony_ci        """
137a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
138a8e1175bSopenharmony_ci        dependency list.
139a8e1175bSopenharmony_ci        :return:
140a8e1175bSopenharmony_ci        """
141a8e1175bSopenharmony_ci        dependencies = ['!DEP1', '!DEP2']
142a8e1175bSopenharmony_ci        dep_str = gen_dependencies_one_line(dependencies)
143a8e1175bSopenharmony_ci        self.assertEqual(dep_str, '#if !defined(DEP1) && !defined(DEP2)',
144a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci    def test_mixed_dependencies_list(self):
147a8e1175bSopenharmony_ci        """
148a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
149a8e1175bSopenharmony_ci        dependency list.
150a8e1175bSopenharmony_ci        :return:
151a8e1175bSopenharmony_ci        """
152a8e1175bSopenharmony_ci        dependencies = ['!DEP1', 'DEP2']
153a8e1175bSopenharmony_ci        dep_str = gen_dependencies_one_line(dependencies)
154a8e1175bSopenharmony_ci        self.assertEqual(dep_str, '#if !defined(DEP1) && defined(DEP2)',
155a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
156a8e1175bSopenharmony_ci
157a8e1175bSopenharmony_ci    def test_empty_dependencies_list(self):
158a8e1175bSopenharmony_ci        """
159a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
160a8e1175bSopenharmony_ci        dependency list.
161a8e1175bSopenharmony_ci        :return:
162a8e1175bSopenharmony_ci        """
163a8e1175bSopenharmony_ci        dependencies = []
164a8e1175bSopenharmony_ci        dep_str = gen_dependencies_one_line(dependencies)
165a8e1175bSopenharmony_ci        self.assertEqual(dep_str, '', 'Preprocessor generated incorrectly')
166a8e1175bSopenharmony_ci
167a8e1175bSopenharmony_ci    def test_large_dependencies_list(self):
168a8e1175bSopenharmony_ci        """
169a8e1175bSopenharmony_ci        Test that gen_dep() correctly creates dependencies for given
170a8e1175bSopenharmony_ci        dependency list.
171a8e1175bSopenharmony_ci        :return:
172a8e1175bSopenharmony_ci        """
173a8e1175bSopenharmony_ci        dependencies = []
174a8e1175bSopenharmony_ci        count = 10
175a8e1175bSopenharmony_ci        for i in range(count):
176a8e1175bSopenharmony_ci            dependencies.append('DEP%d' % i)
177a8e1175bSopenharmony_ci        dep_str = gen_dependencies_one_line(dependencies)
178a8e1175bSopenharmony_ci        expected = '#if ' + ' && '.join(['defined(%s)' %
179a8e1175bSopenharmony_ci                                         x for x in dependencies])
180a8e1175bSopenharmony_ci        self.assertEqual(dep_str, expected,
181a8e1175bSopenharmony_ci                         'Preprocessor generated incorrectly')
182a8e1175bSopenharmony_ci
183a8e1175bSopenharmony_ci
184a8e1175bSopenharmony_ciclass GenFunctionWrapper(TestCase):
185a8e1175bSopenharmony_ci    """
186a8e1175bSopenharmony_ci    Test Suite for testing gen_function_wrapper()
187a8e1175bSopenharmony_ci    """
188a8e1175bSopenharmony_ci
189a8e1175bSopenharmony_ci    def test_params_unpack(self):
190a8e1175bSopenharmony_ci        """
191a8e1175bSopenharmony_ci        Test that params are properly unpacked in the function call.
192a8e1175bSopenharmony_ci
193a8e1175bSopenharmony_ci        :return:
194a8e1175bSopenharmony_ci        """
195a8e1175bSopenharmony_ci        code = gen_function_wrapper('test_a', '', ('a', 'b', 'c', 'd'))
196a8e1175bSopenharmony_ci        expected = '''
197a8e1175bSopenharmony_civoid test_a_wrapper( void ** params )
198a8e1175bSopenharmony_ci{
199a8e1175bSopenharmony_ci
200a8e1175bSopenharmony_ci    test_a( a, b, c, d );
201a8e1175bSopenharmony_ci}
202a8e1175bSopenharmony_ci'''
203a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
204a8e1175bSopenharmony_ci
205a8e1175bSopenharmony_ci    def test_local(self):
206a8e1175bSopenharmony_ci        """
207a8e1175bSopenharmony_ci        Test that params are properly unpacked in the function call.
208a8e1175bSopenharmony_ci
209a8e1175bSopenharmony_ci        :return:
210a8e1175bSopenharmony_ci        """
211a8e1175bSopenharmony_ci        code = gen_function_wrapper('test_a',
212a8e1175bSopenharmony_ci                                    'int x = 1;', ('x', 'b', 'c', 'd'))
213a8e1175bSopenharmony_ci        expected = '''
214a8e1175bSopenharmony_civoid test_a_wrapper( void ** params )
215a8e1175bSopenharmony_ci{
216a8e1175bSopenharmony_ciint x = 1;
217a8e1175bSopenharmony_ci    test_a( x, b, c, d );
218a8e1175bSopenharmony_ci}
219a8e1175bSopenharmony_ci'''
220a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
221a8e1175bSopenharmony_ci
222a8e1175bSopenharmony_ci    def test_empty_params(self):
223a8e1175bSopenharmony_ci        """
224a8e1175bSopenharmony_ci        Test that params are properly unpacked in the function call.
225a8e1175bSopenharmony_ci
226a8e1175bSopenharmony_ci        :return:
227a8e1175bSopenharmony_ci        """
228a8e1175bSopenharmony_ci        code = gen_function_wrapper('test_a', '', ())
229a8e1175bSopenharmony_ci        expected = '''
230a8e1175bSopenharmony_civoid test_a_wrapper( void ** params )
231a8e1175bSopenharmony_ci{
232a8e1175bSopenharmony_ci    (void)params;
233a8e1175bSopenharmony_ci
234a8e1175bSopenharmony_ci    test_a(  );
235a8e1175bSopenharmony_ci}
236a8e1175bSopenharmony_ci'''
237a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
238a8e1175bSopenharmony_ci
239a8e1175bSopenharmony_ci
240a8e1175bSopenharmony_ciclass GenDispatch(TestCase):
241a8e1175bSopenharmony_ci    """
242a8e1175bSopenharmony_ci    Test suite for testing gen_dispatch()
243a8e1175bSopenharmony_ci    """
244a8e1175bSopenharmony_ci
245a8e1175bSopenharmony_ci    def test_dispatch(self):
246a8e1175bSopenharmony_ci        """
247a8e1175bSopenharmony_ci        Test that dispatch table entry is generated correctly.
248a8e1175bSopenharmony_ci        :return:
249a8e1175bSopenharmony_ci        """
250a8e1175bSopenharmony_ci        code = gen_dispatch('test_a', ['DEP1', 'DEP2'])
251a8e1175bSopenharmony_ci        expected = '''
252a8e1175bSopenharmony_ci#if defined(DEP1) && defined(DEP2)
253a8e1175bSopenharmony_ci    test_a_wrapper,
254a8e1175bSopenharmony_ci#else
255a8e1175bSopenharmony_ci    NULL,
256a8e1175bSopenharmony_ci#endif
257a8e1175bSopenharmony_ci'''
258a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
259a8e1175bSopenharmony_ci
260a8e1175bSopenharmony_ci    def test_empty_dependencies(self):
261a8e1175bSopenharmony_ci        """
262a8e1175bSopenharmony_ci        Test empty dependency list.
263a8e1175bSopenharmony_ci        :return:
264a8e1175bSopenharmony_ci        """
265a8e1175bSopenharmony_ci        code = gen_dispatch('test_a', [])
266a8e1175bSopenharmony_ci        expected = '''
267a8e1175bSopenharmony_ci    test_a_wrapper,
268a8e1175bSopenharmony_ci'''
269a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
270a8e1175bSopenharmony_ci
271a8e1175bSopenharmony_ci
272a8e1175bSopenharmony_ciclass StringIOWrapper(StringIO):
273a8e1175bSopenharmony_ci    """
274a8e1175bSopenharmony_ci    file like class to mock file object in tests.
275a8e1175bSopenharmony_ci    """
276a8e1175bSopenharmony_ci    def __init__(self, file_name, data, line_no=0):
277a8e1175bSopenharmony_ci        """
278a8e1175bSopenharmony_ci        Init file handle.
279a8e1175bSopenharmony_ci
280a8e1175bSopenharmony_ci        :param file_name:
281a8e1175bSopenharmony_ci        :param data:
282a8e1175bSopenharmony_ci        :param line_no:
283a8e1175bSopenharmony_ci        """
284a8e1175bSopenharmony_ci        super(StringIOWrapper, self).__init__(data)
285a8e1175bSopenharmony_ci        self.line_no = line_no
286a8e1175bSopenharmony_ci        self.name = file_name
287a8e1175bSopenharmony_ci
288a8e1175bSopenharmony_ci    def next(self):
289a8e1175bSopenharmony_ci        """
290a8e1175bSopenharmony_ci        Iterator method. This method overrides base class's
291a8e1175bSopenharmony_ci        next method and extends the next method to count the line
292a8e1175bSopenharmony_ci        numbers as each line is read.
293a8e1175bSopenharmony_ci
294a8e1175bSopenharmony_ci        :return: Line read from file.
295a8e1175bSopenharmony_ci        """
296a8e1175bSopenharmony_ci        parent = super(StringIOWrapper, self)
297a8e1175bSopenharmony_ci        line = parent.__next__()
298a8e1175bSopenharmony_ci        return line
299a8e1175bSopenharmony_ci
300a8e1175bSopenharmony_ci    def readline(self, _length=0):
301a8e1175bSopenharmony_ci        """
302a8e1175bSopenharmony_ci        Wrap the base class readline.
303a8e1175bSopenharmony_ci
304a8e1175bSopenharmony_ci        :param length:
305a8e1175bSopenharmony_ci        :return:
306a8e1175bSopenharmony_ci        """
307a8e1175bSopenharmony_ci        line = super(StringIOWrapper, self).readline()
308a8e1175bSopenharmony_ci        if line is not None:
309a8e1175bSopenharmony_ci            self.line_no += 1
310a8e1175bSopenharmony_ci        return line
311a8e1175bSopenharmony_ci
312a8e1175bSopenharmony_ci
313a8e1175bSopenharmony_ciclass ParseUntilPattern(TestCase):
314a8e1175bSopenharmony_ci    """
315a8e1175bSopenharmony_ci    Test Suite for testing parse_until_pattern().
316a8e1175bSopenharmony_ci    """
317a8e1175bSopenharmony_ci
318a8e1175bSopenharmony_ci    def test_suite_headers(self):
319a8e1175bSopenharmony_ci        """
320a8e1175bSopenharmony_ci        Test that suite headers are parsed correctly.
321a8e1175bSopenharmony_ci
322a8e1175bSopenharmony_ci        :return:
323a8e1175bSopenharmony_ci        """
324a8e1175bSopenharmony_ci        data = '''#include "mbedtls/ecp.h"
325a8e1175bSopenharmony_ci
326a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
327a8e1175bSopenharmony_ci/* END_HEADER */
328a8e1175bSopenharmony_ci'''
329a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
330a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
331a8e1175bSopenharmony_ci
332a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
333a8e1175bSopenharmony_ci'''
334a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data, line_no=0)
335a8e1175bSopenharmony_ci        headers = parse_until_pattern(stream, END_HEADER_REGEX)
336a8e1175bSopenharmony_ci        self.assertEqual(headers, expected)
337a8e1175bSopenharmony_ci
338a8e1175bSopenharmony_ci    def test_line_no(self):
339a8e1175bSopenharmony_ci        """
340a8e1175bSopenharmony_ci        Test that #line is set to correct line no. in source .function file.
341a8e1175bSopenharmony_ci
342a8e1175bSopenharmony_ci        :return:
343a8e1175bSopenharmony_ci        """
344a8e1175bSopenharmony_ci        data = '''#include "mbedtls/ecp.h"
345a8e1175bSopenharmony_ci
346a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
347a8e1175bSopenharmony_ci/* END_HEADER */
348a8e1175bSopenharmony_ci'''
349a8e1175bSopenharmony_ci        offset_line_no = 5
350a8e1175bSopenharmony_ci        expected = '''#line %d "test_suite_ut.function"
351a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
352a8e1175bSopenharmony_ci
353a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
354a8e1175bSopenharmony_ci''' % (offset_line_no + 1)
355a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data,
356a8e1175bSopenharmony_ci                                 offset_line_no)
357a8e1175bSopenharmony_ci        headers = parse_until_pattern(stream, END_HEADER_REGEX)
358a8e1175bSopenharmony_ci        self.assertEqual(headers, expected)
359a8e1175bSopenharmony_ci
360a8e1175bSopenharmony_ci    def test_no_end_header_comment(self):
361a8e1175bSopenharmony_ci        """
362a8e1175bSopenharmony_ci        Test that InvalidFileFormat is raised when end header comment is
363a8e1175bSopenharmony_ci        missing.
364a8e1175bSopenharmony_ci        :return:
365a8e1175bSopenharmony_ci        """
366a8e1175bSopenharmony_ci        data = '''#include "mbedtls/ecp.h"
367a8e1175bSopenharmony_ci
368a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
369a8e1175bSopenharmony_ci
370a8e1175bSopenharmony_ci'''
371a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
372a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, parse_until_pattern, stream,
373a8e1175bSopenharmony_ci                          END_HEADER_REGEX)
374a8e1175bSopenharmony_ci
375a8e1175bSopenharmony_ci
376a8e1175bSopenharmony_ciclass ParseSuiteDependencies(TestCase):
377a8e1175bSopenharmony_ci    """
378a8e1175bSopenharmony_ci    Test Suite for testing parse_suite_dependencies().
379a8e1175bSopenharmony_ci    """
380a8e1175bSopenharmony_ci
381a8e1175bSopenharmony_ci    def test_suite_dependencies(self):
382a8e1175bSopenharmony_ci        """
383a8e1175bSopenharmony_ci
384a8e1175bSopenharmony_ci        :return:
385a8e1175bSopenharmony_ci        """
386a8e1175bSopenharmony_ci        data = '''
387a8e1175bSopenharmony_ci * depends_on:MBEDTLS_ECP_C
388a8e1175bSopenharmony_ci * END_DEPENDENCIES
389a8e1175bSopenharmony_ci */
390a8e1175bSopenharmony_ci'''
391a8e1175bSopenharmony_ci        expected = ['MBEDTLS_ECP_C']
392a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
393a8e1175bSopenharmony_ci        dependencies = parse_suite_dependencies(stream)
394a8e1175bSopenharmony_ci        self.assertEqual(dependencies, expected)
395a8e1175bSopenharmony_ci
396a8e1175bSopenharmony_ci    def test_no_end_dep_comment(self):
397a8e1175bSopenharmony_ci        """
398a8e1175bSopenharmony_ci        Test that InvalidFileFormat is raised when end dep comment is missing.
399a8e1175bSopenharmony_ci        :return:
400a8e1175bSopenharmony_ci        """
401a8e1175bSopenharmony_ci        data = '''
402a8e1175bSopenharmony_ci* depends_on:MBEDTLS_ECP_C
403a8e1175bSopenharmony_ci'''
404a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
405a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, parse_suite_dependencies,
406a8e1175bSopenharmony_ci                          stream)
407a8e1175bSopenharmony_ci
408a8e1175bSopenharmony_ci    def test_dependencies_split(self):
409a8e1175bSopenharmony_ci        """
410a8e1175bSopenharmony_ci        Test that InvalidFileFormat is raised when end dep comment is missing.
411a8e1175bSopenharmony_ci        :return:
412a8e1175bSopenharmony_ci        """
413a8e1175bSopenharmony_ci        data = '''
414a8e1175bSopenharmony_ci * depends_on:MBEDTLS_ECP_C:A:B:   C  : D :F : G: !H
415a8e1175bSopenharmony_ci * END_DEPENDENCIES
416a8e1175bSopenharmony_ci */
417a8e1175bSopenharmony_ci'''
418a8e1175bSopenharmony_ci        expected = ['MBEDTLS_ECP_C', 'A', 'B', 'C', 'D', 'F', 'G', '!H']
419a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
420a8e1175bSopenharmony_ci        dependencies = parse_suite_dependencies(stream)
421a8e1175bSopenharmony_ci        self.assertEqual(dependencies, expected)
422a8e1175bSopenharmony_ci
423a8e1175bSopenharmony_ci
424a8e1175bSopenharmony_ciclass ParseFuncDependencies(TestCase):
425a8e1175bSopenharmony_ci    """
426a8e1175bSopenharmony_ci    Test Suite for testing parse_function_dependencies()
427a8e1175bSopenharmony_ci    """
428a8e1175bSopenharmony_ci
429a8e1175bSopenharmony_ci    def test_function_dependencies(self):
430a8e1175bSopenharmony_ci        """
431a8e1175bSopenharmony_ci        Test that parse_function_dependencies() correctly parses function
432a8e1175bSopenharmony_ci        dependencies.
433a8e1175bSopenharmony_ci        :return:
434a8e1175bSopenharmony_ci        """
435a8e1175bSopenharmony_ci        line = '/* BEGIN_CASE ' \
436a8e1175bSopenharmony_ci               'depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */'
437a8e1175bSopenharmony_ci        expected = ['MBEDTLS_ENTROPY_NV_SEED', 'MBEDTLS_FS_IO']
438a8e1175bSopenharmony_ci        dependencies = parse_function_dependencies(line)
439a8e1175bSopenharmony_ci        self.assertEqual(dependencies, expected)
440a8e1175bSopenharmony_ci
441a8e1175bSopenharmony_ci    def test_no_dependencies(self):
442a8e1175bSopenharmony_ci        """
443a8e1175bSopenharmony_ci        Test that parse_function_dependencies() correctly parses function
444a8e1175bSopenharmony_ci        dependencies.
445a8e1175bSopenharmony_ci        :return:
446a8e1175bSopenharmony_ci        """
447a8e1175bSopenharmony_ci        line = '/* BEGIN_CASE */'
448a8e1175bSopenharmony_ci        dependencies = parse_function_dependencies(line)
449a8e1175bSopenharmony_ci        self.assertEqual(dependencies, [])
450a8e1175bSopenharmony_ci
451a8e1175bSopenharmony_ci    def test_tolerance(self):
452a8e1175bSopenharmony_ci        """
453a8e1175bSopenharmony_ci        Test that parse_function_dependencies() correctly parses function
454a8e1175bSopenharmony_ci        dependencies.
455a8e1175bSopenharmony_ci        :return:
456a8e1175bSopenharmony_ci        """
457a8e1175bSopenharmony_ci        line = '/* BEGIN_CASE depends_on:MBEDTLS_FS_IO: A : !B:C : F*/'
458a8e1175bSopenharmony_ci        dependencies = parse_function_dependencies(line)
459a8e1175bSopenharmony_ci        self.assertEqual(dependencies, ['MBEDTLS_FS_IO', 'A', '!B', 'C', 'F'])
460a8e1175bSopenharmony_ci
461a8e1175bSopenharmony_ci
462a8e1175bSopenharmony_ciclass ParseFuncSignature(TestCase):
463a8e1175bSopenharmony_ci    """
464a8e1175bSopenharmony_ci    Test Suite for parse_function_arguments().
465a8e1175bSopenharmony_ci    """
466a8e1175bSopenharmony_ci
467a8e1175bSopenharmony_ci    def test_int_and_char_params(self):
468a8e1175bSopenharmony_ci        """
469a8e1175bSopenharmony_ci        Test int and char parameters parsing
470a8e1175bSopenharmony_ci        :return:
471a8e1175bSopenharmony_ci        """
472a8e1175bSopenharmony_ci        line = 'void entropy_threshold( char * a, int b, int result )'
473a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
474a8e1175bSopenharmony_ci        self.assertEqual(args, ['char*', 'int', 'int'])
475a8e1175bSopenharmony_ci        self.assertEqual(local, '')
476a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch,
477a8e1175bSopenharmony_ci                         ['(char *) params[0]',
478a8e1175bSopenharmony_ci                          '((mbedtls_test_argument_t *) params[1])->sint',
479a8e1175bSopenharmony_ci                          '((mbedtls_test_argument_t *) params[2])->sint'])
480a8e1175bSopenharmony_ci
481a8e1175bSopenharmony_ci    def test_hex_params(self):
482a8e1175bSopenharmony_ci        """
483a8e1175bSopenharmony_ci        Test hex parameters parsing
484a8e1175bSopenharmony_ci        :return:
485a8e1175bSopenharmony_ci        """
486a8e1175bSopenharmony_ci        line = 'void entropy_threshold( char * a, data_t * h, int result )'
487a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
488a8e1175bSopenharmony_ci        self.assertEqual(args, ['char*', 'hex', 'int'])
489a8e1175bSopenharmony_ci        self.assertEqual(local,
490a8e1175bSopenharmony_ci                         '    data_t data1 = {(uint8_t *) params[1], '
491a8e1175bSopenharmony_ci                         '((mbedtls_test_argument_t *) params[2])->len};\n')
492a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch, ['(char *) params[0]',
493a8e1175bSopenharmony_ci                                        '&data1',
494a8e1175bSopenharmony_ci                                        '((mbedtls_test_argument_t *) params[3])->sint'])
495a8e1175bSopenharmony_ci
496a8e1175bSopenharmony_ci    def test_unsupported_arg(self):
497a8e1175bSopenharmony_ci        """
498a8e1175bSopenharmony_ci        Test unsupported argument type
499a8e1175bSopenharmony_ci        :return:
500a8e1175bSopenharmony_ci        """
501a8e1175bSopenharmony_ci        line = 'void entropy_threshold( char * a, data_t * h, unknown_t result )'
502a8e1175bSopenharmony_ci        self.assertRaises(ValueError, parse_function_arguments, line)
503a8e1175bSopenharmony_ci
504a8e1175bSopenharmony_ci    def test_empty_params(self):
505a8e1175bSopenharmony_ci        """
506a8e1175bSopenharmony_ci        Test no parameters (nothing between parentheses).
507a8e1175bSopenharmony_ci        :return:
508a8e1175bSopenharmony_ci        """
509a8e1175bSopenharmony_ci        line = 'void entropy_threshold()'
510a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
511a8e1175bSopenharmony_ci        self.assertEqual(args, [])
512a8e1175bSopenharmony_ci        self.assertEqual(local, '')
513a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch, [])
514a8e1175bSopenharmony_ci
515a8e1175bSopenharmony_ci    def test_blank_params(self):
516a8e1175bSopenharmony_ci        """
517a8e1175bSopenharmony_ci        Test no parameters (space between parentheses).
518a8e1175bSopenharmony_ci        :return:
519a8e1175bSopenharmony_ci        """
520a8e1175bSopenharmony_ci        line = 'void entropy_threshold( )'
521a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
522a8e1175bSopenharmony_ci        self.assertEqual(args, [])
523a8e1175bSopenharmony_ci        self.assertEqual(local, '')
524a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch, [])
525a8e1175bSopenharmony_ci
526a8e1175bSopenharmony_ci    def test_void_params(self):
527a8e1175bSopenharmony_ci        """
528a8e1175bSopenharmony_ci        Test no parameters (void keyword).
529a8e1175bSopenharmony_ci        :return:
530a8e1175bSopenharmony_ci        """
531a8e1175bSopenharmony_ci        line = 'void entropy_threshold(void)'
532a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
533a8e1175bSopenharmony_ci        self.assertEqual(args, [])
534a8e1175bSopenharmony_ci        self.assertEqual(local, '')
535a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch, [])
536a8e1175bSopenharmony_ci
537a8e1175bSopenharmony_ci    def test_void_space_params(self):
538a8e1175bSopenharmony_ci        """
539a8e1175bSopenharmony_ci        Test no parameters (void with spaces).
540a8e1175bSopenharmony_ci        :return:
541a8e1175bSopenharmony_ci        """
542a8e1175bSopenharmony_ci        line = 'void entropy_threshold( void )'
543a8e1175bSopenharmony_ci        args, local, arg_dispatch = parse_function_arguments(line)
544a8e1175bSopenharmony_ci        self.assertEqual(args, [])
545a8e1175bSopenharmony_ci        self.assertEqual(local, '')
546a8e1175bSopenharmony_ci        self.assertEqual(arg_dispatch, [])
547a8e1175bSopenharmony_ci
548a8e1175bSopenharmony_ci
549a8e1175bSopenharmony_ciclass ParseFunctionCode(TestCase):
550a8e1175bSopenharmony_ci    """
551a8e1175bSopenharmony_ci    Test suite for testing parse_function_code()
552a8e1175bSopenharmony_ci    """
553a8e1175bSopenharmony_ci
554a8e1175bSopenharmony_ci    def test_no_function(self):
555a8e1175bSopenharmony_ci        """
556a8e1175bSopenharmony_ci        Test no test function found.
557a8e1175bSopenharmony_ci        :return:
558a8e1175bSopenharmony_ci        """
559a8e1175bSopenharmony_ci        data = '''
560a8e1175bSopenharmony_ciNo
561a8e1175bSopenharmony_citest
562a8e1175bSopenharmony_cifunction
563a8e1175bSopenharmony_ci'''
564a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
565a8e1175bSopenharmony_ci        err_msg = 'file: test_suite_ut.function - Test functions not found!'
566a8e1175bSopenharmony_ci        self.assertRaisesRegex(GeneratorInputError, err_msg,
567a8e1175bSopenharmony_ci                               parse_function_code, stream, [], [])
568a8e1175bSopenharmony_ci
569a8e1175bSopenharmony_ci    def test_no_end_case_comment(self):
570a8e1175bSopenharmony_ci        """
571a8e1175bSopenharmony_ci        Test missing end case.
572a8e1175bSopenharmony_ci        :return:
573a8e1175bSopenharmony_ci        """
574a8e1175bSopenharmony_ci        data = '''
575a8e1175bSopenharmony_civoid test_func()
576a8e1175bSopenharmony_ci{
577a8e1175bSopenharmony_ci}
578a8e1175bSopenharmony_ci'''
579a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
580a8e1175bSopenharmony_ci        err_msg = r'file: test_suite_ut.function - '\
581a8e1175bSopenharmony_ci                  'end case pattern .*? not found!'
582a8e1175bSopenharmony_ci        self.assertRaisesRegex(GeneratorInputError, err_msg,
583a8e1175bSopenharmony_ci                               parse_function_code, stream, [], [])
584a8e1175bSopenharmony_ci
585a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
586a8e1175bSopenharmony_ci    def test_function_called(self,
587a8e1175bSopenharmony_ci                             parse_function_arguments_mock):
588a8e1175bSopenharmony_ci        """
589a8e1175bSopenharmony_ci        Test parse_function_code()
590a8e1175bSopenharmony_ci        :return:
591a8e1175bSopenharmony_ci        """
592a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
593a8e1175bSopenharmony_ci        data = '''
594a8e1175bSopenharmony_civoid test_func()
595a8e1175bSopenharmony_ci{
596a8e1175bSopenharmony_ci}
597a8e1175bSopenharmony_ci'''
598a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
599a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, parse_function_code,
600a8e1175bSopenharmony_ci                          stream, [], [])
601a8e1175bSopenharmony_ci        self.assertTrue(parse_function_arguments_mock.called)
602a8e1175bSopenharmony_ci        parse_function_arguments_mock.assert_called_with('void test_func()\n')
603a8e1175bSopenharmony_ci
604a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
605a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
606a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
607a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
608a8e1175bSopenharmony_ci    def test_return(self, parse_function_arguments_mock,
609a8e1175bSopenharmony_ci                    gen_function_wrapper_mock,
610a8e1175bSopenharmony_ci                    gen_dependencies_mock,
611a8e1175bSopenharmony_ci                    gen_dispatch_mock):
612a8e1175bSopenharmony_ci        """
613a8e1175bSopenharmony_ci        Test generated code.
614a8e1175bSopenharmony_ci        :return:
615a8e1175bSopenharmony_ci        """
616a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
617a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
618a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
619a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
620a8e1175bSopenharmony_ci        data = '''
621a8e1175bSopenharmony_civoid func()
622a8e1175bSopenharmony_ci{
623a8e1175bSopenharmony_ci    ba ba black sheep
624a8e1175bSopenharmony_ci    have you any wool
625a8e1175bSopenharmony_ci}
626a8e1175bSopenharmony_ci/* END_CASE */
627a8e1175bSopenharmony_ci'''
628a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
629a8e1175bSopenharmony_ci        name, arg, code, dispatch_code = parse_function_code(stream, [], [])
630a8e1175bSopenharmony_ci
631a8e1175bSopenharmony_ci        self.assertTrue(parse_function_arguments_mock.called)
632a8e1175bSopenharmony_ci        parse_function_arguments_mock.assert_called_with('void func()\n')
633a8e1175bSopenharmony_ci        gen_function_wrapper_mock.assert_called_with('test_func', '', [])
634a8e1175bSopenharmony_ci        self.assertEqual(name, 'test_func')
635a8e1175bSopenharmony_ci        self.assertEqual(arg, [])
636a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
637a8e1175bSopenharmony_ci
638a8e1175bSopenharmony_civoid test_func(void)
639a8e1175bSopenharmony_ci{
640a8e1175bSopenharmony_ci    ba ba black sheep
641a8e1175bSopenharmony_ci    have you any wool
642a8e1175bSopenharmony_ciexit:
643a8e1175bSopenharmony_ci    ;
644a8e1175bSopenharmony_ci}
645a8e1175bSopenharmony_ci'''
646a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
647a8e1175bSopenharmony_ci        self.assertEqual(dispatch_code, "\n    test_func_wrapper,\n")
648a8e1175bSopenharmony_ci
649a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
650a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
651a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
652a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
653a8e1175bSopenharmony_ci    def test_with_exit_label(self, parse_function_arguments_mock,
654a8e1175bSopenharmony_ci                             gen_function_wrapper_mock,
655a8e1175bSopenharmony_ci                             gen_dependencies_mock,
656a8e1175bSopenharmony_ci                             gen_dispatch_mock):
657a8e1175bSopenharmony_ci        """
658a8e1175bSopenharmony_ci        Test when exit label is present.
659a8e1175bSopenharmony_ci        :return:
660a8e1175bSopenharmony_ci        """
661a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
662a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
663a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
664a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
665a8e1175bSopenharmony_ci        data = '''
666a8e1175bSopenharmony_civoid func()
667a8e1175bSopenharmony_ci{
668a8e1175bSopenharmony_ci    ba ba black sheep
669a8e1175bSopenharmony_ci    have you any wool
670a8e1175bSopenharmony_ciexit:
671a8e1175bSopenharmony_ci    yes sir yes sir
672a8e1175bSopenharmony_ci    3 bags full
673a8e1175bSopenharmony_ci}
674a8e1175bSopenharmony_ci/* END_CASE */
675a8e1175bSopenharmony_ci'''
676a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
677a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
678a8e1175bSopenharmony_ci
679a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
680a8e1175bSopenharmony_ci
681a8e1175bSopenharmony_civoid test_func(void)
682a8e1175bSopenharmony_ci{
683a8e1175bSopenharmony_ci    ba ba black sheep
684a8e1175bSopenharmony_ci    have you any wool
685a8e1175bSopenharmony_ciexit:
686a8e1175bSopenharmony_ci    yes sir yes sir
687a8e1175bSopenharmony_ci    3 bags full
688a8e1175bSopenharmony_ci}
689a8e1175bSopenharmony_ci'''
690a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
691a8e1175bSopenharmony_ci
692a8e1175bSopenharmony_ci    def test_non_void_function(self):
693a8e1175bSopenharmony_ci        """
694a8e1175bSopenharmony_ci        Test invalid signature (non void).
695a8e1175bSopenharmony_ci        :return:
696a8e1175bSopenharmony_ci        """
697a8e1175bSopenharmony_ci        data = 'int entropy_threshold( char * a, data_t * h, int result )'
698a8e1175bSopenharmony_ci        err_msg = 'file: test_suite_ut.function - Test functions not found!'
699a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
700a8e1175bSopenharmony_ci        self.assertRaisesRegex(GeneratorInputError, err_msg,
701a8e1175bSopenharmony_ci                               parse_function_code, stream, [], [])
702a8e1175bSopenharmony_ci
703a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
704a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
705a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
706a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
707a8e1175bSopenharmony_ci    def test_function_name_on_newline(self, parse_function_arguments_mock,
708a8e1175bSopenharmony_ci                                      gen_function_wrapper_mock,
709a8e1175bSopenharmony_ci                                      gen_dependencies_mock,
710a8e1175bSopenharmony_ci                                      gen_dispatch_mock):
711a8e1175bSopenharmony_ci        """
712a8e1175bSopenharmony_ci        Test with line break before the function name.
713a8e1175bSopenharmony_ci        :return:
714a8e1175bSopenharmony_ci        """
715a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
716a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
717a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
718a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
719a8e1175bSopenharmony_ci        data = '''
720a8e1175bSopenharmony_civoid
721a8e1175bSopenharmony_ci
722a8e1175bSopenharmony_ci
723a8e1175bSopenharmony_cifunc()
724a8e1175bSopenharmony_ci{
725a8e1175bSopenharmony_ci    ba ba black sheep
726a8e1175bSopenharmony_ci    have you any wool
727a8e1175bSopenharmony_ciexit:
728a8e1175bSopenharmony_ci    yes sir yes sir
729a8e1175bSopenharmony_ci    3 bags full
730a8e1175bSopenharmony_ci}
731a8e1175bSopenharmony_ci/* END_CASE */
732a8e1175bSopenharmony_ci'''
733a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
734a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
735a8e1175bSopenharmony_ci
736a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
737a8e1175bSopenharmony_ci
738a8e1175bSopenharmony_civoid
739a8e1175bSopenharmony_ci
740a8e1175bSopenharmony_ci
741a8e1175bSopenharmony_citest_func(void)
742a8e1175bSopenharmony_ci{
743a8e1175bSopenharmony_ci    ba ba black sheep
744a8e1175bSopenharmony_ci    have you any wool
745a8e1175bSopenharmony_ciexit:
746a8e1175bSopenharmony_ci    yes sir yes sir
747a8e1175bSopenharmony_ci    3 bags full
748a8e1175bSopenharmony_ci}
749a8e1175bSopenharmony_ci'''
750a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
751a8e1175bSopenharmony_ci
752a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
753a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
754a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
755a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
756a8e1175bSopenharmony_ci    def test_case_starting_with_comment(self, parse_function_arguments_mock,
757a8e1175bSopenharmony_ci                                        gen_function_wrapper_mock,
758a8e1175bSopenharmony_ci                                        gen_dependencies_mock,
759a8e1175bSopenharmony_ci                                        gen_dispatch_mock):
760a8e1175bSopenharmony_ci        """
761a8e1175bSopenharmony_ci        Test with comments before the function signature
762a8e1175bSopenharmony_ci        :return:
763a8e1175bSopenharmony_ci        """
764a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
765a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
766a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
767a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
768a8e1175bSopenharmony_ci        data = '''/* comment */
769a8e1175bSopenharmony_ci/* more
770a8e1175bSopenharmony_ci * comment */
771a8e1175bSopenharmony_ci// this is\\
772a8e1175bSopenharmony_cistill \\
773a8e1175bSopenharmony_cia comment
774a8e1175bSopenharmony_civoid func()
775a8e1175bSopenharmony_ci{
776a8e1175bSopenharmony_ci    ba ba black sheep
777a8e1175bSopenharmony_ci    have you any wool
778a8e1175bSopenharmony_ciexit:
779a8e1175bSopenharmony_ci    yes sir yes sir
780a8e1175bSopenharmony_ci    3 bags full
781a8e1175bSopenharmony_ci}
782a8e1175bSopenharmony_ci/* END_CASE */
783a8e1175bSopenharmony_ci'''
784a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
785a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
786a8e1175bSopenharmony_ci
787a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
788a8e1175bSopenharmony_ci
789a8e1175bSopenharmony_ci
790a8e1175bSopenharmony_ci
791a8e1175bSopenharmony_ci
792a8e1175bSopenharmony_ci
793a8e1175bSopenharmony_ci
794a8e1175bSopenharmony_civoid test_func(void)
795a8e1175bSopenharmony_ci{
796a8e1175bSopenharmony_ci    ba ba black sheep
797a8e1175bSopenharmony_ci    have you any wool
798a8e1175bSopenharmony_ciexit:
799a8e1175bSopenharmony_ci    yes sir yes sir
800a8e1175bSopenharmony_ci    3 bags full
801a8e1175bSopenharmony_ci}
802a8e1175bSopenharmony_ci'''
803a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
804a8e1175bSopenharmony_ci
805a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
806a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
807a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
808a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
809a8e1175bSopenharmony_ci    def test_comment_in_prototype(self, parse_function_arguments_mock,
810a8e1175bSopenharmony_ci                                  gen_function_wrapper_mock,
811a8e1175bSopenharmony_ci                                  gen_dependencies_mock,
812a8e1175bSopenharmony_ci                                  gen_dispatch_mock):
813a8e1175bSopenharmony_ci        """
814a8e1175bSopenharmony_ci        Test with comments in the function prototype
815a8e1175bSopenharmony_ci        :return:
816a8e1175bSopenharmony_ci        """
817a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
818a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
819a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
820a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
821a8e1175bSopenharmony_ci        data = '''
822a8e1175bSopenharmony_civoid func( int x, // (line \\
823a8e1175bSopenharmony_ci                     comment)
824a8e1175bSopenharmony_ci           int y /* lone closing parenthesis) */ )
825a8e1175bSopenharmony_ci{
826a8e1175bSopenharmony_ci    ba ba black sheep
827a8e1175bSopenharmony_ci    have you any wool
828a8e1175bSopenharmony_ciexit:
829a8e1175bSopenharmony_ci    yes sir yes sir
830a8e1175bSopenharmony_ci    3 bags full
831a8e1175bSopenharmony_ci}
832a8e1175bSopenharmony_ci/* END_CASE */
833a8e1175bSopenharmony_ci'''
834a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
835a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
836a8e1175bSopenharmony_ci
837a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
838a8e1175bSopenharmony_ci
839a8e1175bSopenharmony_civoid test_func( int x,
840a8e1175bSopenharmony_ci
841a8e1175bSopenharmony_ci           int y                                 )
842a8e1175bSopenharmony_ci{
843a8e1175bSopenharmony_ci    ba ba black sheep
844a8e1175bSopenharmony_ci    have you any wool
845a8e1175bSopenharmony_ciexit:
846a8e1175bSopenharmony_ci    yes sir yes sir
847a8e1175bSopenharmony_ci    3 bags full
848a8e1175bSopenharmony_ci}
849a8e1175bSopenharmony_ci'''
850a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
851a8e1175bSopenharmony_ci
852a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
853a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
854a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
855a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
856a8e1175bSopenharmony_ci    def test_line_comment_in_block_comment(self, parse_function_arguments_mock,
857a8e1175bSopenharmony_ci                                           gen_function_wrapper_mock,
858a8e1175bSopenharmony_ci                                           gen_dependencies_mock,
859a8e1175bSopenharmony_ci                                           gen_dispatch_mock):
860a8e1175bSopenharmony_ci        """
861a8e1175bSopenharmony_ci        Test with line comment in block comment.
862a8e1175bSopenharmony_ci        :return:
863a8e1175bSopenharmony_ci        """
864a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
865a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
866a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
867a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
868a8e1175bSopenharmony_ci        data = '''
869a8e1175bSopenharmony_civoid func( int x /* // */ )
870a8e1175bSopenharmony_ci{
871a8e1175bSopenharmony_ci    ba ba black sheep
872a8e1175bSopenharmony_ci    have you any wool
873a8e1175bSopenharmony_ciexit:
874a8e1175bSopenharmony_ci    yes sir yes sir
875a8e1175bSopenharmony_ci    3 bags full
876a8e1175bSopenharmony_ci}
877a8e1175bSopenharmony_ci/* END_CASE */
878a8e1175bSopenharmony_ci'''
879a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
880a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
881a8e1175bSopenharmony_ci
882a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
883a8e1175bSopenharmony_ci
884a8e1175bSopenharmony_civoid test_func( int x          )
885a8e1175bSopenharmony_ci{
886a8e1175bSopenharmony_ci    ba ba black sheep
887a8e1175bSopenharmony_ci    have you any wool
888a8e1175bSopenharmony_ciexit:
889a8e1175bSopenharmony_ci    yes sir yes sir
890a8e1175bSopenharmony_ci    3 bags full
891a8e1175bSopenharmony_ci}
892a8e1175bSopenharmony_ci'''
893a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
894a8e1175bSopenharmony_ci
895a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dispatch")
896a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_dependencies")
897a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_function_wrapper")
898a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_arguments")
899a8e1175bSopenharmony_ci    def test_block_comment_in_line_comment(self, parse_function_arguments_mock,
900a8e1175bSopenharmony_ci                                           gen_function_wrapper_mock,
901a8e1175bSopenharmony_ci                                           gen_dependencies_mock,
902a8e1175bSopenharmony_ci                                           gen_dispatch_mock):
903a8e1175bSopenharmony_ci        """
904a8e1175bSopenharmony_ci        Test with block comment in line comment.
905a8e1175bSopenharmony_ci        :return:
906a8e1175bSopenharmony_ci        """
907a8e1175bSopenharmony_ci        parse_function_arguments_mock.return_value = ([], '', [])
908a8e1175bSopenharmony_ci        gen_function_wrapper_mock.return_value = ''
909a8e1175bSopenharmony_ci        gen_dependencies_mock.side_effect = gen_dependencies
910a8e1175bSopenharmony_ci        gen_dispatch_mock.side_effect = gen_dispatch
911a8e1175bSopenharmony_ci        data = '''
912a8e1175bSopenharmony_ci// /*
913a8e1175bSopenharmony_civoid func( int x )
914a8e1175bSopenharmony_ci{
915a8e1175bSopenharmony_ci    ba ba black sheep
916a8e1175bSopenharmony_ci    have you any wool
917a8e1175bSopenharmony_ciexit:
918a8e1175bSopenharmony_ci    yes sir yes sir
919a8e1175bSopenharmony_ci    3 bags full
920a8e1175bSopenharmony_ci}
921a8e1175bSopenharmony_ci/* END_CASE */
922a8e1175bSopenharmony_ci'''
923a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
924a8e1175bSopenharmony_ci        _, _, code, _ = parse_function_code(stream, [], [])
925a8e1175bSopenharmony_ci
926a8e1175bSopenharmony_ci        expected = '''#line 1 "test_suite_ut.function"
927a8e1175bSopenharmony_ci
928a8e1175bSopenharmony_ci
929a8e1175bSopenharmony_civoid test_func( int x )
930a8e1175bSopenharmony_ci{
931a8e1175bSopenharmony_ci    ba ba black sheep
932a8e1175bSopenharmony_ci    have you any wool
933a8e1175bSopenharmony_ciexit:
934a8e1175bSopenharmony_ci    yes sir yes sir
935a8e1175bSopenharmony_ci    3 bags full
936a8e1175bSopenharmony_ci}
937a8e1175bSopenharmony_ci'''
938a8e1175bSopenharmony_ci        self.assertEqual(code, expected)
939a8e1175bSopenharmony_ci
940a8e1175bSopenharmony_ci
941a8e1175bSopenharmony_ciclass ParseFunction(TestCase):
942a8e1175bSopenharmony_ci    """
943a8e1175bSopenharmony_ci    Test Suite for testing parse_functions()
944a8e1175bSopenharmony_ci    """
945a8e1175bSopenharmony_ci
946a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_until_pattern")
947a8e1175bSopenharmony_ci    def test_begin_header(self, parse_until_pattern_mock):
948a8e1175bSopenharmony_ci        """
949a8e1175bSopenharmony_ci        Test that begin header is checked and parse_until_pattern() is called.
950a8e1175bSopenharmony_ci        :return:
951a8e1175bSopenharmony_ci        """
952a8e1175bSopenharmony_ci        def stop(*_unused):
953a8e1175bSopenharmony_ci            """Stop when parse_until_pattern is called."""
954a8e1175bSopenharmony_ci            raise Exception
955a8e1175bSopenharmony_ci        parse_until_pattern_mock.side_effect = stop
956a8e1175bSopenharmony_ci        data = '''/* BEGIN_HEADER */
957a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
958a8e1175bSopenharmony_ci
959a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
960a8e1175bSopenharmony_ci/* END_HEADER */
961a8e1175bSopenharmony_ci'''
962a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
963a8e1175bSopenharmony_ci        self.assertRaises(Exception, parse_functions, stream)
964a8e1175bSopenharmony_ci        parse_until_pattern_mock.assert_called_with(stream, END_HEADER_REGEX)
965a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 1)
966a8e1175bSopenharmony_ci
967a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_until_pattern")
968a8e1175bSopenharmony_ci    def test_begin_helper(self, parse_until_pattern_mock):
969a8e1175bSopenharmony_ci        """
970a8e1175bSopenharmony_ci        Test that begin helper is checked and parse_until_pattern() is called.
971a8e1175bSopenharmony_ci        :return:
972a8e1175bSopenharmony_ci        """
973a8e1175bSopenharmony_ci        def stop(*_unused):
974a8e1175bSopenharmony_ci            """Stop when parse_until_pattern is called."""
975a8e1175bSopenharmony_ci            raise Exception
976a8e1175bSopenharmony_ci        parse_until_pattern_mock.side_effect = stop
977a8e1175bSopenharmony_ci        data = '''/* BEGIN_SUITE_HELPERS */
978a8e1175bSopenharmony_civoid print_hello_world()
979a8e1175bSopenharmony_ci{
980a8e1175bSopenharmony_ci    printf("Hello World!\n");
981a8e1175bSopenharmony_ci}
982a8e1175bSopenharmony_ci/* END_SUITE_HELPERS */
983a8e1175bSopenharmony_ci'''
984a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
985a8e1175bSopenharmony_ci        self.assertRaises(Exception, parse_functions, stream)
986a8e1175bSopenharmony_ci        parse_until_pattern_mock.assert_called_with(stream,
987a8e1175bSopenharmony_ci                                                    END_SUITE_HELPERS_REGEX)
988a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 1)
989a8e1175bSopenharmony_ci
990a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_suite_dependencies")
991a8e1175bSopenharmony_ci    def test_begin_dep(self, parse_suite_dependencies_mock):
992a8e1175bSopenharmony_ci        """
993a8e1175bSopenharmony_ci        Test that begin dep is checked and parse_suite_dependencies() is
994a8e1175bSopenharmony_ci        called.
995a8e1175bSopenharmony_ci        :return:
996a8e1175bSopenharmony_ci        """
997a8e1175bSopenharmony_ci        def stop(*_unused):
998a8e1175bSopenharmony_ci            """Stop when parse_until_pattern is called."""
999a8e1175bSopenharmony_ci            raise Exception
1000a8e1175bSopenharmony_ci        parse_suite_dependencies_mock.side_effect = stop
1001a8e1175bSopenharmony_ci        data = '''/* BEGIN_DEPENDENCIES
1002a8e1175bSopenharmony_ci * depends_on:MBEDTLS_ECP_C
1003a8e1175bSopenharmony_ci * END_DEPENDENCIES
1004a8e1175bSopenharmony_ci */
1005a8e1175bSopenharmony_ci'''
1006a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1007a8e1175bSopenharmony_ci        self.assertRaises(Exception, parse_functions, stream)
1008a8e1175bSopenharmony_ci        parse_suite_dependencies_mock.assert_called_with(stream)
1009a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 1)
1010a8e1175bSopenharmony_ci
1011a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_dependencies")
1012a8e1175bSopenharmony_ci    def test_begin_function_dep(self, func_mock):
1013a8e1175bSopenharmony_ci        """
1014a8e1175bSopenharmony_ci        Test that begin dep is checked and parse_function_dependencies() is
1015a8e1175bSopenharmony_ci        called.
1016a8e1175bSopenharmony_ci        :return:
1017a8e1175bSopenharmony_ci        """
1018a8e1175bSopenharmony_ci        def stop(*_unused):
1019a8e1175bSopenharmony_ci            """Stop when parse_until_pattern is called."""
1020a8e1175bSopenharmony_ci            raise Exception
1021a8e1175bSopenharmony_ci        func_mock.side_effect = stop
1022a8e1175bSopenharmony_ci
1023a8e1175bSopenharmony_ci        dependencies_str = '/* BEGIN_CASE ' \
1024a8e1175bSopenharmony_ci            'depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */\n'
1025a8e1175bSopenharmony_ci        data = '''%svoid test_func()
1026a8e1175bSopenharmony_ci{
1027a8e1175bSopenharmony_ci}
1028a8e1175bSopenharmony_ci''' % dependencies_str
1029a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1030a8e1175bSopenharmony_ci        self.assertRaises(Exception, parse_functions, stream)
1031a8e1175bSopenharmony_ci        func_mock.assert_called_with(dependencies_str)
1032a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 1)
1033a8e1175bSopenharmony_ci
1034a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_code")
1035a8e1175bSopenharmony_ci    @patch("generate_test_code.parse_function_dependencies")
1036a8e1175bSopenharmony_ci    def test_return(self, func_mock1, func_mock2):
1037a8e1175bSopenharmony_ci        """
1038a8e1175bSopenharmony_ci        Test that begin case is checked and parse_function_code() is called.
1039a8e1175bSopenharmony_ci        :return:
1040a8e1175bSopenharmony_ci        """
1041a8e1175bSopenharmony_ci        func_mock1.return_value = []
1042a8e1175bSopenharmony_ci        in_func_code = '''void test_func()
1043a8e1175bSopenharmony_ci{
1044a8e1175bSopenharmony_ci}
1045a8e1175bSopenharmony_ci'''
1046a8e1175bSopenharmony_ci        func_dispatch = '''
1047a8e1175bSopenharmony_ci    test_func_wrapper,
1048a8e1175bSopenharmony_ci'''
1049a8e1175bSopenharmony_ci        func_mock2.return_value = 'test_func', [],\
1050a8e1175bSopenharmony_ci            in_func_code, func_dispatch
1051a8e1175bSopenharmony_ci        dependencies_str = '/* BEGIN_CASE ' \
1052a8e1175bSopenharmony_ci            'depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */\n'
1053a8e1175bSopenharmony_ci        data = '''%svoid test_func()
1054a8e1175bSopenharmony_ci{
1055a8e1175bSopenharmony_ci}
1056a8e1175bSopenharmony_ci''' % dependencies_str
1057a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1058a8e1175bSopenharmony_ci        suite_dependencies, dispatch_code, func_code, func_info = \
1059a8e1175bSopenharmony_ci            parse_functions(stream)
1060a8e1175bSopenharmony_ci        func_mock1.assert_called_with(dependencies_str)
1061a8e1175bSopenharmony_ci        func_mock2.assert_called_with(stream, [], [])
1062a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 5)
1063a8e1175bSopenharmony_ci        self.assertEqual(suite_dependencies, [])
1064a8e1175bSopenharmony_ci        expected_dispatch_code = '''/* Function Id: 0 */
1065a8e1175bSopenharmony_ci
1066a8e1175bSopenharmony_ci    test_func_wrapper,
1067a8e1175bSopenharmony_ci'''
1068a8e1175bSopenharmony_ci        self.assertEqual(dispatch_code, expected_dispatch_code)
1069a8e1175bSopenharmony_ci        self.assertEqual(func_code, in_func_code)
1070a8e1175bSopenharmony_ci        self.assertEqual(func_info, {'test_func': (0, [])})
1071a8e1175bSopenharmony_ci
1072a8e1175bSopenharmony_ci    def test_parsing(self):
1073a8e1175bSopenharmony_ci        """
1074a8e1175bSopenharmony_ci        Test case parsing.
1075a8e1175bSopenharmony_ci        :return:
1076a8e1175bSopenharmony_ci        """
1077a8e1175bSopenharmony_ci        data = '''/* BEGIN_HEADER */
1078a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
1079a8e1175bSopenharmony_ci
1080a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
1081a8e1175bSopenharmony_ci/* END_HEADER */
1082a8e1175bSopenharmony_ci
1083a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
1084a8e1175bSopenharmony_ci * depends_on:MBEDTLS_ECP_C
1085a8e1175bSopenharmony_ci * END_DEPENDENCIES
1086a8e1175bSopenharmony_ci */
1087a8e1175bSopenharmony_ci
1088a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
1089a8e1175bSopenharmony_civoid func1()
1090a8e1175bSopenharmony_ci{
1091a8e1175bSopenharmony_ci}
1092a8e1175bSopenharmony_ci/* END_CASE */
1093a8e1175bSopenharmony_ci
1094a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
1095a8e1175bSopenharmony_civoid func2()
1096a8e1175bSopenharmony_ci{
1097a8e1175bSopenharmony_ci}
1098a8e1175bSopenharmony_ci/* END_CASE */
1099a8e1175bSopenharmony_ci'''
1100a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1101a8e1175bSopenharmony_ci        suite_dependencies, dispatch_code, func_code, func_info = \
1102a8e1175bSopenharmony_ci            parse_functions(stream)
1103a8e1175bSopenharmony_ci        self.assertEqual(stream.line_no, 23)
1104a8e1175bSopenharmony_ci        self.assertEqual(suite_dependencies, ['MBEDTLS_ECP_C'])
1105a8e1175bSopenharmony_ci
1106a8e1175bSopenharmony_ci        expected_dispatch_code = '''/* Function Id: 0 */
1107a8e1175bSopenharmony_ci
1108a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_C) && defined(MBEDTLS_ENTROPY_NV_SEED) && defined(MBEDTLS_FS_IO)
1109a8e1175bSopenharmony_ci    test_func1_wrapper,
1110a8e1175bSopenharmony_ci#else
1111a8e1175bSopenharmony_ci    NULL,
1112a8e1175bSopenharmony_ci#endif
1113a8e1175bSopenharmony_ci/* Function Id: 1 */
1114a8e1175bSopenharmony_ci
1115a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_C) && defined(MBEDTLS_ENTROPY_NV_SEED) && defined(MBEDTLS_FS_IO)
1116a8e1175bSopenharmony_ci    test_func2_wrapper,
1117a8e1175bSopenharmony_ci#else
1118a8e1175bSopenharmony_ci    NULL,
1119a8e1175bSopenharmony_ci#endif
1120a8e1175bSopenharmony_ci'''
1121a8e1175bSopenharmony_ci        self.assertEqual(dispatch_code, expected_dispatch_code)
1122a8e1175bSopenharmony_ci        expected_func_code = '''#if defined(MBEDTLS_ECP_C)
1123a8e1175bSopenharmony_ci#line 2 "test_suite_ut.function"
1124a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
1125a8e1175bSopenharmony_ci
1126a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
1127a8e1175bSopenharmony_ci#if defined(MBEDTLS_ENTROPY_NV_SEED)
1128a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO)
1129a8e1175bSopenharmony_ci#line 13 "test_suite_ut.function"
1130a8e1175bSopenharmony_civoid test_func1(void)
1131a8e1175bSopenharmony_ci{
1132a8e1175bSopenharmony_ciexit:
1133a8e1175bSopenharmony_ci    ;
1134a8e1175bSopenharmony_ci}
1135a8e1175bSopenharmony_ci
1136a8e1175bSopenharmony_civoid test_func1_wrapper( void ** params )
1137a8e1175bSopenharmony_ci{
1138a8e1175bSopenharmony_ci    (void)params;
1139a8e1175bSopenharmony_ci
1140a8e1175bSopenharmony_ci    test_func1(  );
1141a8e1175bSopenharmony_ci}
1142a8e1175bSopenharmony_ci#endif /* MBEDTLS_FS_IO */
1143a8e1175bSopenharmony_ci#endif /* MBEDTLS_ENTROPY_NV_SEED */
1144a8e1175bSopenharmony_ci#if defined(MBEDTLS_ENTROPY_NV_SEED)
1145a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO)
1146a8e1175bSopenharmony_ci#line 19 "test_suite_ut.function"
1147a8e1175bSopenharmony_civoid test_func2(void)
1148a8e1175bSopenharmony_ci{
1149a8e1175bSopenharmony_ciexit:
1150a8e1175bSopenharmony_ci    ;
1151a8e1175bSopenharmony_ci}
1152a8e1175bSopenharmony_ci
1153a8e1175bSopenharmony_civoid test_func2_wrapper( void ** params )
1154a8e1175bSopenharmony_ci{
1155a8e1175bSopenharmony_ci    (void)params;
1156a8e1175bSopenharmony_ci
1157a8e1175bSopenharmony_ci    test_func2(  );
1158a8e1175bSopenharmony_ci}
1159a8e1175bSopenharmony_ci#endif /* MBEDTLS_FS_IO */
1160a8e1175bSopenharmony_ci#endif /* MBEDTLS_ENTROPY_NV_SEED */
1161a8e1175bSopenharmony_ci#endif /* MBEDTLS_ECP_C */
1162a8e1175bSopenharmony_ci'''
1163a8e1175bSopenharmony_ci        self.assertEqual(func_code, expected_func_code)
1164a8e1175bSopenharmony_ci        self.assertEqual(func_info, {'test_func1': (0, []),
1165a8e1175bSopenharmony_ci                                     'test_func2': (1, [])})
1166a8e1175bSopenharmony_ci
1167a8e1175bSopenharmony_ci    def test_same_function_name(self):
1168a8e1175bSopenharmony_ci        """
1169a8e1175bSopenharmony_ci        Test name conflict.
1170a8e1175bSopenharmony_ci        :return:
1171a8e1175bSopenharmony_ci        """
1172a8e1175bSopenharmony_ci        data = '''/* BEGIN_HEADER */
1173a8e1175bSopenharmony_ci#include "mbedtls/ecp.h"
1174a8e1175bSopenharmony_ci
1175a8e1175bSopenharmony_ci#define ECP_PF_UNKNOWN     -1
1176a8e1175bSopenharmony_ci/* END_HEADER */
1177a8e1175bSopenharmony_ci
1178a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
1179a8e1175bSopenharmony_ci * depends_on:MBEDTLS_ECP_C
1180a8e1175bSopenharmony_ci * END_DEPENDENCIES
1181a8e1175bSopenharmony_ci */
1182a8e1175bSopenharmony_ci
1183a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
1184a8e1175bSopenharmony_civoid func()
1185a8e1175bSopenharmony_ci{
1186a8e1175bSopenharmony_ci}
1187a8e1175bSopenharmony_ci/* END_CASE */
1188a8e1175bSopenharmony_ci
1189a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
1190a8e1175bSopenharmony_civoid func()
1191a8e1175bSopenharmony_ci{
1192a8e1175bSopenharmony_ci}
1193a8e1175bSopenharmony_ci/* END_CASE */
1194a8e1175bSopenharmony_ci'''
1195a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1196a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, parse_functions, stream)
1197a8e1175bSopenharmony_ci
1198a8e1175bSopenharmony_ci
1199a8e1175bSopenharmony_ciclass EscapedSplit(TestCase):
1200a8e1175bSopenharmony_ci    """
1201a8e1175bSopenharmony_ci    Test suite for testing escaped_split().
1202a8e1175bSopenharmony_ci    Note: Since escaped_split() output is used to write back to the
1203a8e1175bSopenharmony_ci    intermediate data file. Any escape characters in the input are
1204a8e1175bSopenharmony_ci    retained in the output.
1205a8e1175bSopenharmony_ci    """
1206a8e1175bSopenharmony_ci
1207a8e1175bSopenharmony_ci    def test_invalid_input(self):
1208a8e1175bSopenharmony_ci        """
1209a8e1175bSopenharmony_ci        Test when input split character is not a character.
1210a8e1175bSopenharmony_ci        :return:
1211a8e1175bSopenharmony_ci        """
1212a8e1175bSopenharmony_ci        self.assertRaises(ValueError, escaped_split, '', 'string')
1213a8e1175bSopenharmony_ci
1214a8e1175bSopenharmony_ci    def test_empty_string(self):
1215a8e1175bSopenharmony_ci        """
1216a8e1175bSopenharmony_ci        Test empty string input.
1217a8e1175bSopenharmony_ci        :return:
1218a8e1175bSopenharmony_ci        """
1219a8e1175bSopenharmony_ci        splits = escaped_split('', ':')
1220a8e1175bSopenharmony_ci        self.assertEqual(splits, [])
1221a8e1175bSopenharmony_ci
1222a8e1175bSopenharmony_ci    def test_no_escape(self):
1223a8e1175bSopenharmony_ci        """
1224a8e1175bSopenharmony_ci        Test with no escape character. The behaviour should be same as
1225a8e1175bSopenharmony_ci        str.split()
1226a8e1175bSopenharmony_ci        :return:
1227a8e1175bSopenharmony_ci        """
1228a8e1175bSopenharmony_ci        test_str = 'yahoo:google'
1229a8e1175bSopenharmony_ci        splits = escaped_split(test_str, ':')
1230a8e1175bSopenharmony_ci        self.assertEqual(splits, test_str.split(':'))
1231a8e1175bSopenharmony_ci
1232a8e1175bSopenharmony_ci    def test_escaped_input(self):
1233a8e1175bSopenharmony_ci        """
1234a8e1175bSopenharmony_ci        Test input that has escaped delimiter.
1235a8e1175bSopenharmony_ci        :return:
1236a8e1175bSopenharmony_ci        """
1237a8e1175bSopenharmony_ci        test_str = r'yahoo\:google:facebook'
1238a8e1175bSopenharmony_ci        splits = escaped_split(test_str, ':')
1239a8e1175bSopenharmony_ci        self.assertEqual(splits, [r'yahoo\:google', 'facebook'])
1240a8e1175bSopenharmony_ci
1241a8e1175bSopenharmony_ci    def test_escaped_escape(self):
1242a8e1175bSopenharmony_ci        """
1243a8e1175bSopenharmony_ci        Test input that has escaped delimiter.
1244a8e1175bSopenharmony_ci        :return:
1245a8e1175bSopenharmony_ci        """
1246a8e1175bSopenharmony_ci        test_str = r'yahoo\\:google:facebook'
1247a8e1175bSopenharmony_ci        splits = escaped_split(test_str, ':')
1248a8e1175bSopenharmony_ci        self.assertEqual(splits, [r'yahoo\\', 'google', 'facebook'])
1249a8e1175bSopenharmony_ci
1250a8e1175bSopenharmony_ci    def test_all_at_once(self):
1251a8e1175bSopenharmony_ci        """
1252a8e1175bSopenharmony_ci        Test input that has escaped delimiter.
1253a8e1175bSopenharmony_ci        :return:
1254a8e1175bSopenharmony_ci        """
1255a8e1175bSopenharmony_ci        test_str = r'yahoo\\:google:facebook\:instagram\\:bbc\\:wikipedia'
1256a8e1175bSopenharmony_ci        splits = escaped_split(test_str, ':')
1257a8e1175bSopenharmony_ci        self.assertEqual(splits, [r'yahoo\\', r'google',
1258a8e1175bSopenharmony_ci                                  r'facebook\:instagram\\',
1259a8e1175bSopenharmony_ci                                  r'bbc\\', r'wikipedia'])
1260a8e1175bSopenharmony_ci
1261a8e1175bSopenharmony_ci
1262a8e1175bSopenharmony_ciclass ParseTestData(TestCase):
1263a8e1175bSopenharmony_ci    """
1264a8e1175bSopenharmony_ci    Test suite for parse test data.
1265a8e1175bSopenharmony_ci    """
1266a8e1175bSopenharmony_ci
1267a8e1175bSopenharmony_ci    def test_parser(self):
1268a8e1175bSopenharmony_ci        """
1269a8e1175bSopenharmony_ci        Test that tests are parsed correctly from data file.
1270a8e1175bSopenharmony_ci        :return:
1271a8e1175bSopenharmony_ci        """
1272a8e1175bSopenharmony_ci        data = """
1273a8e1175bSopenharmony_ciDiffie-Hellman full exchange #1
1274a8e1175bSopenharmony_cidhm_do_dhm:10:"23":10:"5"
1275a8e1175bSopenharmony_ci
1276a8e1175bSopenharmony_ciDiffie-Hellman full exchange #2
1277a8e1175bSopenharmony_cidhm_do_dhm:10:"93450983094850938450983409623":10:"9345098304850938450983409622"
1278a8e1175bSopenharmony_ci
1279a8e1175bSopenharmony_ciDiffie-Hellman full exchange #3
1280a8e1175bSopenharmony_cidhm_do_dhm:10:"9345098382739712938719287391879381271":10:"9345098792137312973297123912791271"
1281a8e1175bSopenharmony_ci
1282a8e1175bSopenharmony_ciDiffie-Hellman selftest
1283a8e1175bSopenharmony_cidhm_selftest:
1284a8e1175bSopenharmony_ci"""
1285a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1286a8e1175bSopenharmony_ci        # List of (name, function_name, dependencies, args)
1287a8e1175bSopenharmony_ci        tests = list(parse_test_data(stream))
1288a8e1175bSopenharmony_ci        test1, test2, test3, test4 = tests
1289a8e1175bSopenharmony_ci        self.assertEqual(test1[0], 3)
1290a8e1175bSopenharmony_ci        self.assertEqual(test1[1], 'Diffie-Hellman full exchange #1')
1291a8e1175bSopenharmony_ci        self.assertEqual(test1[2], 'dhm_do_dhm')
1292a8e1175bSopenharmony_ci        self.assertEqual(test1[3], [])
1293a8e1175bSopenharmony_ci        self.assertEqual(test1[4], ['10', '"23"', '10', '"5"'])
1294a8e1175bSopenharmony_ci
1295a8e1175bSopenharmony_ci        self.assertEqual(test2[0], 6)
1296a8e1175bSopenharmony_ci        self.assertEqual(test2[1], 'Diffie-Hellman full exchange #2')
1297a8e1175bSopenharmony_ci        self.assertEqual(test2[2], 'dhm_do_dhm')
1298a8e1175bSopenharmony_ci        self.assertEqual(test2[3], [])
1299a8e1175bSopenharmony_ci        self.assertEqual(test2[4], ['10', '"93450983094850938450983409623"',
1300a8e1175bSopenharmony_ci                                    '10', '"9345098304850938450983409622"'])
1301a8e1175bSopenharmony_ci
1302a8e1175bSopenharmony_ci        self.assertEqual(test3[0], 9)
1303a8e1175bSopenharmony_ci        self.assertEqual(test3[1], 'Diffie-Hellman full exchange #3')
1304a8e1175bSopenharmony_ci        self.assertEqual(test3[2], 'dhm_do_dhm')
1305a8e1175bSopenharmony_ci        self.assertEqual(test3[3], [])
1306a8e1175bSopenharmony_ci        self.assertEqual(test3[4], ['10',
1307a8e1175bSopenharmony_ci                                    '"9345098382739712938719287391879381271"',
1308a8e1175bSopenharmony_ci                                    '10',
1309a8e1175bSopenharmony_ci                                    '"9345098792137312973297123912791271"'])
1310a8e1175bSopenharmony_ci
1311a8e1175bSopenharmony_ci        self.assertEqual(test4[0], 12)
1312a8e1175bSopenharmony_ci        self.assertEqual(test4[1], 'Diffie-Hellman selftest')
1313a8e1175bSopenharmony_ci        self.assertEqual(test4[2], 'dhm_selftest')
1314a8e1175bSopenharmony_ci        self.assertEqual(test4[3], [])
1315a8e1175bSopenharmony_ci        self.assertEqual(test4[4], [])
1316a8e1175bSopenharmony_ci
1317a8e1175bSopenharmony_ci    def test_with_dependencies(self):
1318a8e1175bSopenharmony_ci        """
1319a8e1175bSopenharmony_ci        Test that tests with dependencies are parsed.
1320a8e1175bSopenharmony_ci        :return:
1321a8e1175bSopenharmony_ci        """
1322a8e1175bSopenharmony_ci        data = """
1323a8e1175bSopenharmony_ciDiffie-Hellman full exchange #1
1324a8e1175bSopenharmony_cidepends_on:YAHOO
1325a8e1175bSopenharmony_cidhm_do_dhm:10:"23":10:"5"
1326a8e1175bSopenharmony_ci
1327a8e1175bSopenharmony_ciDiffie-Hellman full exchange #2
1328a8e1175bSopenharmony_cidhm_do_dhm:10:"93450983094850938450983409623":10:"9345098304850938450983409622"
1329a8e1175bSopenharmony_ci
1330a8e1175bSopenharmony_ci"""
1331a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1332a8e1175bSopenharmony_ci        # List of (name, function_name, dependencies, args)
1333a8e1175bSopenharmony_ci        tests = list(parse_test_data(stream))
1334a8e1175bSopenharmony_ci        test1, test2 = tests
1335a8e1175bSopenharmony_ci        self.assertEqual(test1[0], 4)
1336a8e1175bSopenharmony_ci        self.assertEqual(test1[1], 'Diffie-Hellman full exchange #1')
1337a8e1175bSopenharmony_ci        self.assertEqual(test1[2], 'dhm_do_dhm')
1338a8e1175bSopenharmony_ci        self.assertEqual(test1[3], ['YAHOO'])
1339a8e1175bSopenharmony_ci        self.assertEqual(test1[4], ['10', '"23"', '10', '"5"'])
1340a8e1175bSopenharmony_ci
1341a8e1175bSopenharmony_ci        self.assertEqual(test2[0], 7)
1342a8e1175bSopenharmony_ci        self.assertEqual(test2[1], 'Diffie-Hellman full exchange #2')
1343a8e1175bSopenharmony_ci        self.assertEqual(test2[2], 'dhm_do_dhm')
1344a8e1175bSopenharmony_ci        self.assertEqual(test2[3], [])
1345a8e1175bSopenharmony_ci        self.assertEqual(test2[4], ['10', '"93450983094850938450983409623"',
1346a8e1175bSopenharmony_ci                                    '10', '"9345098304850938450983409622"'])
1347a8e1175bSopenharmony_ci
1348a8e1175bSopenharmony_ci    def test_no_args(self):
1349a8e1175bSopenharmony_ci        """
1350a8e1175bSopenharmony_ci        Test GeneratorInputError is raised when test function name and
1351a8e1175bSopenharmony_ci        args line is missing.
1352a8e1175bSopenharmony_ci        :return:
1353a8e1175bSopenharmony_ci        """
1354a8e1175bSopenharmony_ci        data = """
1355a8e1175bSopenharmony_ciDiffie-Hellman full exchange #1
1356a8e1175bSopenharmony_cidepends_on:YAHOO
1357a8e1175bSopenharmony_ci
1358a8e1175bSopenharmony_ci
1359a8e1175bSopenharmony_ciDiffie-Hellman full exchange #2
1360a8e1175bSopenharmony_cidhm_do_dhm:10:"93450983094850938450983409623":10:"9345098304850938450983409622"
1361a8e1175bSopenharmony_ci
1362a8e1175bSopenharmony_ci"""
1363a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1364a8e1175bSopenharmony_ci        err = None
1365a8e1175bSopenharmony_ci        try:
1366a8e1175bSopenharmony_ci            for _, _, _, _, _ in parse_test_data(stream):
1367a8e1175bSopenharmony_ci                pass
1368a8e1175bSopenharmony_ci        except GeneratorInputError as err:
1369a8e1175bSopenharmony_ci            self.assertEqual(type(err), GeneratorInputError)
1370a8e1175bSopenharmony_ci
1371a8e1175bSopenharmony_ci    def test_incomplete_data(self):
1372a8e1175bSopenharmony_ci        """
1373a8e1175bSopenharmony_ci        Test GeneratorInputError is raised when test function name
1374a8e1175bSopenharmony_ci        and args line is missing.
1375a8e1175bSopenharmony_ci        :return:
1376a8e1175bSopenharmony_ci        """
1377a8e1175bSopenharmony_ci        data = """
1378a8e1175bSopenharmony_ciDiffie-Hellman full exchange #1
1379a8e1175bSopenharmony_cidepends_on:YAHOO
1380a8e1175bSopenharmony_ci"""
1381a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.function', data)
1382a8e1175bSopenharmony_ci        err = None
1383a8e1175bSopenharmony_ci        try:
1384a8e1175bSopenharmony_ci            for _, _, _, _, _ in parse_test_data(stream):
1385a8e1175bSopenharmony_ci                pass
1386a8e1175bSopenharmony_ci        except GeneratorInputError as err:
1387a8e1175bSopenharmony_ci            self.assertEqual(type(err), GeneratorInputError)
1388a8e1175bSopenharmony_ci
1389a8e1175bSopenharmony_ci
1390a8e1175bSopenharmony_ciclass GenDepCheck(TestCase):
1391a8e1175bSopenharmony_ci    """
1392a8e1175bSopenharmony_ci    Test suite for gen_dep_check(). It is assumed this function is
1393a8e1175bSopenharmony_ci    called with valid inputs.
1394a8e1175bSopenharmony_ci    """
1395a8e1175bSopenharmony_ci
1396a8e1175bSopenharmony_ci    def test_gen_dep_check(self):
1397a8e1175bSopenharmony_ci        """
1398a8e1175bSopenharmony_ci        Test that dependency check code generated correctly.
1399a8e1175bSopenharmony_ci        :return:
1400a8e1175bSopenharmony_ci        """
1401a8e1175bSopenharmony_ci        expected = """
1402a8e1175bSopenharmony_ci        case 5:
1403a8e1175bSopenharmony_ci            {
1404a8e1175bSopenharmony_ci#if defined(YAHOO)
1405a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1406a8e1175bSopenharmony_ci#else
1407a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1408a8e1175bSopenharmony_ci#endif
1409a8e1175bSopenharmony_ci            }
1410a8e1175bSopenharmony_ci            break;"""
1411a8e1175bSopenharmony_ci        out = gen_dep_check(5, 'YAHOO')
1412a8e1175bSopenharmony_ci        self.assertEqual(out, expected)
1413a8e1175bSopenharmony_ci
1414a8e1175bSopenharmony_ci    def test_not_defined_dependency(self):
1415a8e1175bSopenharmony_ci        """
1416a8e1175bSopenharmony_ci        Test dependency with !.
1417a8e1175bSopenharmony_ci        :return:
1418a8e1175bSopenharmony_ci        """
1419a8e1175bSopenharmony_ci        expected = """
1420a8e1175bSopenharmony_ci        case 5:
1421a8e1175bSopenharmony_ci            {
1422a8e1175bSopenharmony_ci#if !defined(YAHOO)
1423a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1424a8e1175bSopenharmony_ci#else
1425a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1426a8e1175bSopenharmony_ci#endif
1427a8e1175bSopenharmony_ci            }
1428a8e1175bSopenharmony_ci            break;"""
1429a8e1175bSopenharmony_ci        out = gen_dep_check(5, '!YAHOO')
1430a8e1175bSopenharmony_ci        self.assertEqual(out, expected)
1431a8e1175bSopenharmony_ci
1432a8e1175bSopenharmony_ci    def test_empty_dependency(self):
1433a8e1175bSopenharmony_ci        """
1434a8e1175bSopenharmony_ci        Test invalid dependency input.
1435a8e1175bSopenharmony_ci        :return:
1436a8e1175bSopenharmony_ci        """
1437a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_dep_check, 5, '!')
1438a8e1175bSopenharmony_ci
1439a8e1175bSopenharmony_ci    def test_negative_dep_id(self):
1440a8e1175bSopenharmony_ci        """
1441a8e1175bSopenharmony_ci        Test invalid dependency input.
1442a8e1175bSopenharmony_ci        :return:
1443a8e1175bSopenharmony_ci        """
1444a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_dep_check, -1, 'YAHOO')
1445a8e1175bSopenharmony_ci
1446a8e1175bSopenharmony_ci
1447a8e1175bSopenharmony_ciclass GenExpCheck(TestCase):
1448a8e1175bSopenharmony_ci    """
1449a8e1175bSopenharmony_ci    Test suite for gen_expression_check(). It is assumed this function
1450a8e1175bSopenharmony_ci    is called with valid inputs.
1451a8e1175bSopenharmony_ci    """
1452a8e1175bSopenharmony_ci
1453a8e1175bSopenharmony_ci    def test_gen_exp_check(self):
1454a8e1175bSopenharmony_ci        """
1455a8e1175bSopenharmony_ci        Test that expression check code generated correctly.
1456a8e1175bSopenharmony_ci        :return:
1457a8e1175bSopenharmony_ci        """
1458a8e1175bSopenharmony_ci        expected = """
1459a8e1175bSopenharmony_ci        case 5:
1460a8e1175bSopenharmony_ci            {
1461a8e1175bSopenharmony_ci                *out_value = YAHOO;
1462a8e1175bSopenharmony_ci            }
1463a8e1175bSopenharmony_ci            break;"""
1464a8e1175bSopenharmony_ci        out = gen_expression_check(5, 'YAHOO')
1465a8e1175bSopenharmony_ci        self.assertEqual(out, expected)
1466a8e1175bSopenharmony_ci
1467a8e1175bSopenharmony_ci    def test_invalid_expression(self):
1468a8e1175bSopenharmony_ci        """
1469a8e1175bSopenharmony_ci        Test invalid expression input.
1470a8e1175bSopenharmony_ci        :return:
1471a8e1175bSopenharmony_ci        """
1472a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_expression_check, 5, '')
1473a8e1175bSopenharmony_ci
1474a8e1175bSopenharmony_ci    def test_negative_exp_id(self):
1475a8e1175bSopenharmony_ci        """
1476a8e1175bSopenharmony_ci        Test invalid expression id.
1477a8e1175bSopenharmony_ci        :return:
1478a8e1175bSopenharmony_ci        """
1479a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_expression_check,
1480a8e1175bSopenharmony_ci                          -1, 'YAHOO')
1481a8e1175bSopenharmony_ci
1482a8e1175bSopenharmony_ci
1483a8e1175bSopenharmony_ciclass WriteDependencies(TestCase):
1484a8e1175bSopenharmony_ci    """
1485a8e1175bSopenharmony_ci    Test suite for testing write_dependencies.
1486a8e1175bSopenharmony_ci    """
1487a8e1175bSopenharmony_ci
1488a8e1175bSopenharmony_ci    def test_no_test_dependencies(self):
1489a8e1175bSopenharmony_ci        """
1490a8e1175bSopenharmony_ci        Test when test dependencies input is empty.
1491a8e1175bSopenharmony_ci        :return:
1492a8e1175bSopenharmony_ci        """
1493a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1494a8e1175bSopenharmony_ci        unique_dependencies = []
1495a8e1175bSopenharmony_ci        dep_check_code = write_dependencies(stream, [], unique_dependencies)
1496a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, '')
1497a8e1175bSopenharmony_ci        self.assertEqual(len(unique_dependencies), 0)
1498a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(), '')
1499a8e1175bSopenharmony_ci
1500a8e1175bSopenharmony_ci    def test_unique_dep_ids(self):
1501a8e1175bSopenharmony_ci        """
1502a8e1175bSopenharmony_ci
1503a8e1175bSopenharmony_ci        :return:
1504a8e1175bSopenharmony_ci        """
1505a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1506a8e1175bSopenharmony_ci        unique_dependencies = []
1507a8e1175bSopenharmony_ci        dep_check_code = write_dependencies(stream, ['DEP3', 'DEP2', 'DEP1'],
1508a8e1175bSopenharmony_ci                                            unique_dependencies)
1509a8e1175bSopenharmony_ci        expect_dep_check_code = '''
1510a8e1175bSopenharmony_ci        case 0:
1511a8e1175bSopenharmony_ci            {
1512a8e1175bSopenharmony_ci#if defined(DEP3)
1513a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1514a8e1175bSopenharmony_ci#else
1515a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1516a8e1175bSopenharmony_ci#endif
1517a8e1175bSopenharmony_ci            }
1518a8e1175bSopenharmony_ci            break;
1519a8e1175bSopenharmony_ci        case 1:
1520a8e1175bSopenharmony_ci            {
1521a8e1175bSopenharmony_ci#if defined(DEP2)
1522a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1523a8e1175bSopenharmony_ci#else
1524a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1525a8e1175bSopenharmony_ci#endif
1526a8e1175bSopenharmony_ci            }
1527a8e1175bSopenharmony_ci            break;
1528a8e1175bSopenharmony_ci        case 2:
1529a8e1175bSopenharmony_ci            {
1530a8e1175bSopenharmony_ci#if defined(DEP1)
1531a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1532a8e1175bSopenharmony_ci#else
1533a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1534a8e1175bSopenharmony_ci#endif
1535a8e1175bSopenharmony_ci            }
1536a8e1175bSopenharmony_ci            break;'''
1537a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, expect_dep_check_code)
1538a8e1175bSopenharmony_ci        self.assertEqual(len(unique_dependencies), 3)
1539a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(), 'depends_on:0:1:2\n')
1540a8e1175bSopenharmony_ci
1541a8e1175bSopenharmony_ci    def test_dep_id_repeat(self):
1542a8e1175bSopenharmony_ci        """
1543a8e1175bSopenharmony_ci
1544a8e1175bSopenharmony_ci        :return:
1545a8e1175bSopenharmony_ci        """
1546a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1547a8e1175bSopenharmony_ci        unique_dependencies = []
1548a8e1175bSopenharmony_ci        dep_check_code = ''
1549a8e1175bSopenharmony_ci        dep_check_code += write_dependencies(stream, ['DEP3', 'DEP2'],
1550a8e1175bSopenharmony_ci                                             unique_dependencies)
1551a8e1175bSopenharmony_ci        dep_check_code += write_dependencies(stream, ['DEP2', 'DEP1'],
1552a8e1175bSopenharmony_ci                                             unique_dependencies)
1553a8e1175bSopenharmony_ci        dep_check_code += write_dependencies(stream, ['DEP1', 'DEP3'],
1554a8e1175bSopenharmony_ci                                             unique_dependencies)
1555a8e1175bSopenharmony_ci        expect_dep_check_code = '''
1556a8e1175bSopenharmony_ci        case 0:
1557a8e1175bSopenharmony_ci            {
1558a8e1175bSopenharmony_ci#if defined(DEP3)
1559a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1560a8e1175bSopenharmony_ci#else
1561a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1562a8e1175bSopenharmony_ci#endif
1563a8e1175bSopenharmony_ci            }
1564a8e1175bSopenharmony_ci            break;
1565a8e1175bSopenharmony_ci        case 1:
1566a8e1175bSopenharmony_ci            {
1567a8e1175bSopenharmony_ci#if defined(DEP2)
1568a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1569a8e1175bSopenharmony_ci#else
1570a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1571a8e1175bSopenharmony_ci#endif
1572a8e1175bSopenharmony_ci            }
1573a8e1175bSopenharmony_ci            break;
1574a8e1175bSopenharmony_ci        case 2:
1575a8e1175bSopenharmony_ci            {
1576a8e1175bSopenharmony_ci#if defined(DEP1)
1577a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1578a8e1175bSopenharmony_ci#else
1579a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1580a8e1175bSopenharmony_ci#endif
1581a8e1175bSopenharmony_ci            }
1582a8e1175bSopenharmony_ci            break;'''
1583a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, expect_dep_check_code)
1584a8e1175bSopenharmony_ci        self.assertEqual(len(unique_dependencies), 3)
1585a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(),
1586a8e1175bSopenharmony_ci                         'depends_on:0:1\ndepends_on:1:2\ndepends_on:2:0\n')
1587a8e1175bSopenharmony_ci
1588a8e1175bSopenharmony_ci
1589a8e1175bSopenharmony_ciclass WriteParams(TestCase):
1590a8e1175bSopenharmony_ci    """
1591a8e1175bSopenharmony_ci    Test Suite for testing write_parameters().
1592a8e1175bSopenharmony_ci    """
1593a8e1175bSopenharmony_ci
1594a8e1175bSopenharmony_ci    def test_no_params(self):
1595a8e1175bSopenharmony_ci        """
1596a8e1175bSopenharmony_ci        Test with empty test_args
1597a8e1175bSopenharmony_ci        :return:
1598a8e1175bSopenharmony_ci        """
1599a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1600a8e1175bSopenharmony_ci        unique_expressions = []
1601a8e1175bSopenharmony_ci        expression_code = write_parameters(stream, [], [], unique_expressions)
1602a8e1175bSopenharmony_ci        self.assertEqual(len(unique_expressions), 0)
1603a8e1175bSopenharmony_ci        self.assertEqual(expression_code, '')
1604a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(), '\n')
1605a8e1175bSopenharmony_ci
1606a8e1175bSopenharmony_ci    def test_no_exp_param(self):
1607a8e1175bSopenharmony_ci        """
1608a8e1175bSopenharmony_ci        Test when there is no macro or expression in the params.
1609a8e1175bSopenharmony_ci        :return:
1610a8e1175bSopenharmony_ci        """
1611a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1612a8e1175bSopenharmony_ci        unique_expressions = []
1613a8e1175bSopenharmony_ci        expression_code = write_parameters(stream, ['"Yahoo"', '"abcdef00"',
1614a8e1175bSopenharmony_ci                                                    '0'],
1615a8e1175bSopenharmony_ci                                           ['char*', 'hex', 'int'],
1616a8e1175bSopenharmony_ci                                           unique_expressions)
1617a8e1175bSopenharmony_ci        self.assertEqual(len(unique_expressions), 0)
1618a8e1175bSopenharmony_ci        self.assertEqual(expression_code, '')
1619a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(),
1620a8e1175bSopenharmony_ci                         ':char*:"Yahoo":hex:"abcdef00":int:0\n')
1621a8e1175bSopenharmony_ci
1622a8e1175bSopenharmony_ci    def test_hex_format_int_param(self):
1623a8e1175bSopenharmony_ci        """
1624a8e1175bSopenharmony_ci        Test int parameter in hex format.
1625a8e1175bSopenharmony_ci        :return:
1626a8e1175bSopenharmony_ci        """
1627a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1628a8e1175bSopenharmony_ci        unique_expressions = []
1629a8e1175bSopenharmony_ci        expression_code = write_parameters(stream,
1630a8e1175bSopenharmony_ci                                           ['"Yahoo"', '"abcdef00"', '0xAA'],
1631a8e1175bSopenharmony_ci                                           ['char*', 'hex', 'int'],
1632a8e1175bSopenharmony_ci                                           unique_expressions)
1633a8e1175bSopenharmony_ci        self.assertEqual(len(unique_expressions), 0)
1634a8e1175bSopenharmony_ci        self.assertEqual(expression_code, '')
1635a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(),
1636a8e1175bSopenharmony_ci                         ':char*:"Yahoo":hex:"abcdef00":int:0xAA\n')
1637a8e1175bSopenharmony_ci
1638a8e1175bSopenharmony_ci    def test_with_exp_param(self):
1639a8e1175bSopenharmony_ci        """
1640a8e1175bSopenharmony_ci        Test when there is macro or expression in the params.
1641a8e1175bSopenharmony_ci        :return:
1642a8e1175bSopenharmony_ci        """
1643a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1644a8e1175bSopenharmony_ci        unique_expressions = []
1645a8e1175bSopenharmony_ci        expression_code = write_parameters(stream,
1646a8e1175bSopenharmony_ci                                           ['"Yahoo"', '"abcdef00"', '0',
1647a8e1175bSopenharmony_ci                                            'MACRO1', 'MACRO2', 'MACRO3'],
1648a8e1175bSopenharmony_ci                                           ['char*', 'hex', 'int',
1649a8e1175bSopenharmony_ci                                            'int', 'int', 'int'],
1650a8e1175bSopenharmony_ci                                           unique_expressions)
1651a8e1175bSopenharmony_ci        self.assertEqual(len(unique_expressions), 3)
1652a8e1175bSopenharmony_ci        self.assertEqual(unique_expressions, ['MACRO1', 'MACRO2', 'MACRO3'])
1653a8e1175bSopenharmony_ci        expected_expression_code = '''
1654a8e1175bSopenharmony_ci        case 0:
1655a8e1175bSopenharmony_ci            {
1656a8e1175bSopenharmony_ci                *out_value = MACRO1;
1657a8e1175bSopenharmony_ci            }
1658a8e1175bSopenharmony_ci            break;
1659a8e1175bSopenharmony_ci        case 1:
1660a8e1175bSopenharmony_ci            {
1661a8e1175bSopenharmony_ci                *out_value = MACRO2;
1662a8e1175bSopenharmony_ci            }
1663a8e1175bSopenharmony_ci            break;
1664a8e1175bSopenharmony_ci        case 2:
1665a8e1175bSopenharmony_ci            {
1666a8e1175bSopenharmony_ci                *out_value = MACRO3;
1667a8e1175bSopenharmony_ci            }
1668a8e1175bSopenharmony_ci            break;'''
1669a8e1175bSopenharmony_ci        self.assertEqual(expression_code, expected_expression_code)
1670a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(),
1671a8e1175bSopenharmony_ci                         ':char*:"Yahoo":hex:"abcdef00":int:0:exp:0:exp:1'
1672a8e1175bSopenharmony_ci                         ':exp:2\n')
1673a8e1175bSopenharmony_ci
1674a8e1175bSopenharmony_ci    def test_with_repeat_calls(self):
1675a8e1175bSopenharmony_ci        """
1676a8e1175bSopenharmony_ci        Test when write_parameter() is called with same macro or expression.
1677a8e1175bSopenharmony_ci        :return:
1678a8e1175bSopenharmony_ci        """
1679a8e1175bSopenharmony_ci        stream = StringIOWrapper('test_suite_ut.data', '')
1680a8e1175bSopenharmony_ci        unique_expressions = []
1681a8e1175bSopenharmony_ci        expression_code = ''
1682a8e1175bSopenharmony_ci        expression_code += write_parameters(stream,
1683a8e1175bSopenharmony_ci                                            ['"Yahoo"', 'MACRO1', 'MACRO2'],
1684a8e1175bSopenharmony_ci                                            ['char*', 'int', 'int'],
1685a8e1175bSopenharmony_ci                                            unique_expressions)
1686a8e1175bSopenharmony_ci        expression_code += write_parameters(stream,
1687a8e1175bSopenharmony_ci                                            ['"abcdef00"', 'MACRO2', 'MACRO3'],
1688a8e1175bSopenharmony_ci                                            ['hex', 'int', 'int'],
1689a8e1175bSopenharmony_ci                                            unique_expressions)
1690a8e1175bSopenharmony_ci        expression_code += write_parameters(stream,
1691a8e1175bSopenharmony_ci                                            ['0', 'MACRO3', 'MACRO1'],
1692a8e1175bSopenharmony_ci                                            ['int', 'int', 'int'],
1693a8e1175bSopenharmony_ci                                            unique_expressions)
1694a8e1175bSopenharmony_ci        self.assertEqual(len(unique_expressions), 3)
1695a8e1175bSopenharmony_ci        self.assertEqual(unique_expressions, ['MACRO1', 'MACRO2', 'MACRO3'])
1696a8e1175bSopenharmony_ci        expected_expression_code = '''
1697a8e1175bSopenharmony_ci        case 0:
1698a8e1175bSopenharmony_ci            {
1699a8e1175bSopenharmony_ci                *out_value = MACRO1;
1700a8e1175bSopenharmony_ci            }
1701a8e1175bSopenharmony_ci            break;
1702a8e1175bSopenharmony_ci        case 1:
1703a8e1175bSopenharmony_ci            {
1704a8e1175bSopenharmony_ci                *out_value = MACRO2;
1705a8e1175bSopenharmony_ci            }
1706a8e1175bSopenharmony_ci            break;
1707a8e1175bSopenharmony_ci        case 2:
1708a8e1175bSopenharmony_ci            {
1709a8e1175bSopenharmony_ci                *out_value = MACRO3;
1710a8e1175bSopenharmony_ci            }
1711a8e1175bSopenharmony_ci            break;'''
1712a8e1175bSopenharmony_ci        self.assertEqual(expression_code, expected_expression_code)
1713a8e1175bSopenharmony_ci        expected_data_file = ''':char*:"Yahoo":exp:0:exp:1
1714a8e1175bSopenharmony_ci:hex:"abcdef00":exp:1:exp:2
1715a8e1175bSopenharmony_ci:int:0:exp:2:exp:0
1716a8e1175bSopenharmony_ci'''
1717a8e1175bSopenharmony_ci        self.assertEqual(stream.getvalue(), expected_data_file)
1718a8e1175bSopenharmony_ci
1719a8e1175bSopenharmony_ci
1720a8e1175bSopenharmony_ciclass GenTestSuiteDependenciesChecks(TestCase):
1721a8e1175bSopenharmony_ci    """
1722a8e1175bSopenharmony_ci    Test suite for testing gen_suite_dep_checks()
1723a8e1175bSopenharmony_ci    """
1724a8e1175bSopenharmony_ci    def test_empty_suite_dependencies(self):
1725a8e1175bSopenharmony_ci        """
1726a8e1175bSopenharmony_ci        Test with empty suite_dependencies list.
1727a8e1175bSopenharmony_ci
1728a8e1175bSopenharmony_ci        :return:
1729a8e1175bSopenharmony_ci        """
1730a8e1175bSopenharmony_ci        dep_check_code, expression_code = \
1731a8e1175bSopenharmony_ci            gen_suite_dep_checks([], 'DEP_CHECK_CODE', 'EXPRESSION_CODE')
1732a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, 'DEP_CHECK_CODE')
1733a8e1175bSopenharmony_ci        self.assertEqual(expression_code, 'EXPRESSION_CODE')
1734a8e1175bSopenharmony_ci
1735a8e1175bSopenharmony_ci    def test_suite_dependencies(self):
1736a8e1175bSopenharmony_ci        """
1737a8e1175bSopenharmony_ci        Test with suite_dependencies list.
1738a8e1175bSopenharmony_ci
1739a8e1175bSopenharmony_ci        :return:
1740a8e1175bSopenharmony_ci        """
1741a8e1175bSopenharmony_ci        dep_check_code, expression_code = \
1742a8e1175bSopenharmony_ci            gen_suite_dep_checks(['SUITE_DEP'], 'DEP_CHECK_CODE',
1743a8e1175bSopenharmony_ci                                 'EXPRESSION_CODE')
1744a8e1175bSopenharmony_ci        expected_dep_check_code = '''
1745a8e1175bSopenharmony_ci#if defined(SUITE_DEP)
1746a8e1175bSopenharmony_ciDEP_CHECK_CODE
1747a8e1175bSopenharmony_ci#endif
1748a8e1175bSopenharmony_ci'''
1749a8e1175bSopenharmony_ci        expected_expression_code = '''
1750a8e1175bSopenharmony_ci#if defined(SUITE_DEP)
1751a8e1175bSopenharmony_ciEXPRESSION_CODE
1752a8e1175bSopenharmony_ci#endif
1753a8e1175bSopenharmony_ci'''
1754a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, expected_dep_check_code)
1755a8e1175bSopenharmony_ci        self.assertEqual(expression_code, expected_expression_code)
1756a8e1175bSopenharmony_ci
1757a8e1175bSopenharmony_ci    def test_no_dep_no_exp(self):
1758a8e1175bSopenharmony_ci        """
1759a8e1175bSopenharmony_ci        Test when there are no dependency and expression code.
1760a8e1175bSopenharmony_ci        :return:
1761a8e1175bSopenharmony_ci        """
1762a8e1175bSopenharmony_ci        dep_check_code, expression_code = gen_suite_dep_checks([], '', '')
1763a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, '')
1764a8e1175bSopenharmony_ci        self.assertEqual(expression_code, '')
1765a8e1175bSopenharmony_ci
1766a8e1175bSopenharmony_ci
1767a8e1175bSopenharmony_ciclass GenFromTestData(TestCase):
1768a8e1175bSopenharmony_ci    """
1769a8e1175bSopenharmony_ci    Test suite for gen_from_test_data()
1770a8e1175bSopenharmony_ci    """
1771a8e1175bSopenharmony_ci
1772a8e1175bSopenharmony_ci    @staticmethod
1773a8e1175bSopenharmony_ci    @patch("generate_test_code.write_dependencies")
1774a8e1175bSopenharmony_ci    @patch("generate_test_code.write_parameters")
1775a8e1175bSopenharmony_ci    @patch("generate_test_code.gen_suite_dep_checks")
1776a8e1175bSopenharmony_ci    def test_intermediate_data_file(func_mock1,
1777a8e1175bSopenharmony_ci                                    write_parameters_mock,
1778a8e1175bSopenharmony_ci                                    write_dependencies_mock):
1779a8e1175bSopenharmony_ci        """
1780a8e1175bSopenharmony_ci        Test that intermediate data file is written with expected data.
1781a8e1175bSopenharmony_ci        :return:
1782a8e1175bSopenharmony_ci        """
1783a8e1175bSopenharmony_ci        data = '''
1784a8e1175bSopenharmony_ciMy test
1785a8e1175bSopenharmony_cidepends_on:DEP1
1786a8e1175bSopenharmony_cifunc1:0
1787a8e1175bSopenharmony_ci'''
1788a8e1175bSopenharmony_ci        data_f = StringIOWrapper('test_suite_ut.data', data)
1789a8e1175bSopenharmony_ci        out_data_f = StringIOWrapper('test_suite_ut.datax', '')
1790a8e1175bSopenharmony_ci        func_info = {'test_func1': (1, ('int',))}
1791a8e1175bSopenharmony_ci        suite_dependencies = []
1792a8e1175bSopenharmony_ci        write_parameters_mock.side_effect = write_parameters
1793a8e1175bSopenharmony_ci        write_dependencies_mock.side_effect = write_dependencies
1794a8e1175bSopenharmony_ci        func_mock1.side_effect = gen_suite_dep_checks
1795a8e1175bSopenharmony_ci        gen_from_test_data(data_f, out_data_f, func_info, suite_dependencies)
1796a8e1175bSopenharmony_ci        write_dependencies_mock.assert_called_with(out_data_f,
1797a8e1175bSopenharmony_ci                                                   ['DEP1'], ['DEP1'])
1798a8e1175bSopenharmony_ci        write_parameters_mock.assert_called_with(out_data_f, ['0'],
1799a8e1175bSopenharmony_ci                                                 ('int',), [])
1800a8e1175bSopenharmony_ci        expected_dep_check_code = '''
1801a8e1175bSopenharmony_ci        case 0:
1802a8e1175bSopenharmony_ci            {
1803a8e1175bSopenharmony_ci#if defined(DEP1)
1804a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1805a8e1175bSopenharmony_ci#else
1806a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1807a8e1175bSopenharmony_ci#endif
1808a8e1175bSopenharmony_ci            }
1809a8e1175bSopenharmony_ci            break;'''
1810a8e1175bSopenharmony_ci        func_mock1.assert_called_with(
1811a8e1175bSopenharmony_ci            suite_dependencies, expected_dep_check_code, '')
1812a8e1175bSopenharmony_ci
1813a8e1175bSopenharmony_ci    def test_function_not_found(self):
1814a8e1175bSopenharmony_ci        """
1815a8e1175bSopenharmony_ci        Test that AssertError is raised when function info in not found.
1816a8e1175bSopenharmony_ci        :return:
1817a8e1175bSopenharmony_ci        """
1818a8e1175bSopenharmony_ci        data = '''
1819a8e1175bSopenharmony_ciMy test
1820a8e1175bSopenharmony_cidepends_on:DEP1
1821a8e1175bSopenharmony_cifunc1:0
1822a8e1175bSopenharmony_ci'''
1823a8e1175bSopenharmony_ci        data_f = StringIOWrapper('test_suite_ut.data', data)
1824a8e1175bSopenharmony_ci        out_data_f = StringIOWrapper('test_suite_ut.datax', '')
1825a8e1175bSopenharmony_ci        func_info = {'test_func2': (1, ('int',))}
1826a8e1175bSopenharmony_ci        suite_dependencies = []
1827a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_from_test_data,
1828a8e1175bSopenharmony_ci                          data_f, out_data_f, func_info, suite_dependencies)
1829a8e1175bSopenharmony_ci
1830a8e1175bSopenharmony_ci    def test_different_func_args(self):
1831a8e1175bSopenharmony_ci        """
1832a8e1175bSopenharmony_ci        Test that AssertError is raised when no. of parameters and
1833a8e1175bSopenharmony_ci        function args differ.
1834a8e1175bSopenharmony_ci        :return:
1835a8e1175bSopenharmony_ci        """
1836a8e1175bSopenharmony_ci        data = '''
1837a8e1175bSopenharmony_ciMy test
1838a8e1175bSopenharmony_cidepends_on:DEP1
1839a8e1175bSopenharmony_cifunc1:0
1840a8e1175bSopenharmony_ci'''
1841a8e1175bSopenharmony_ci        data_f = StringIOWrapper('test_suite_ut.data', data)
1842a8e1175bSopenharmony_ci        out_data_f = StringIOWrapper('test_suite_ut.datax', '')
1843a8e1175bSopenharmony_ci        func_info = {'test_func2': (1, ('int', 'hex'))}
1844a8e1175bSopenharmony_ci        suite_dependencies = []
1845a8e1175bSopenharmony_ci        self.assertRaises(GeneratorInputError, gen_from_test_data, data_f,
1846a8e1175bSopenharmony_ci                          out_data_f, func_info, suite_dependencies)
1847a8e1175bSopenharmony_ci
1848a8e1175bSopenharmony_ci    def test_output(self):
1849a8e1175bSopenharmony_ci        """
1850a8e1175bSopenharmony_ci        Test that intermediate data file is written with expected data.
1851a8e1175bSopenharmony_ci        :return:
1852a8e1175bSopenharmony_ci        """
1853a8e1175bSopenharmony_ci        data = '''
1854a8e1175bSopenharmony_ciMy test 1
1855a8e1175bSopenharmony_cidepends_on:DEP1
1856a8e1175bSopenharmony_cifunc1:0:0xfa:MACRO1:MACRO2
1857a8e1175bSopenharmony_ci
1858a8e1175bSopenharmony_ciMy test 2
1859a8e1175bSopenharmony_cidepends_on:DEP1:DEP2
1860a8e1175bSopenharmony_cifunc2:"yahoo":88:MACRO1
1861a8e1175bSopenharmony_ci'''
1862a8e1175bSopenharmony_ci        data_f = StringIOWrapper('test_suite_ut.data', data)
1863a8e1175bSopenharmony_ci        out_data_f = StringIOWrapper('test_suite_ut.datax', '')
1864a8e1175bSopenharmony_ci        func_info = {'test_func1': (0, ('int', 'int', 'int', 'int')),
1865a8e1175bSopenharmony_ci                     'test_func2': (1, ('char*', 'int', 'int'))}
1866a8e1175bSopenharmony_ci        suite_dependencies = []
1867a8e1175bSopenharmony_ci        dep_check_code, expression_code = \
1868a8e1175bSopenharmony_ci            gen_from_test_data(data_f, out_data_f, func_info,
1869a8e1175bSopenharmony_ci                               suite_dependencies)
1870a8e1175bSopenharmony_ci        expected_dep_check_code = '''
1871a8e1175bSopenharmony_ci        case 0:
1872a8e1175bSopenharmony_ci            {
1873a8e1175bSopenharmony_ci#if defined(DEP1)
1874a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1875a8e1175bSopenharmony_ci#else
1876a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1877a8e1175bSopenharmony_ci#endif
1878a8e1175bSopenharmony_ci            }
1879a8e1175bSopenharmony_ci            break;
1880a8e1175bSopenharmony_ci        case 1:
1881a8e1175bSopenharmony_ci            {
1882a8e1175bSopenharmony_ci#if defined(DEP2)
1883a8e1175bSopenharmony_ci                ret = DEPENDENCY_SUPPORTED;
1884a8e1175bSopenharmony_ci#else
1885a8e1175bSopenharmony_ci                ret = DEPENDENCY_NOT_SUPPORTED;
1886a8e1175bSopenharmony_ci#endif
1887a8e1175bSopenharmony_ci            }
1888a8e1175bSopenharmony_ci            break;'''
1889a8e1175bSopenharmony_ci        expected_data = '''My test 1
1890a8e1175bSopenharmony_cidepends_on:0
1891a8e1175bSopenharmony_ci0:int:0:int:0xfa:exp:0:exp:1
1892a8e1175bSopenharmony_ci
1893a8e1175bSopenharmony_ciMy test 2
1894a8e1175bSopenharmony_cidepends_on:0:1
1895a8e1175bSopenharmony_ci1:char*:"yahoo":int:88:exp:0
1896a8e1175bSopenharmony_ci
1897a8e1175bSopenharmony_ci'''
1898a8e1175bSopenharmony_ci        expected_expression_code = '''
1899a8e1175bSopenharmony_ci        case 0:
1900a8e1175bSopenharmony_ci            {
1901a8e1175bSopenharmony_ci                *out_value = MACRO1;
1902a8e1175bSopenharmony_ci            }
1903a8e1175bSopenharmony_ci            break;
1904a8e1175bSopenharmony_ci        case 1:
1905a8e1175bSopenharmony_ci            {
1906a8e1175bSopenharmony_ci                *out_value = MACRO2;
1907a8e1175bSopenharmony_ci            }
1908a8e1175bSopenharmony_ci            break;'''
1909a8e1175bSopenharmony_ci        self.assertEqual(dep_check_code, expected_dep_check_code)
1910a8e1175bSopenharmony_ci        self.assertEqual(out_data_f.getvalue(), expected_data)
1911a8e1175bSopenharmony_ci        self.assertEqual(expression_code, expected_expression_code)
1912a8e1175bSopenharmony_ci
1913a8e1175bSopenharmony_ci
1914a8e1175bSopenharmony_ciif __name__ == '__main__':
1915a8e1175bSopenharmony_ci    unittest_main()
1916