• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2# Copyright 2021 The Pigweed Authors
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5# use this file except in compliance with the License. You may obtain a copy of
6# the License at
7#
8#     https://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations under
14# the License.
15"""Finds files for a given product."""
16
17import unittest
18
19from pw_stm32cube_build import inject_init
20
21
22class AddPreMainInitTest(unittest.TestCase):
23    """add_pre_main_init tests."""
24    def test_spaces(self):
25        startup = '\n'.join([
26            '/* Call the clock system intitialization function.*/',
27            '  bl  SystemInit   ',
28            '/* Call static constructors */',
29            '    bl __libc_init_array',
30            '/* Call the application\'s entry point.*/',
31            '  bl  main',
32            '  bx  lr    ',
33            '.size  Reset_Handler, .-Reset_Handler',
34        ])
35
36        new_startup = inject_init.add_pre_main_init(startup)
37
38        self.assertEqual(
39            new_startup, '\n'.join([
40                '/* Call the clock system intitialization function.*/',
41                '  bl  SystemInit   ',
42                '/* Call static constructors */',
43                '    bl __libc_init_array',
44                '/* Call the application\'s entry point.*/',
45                'bl pw_stm32cube_Init',
46                '  bl  main',
47                '  bx  lr    ',
48                '.size  Reset_Handler, .-Reset_Handler',
49            ]))
50
51    def test_tabs(self):
52        startup = '\n'.join([
53            'LoopFillZerobss:',
54            '	ldr	r3, = _ebss',
55            '	cmp	r2, r3',
56            '	bcc	FillZerobss',
57            ''
58            '/* Call static constructors */',
59            '  bl __libc_init_array',
60            '/* Call the application\'s entry point.*/',
61            '	bl	main',
62            '',
63            'LoopForever:',
64            '    b LoopForever',
65        ])
66
67        new_startup = inject_init.add_pre_main_init(startup)
68
69        self.assertEqual(
70            new_startup, '\n'.join([
71                'LoopFillZerobss:',
72                '	ldr	r3, = _ebss',
73                '	cmp	r2, r3',
74                '	bcc	FillZerobss',
75                ''
76                '/* Call static constructors */',
77                '  bl __libc_init_array',
78                '/* Call the application\'s entry point.*/',
79                'bl pw_stm32cube_Init',
80                '	bl	main',
81                '',
82                'LoopForever:',
83                '    b LoopForever',
84            ]))
85
86    def test_main_not_found(self):
87        startup = '\n'.join([
88            '/* Call the clock system intitialization function.*/',
89            '  bl  SystemInit   ',
90            '/* Call static constructors */',
91            '    bl __libc_init_array',
92            '/* Call the application\'s entry point.*/',
93            '  bl  application_entry',
94            '  bx  lr    ',
95            '.size  Reset_Handler, .-Reset_Handler',
96        ])
97
98        with self.assertRaises(ValueError):
99            inject_init.add_pre_main_init(startup)
100
101
102if __name__ == '__main__':
103    unittest.main()
104