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