|
7 | 7 |
|
8 | 8 | import importlib
|
9 | 9 | import mock
|
| 10 | +import os |
10 | 11 | import subprocess
|
11 |
| -from pathlib import Path |
12 | 12 |
|
13 | 13 |
|
14 |
| -TARGET = importlib.import_module("elf-float-checker") |
| 14 | +TARGET = importlib.import_module("elf_float_checker") |
15 | 15 |
|
16 | 16 | SYMBOL_TABLE_WITHOUT_FLOATS = (
|
17 | 17 | " Symbol table '.symtab' contains 2723 entries:\n"
|
|
39 | 39 | ]
|
40 | 40 |
|
41 | 41 | SYMBOL_TABLE_WITH_FLOATS = (
|
42 |
| - " Symbol table '.symtab' contains 2723 entries:\n" |
43 |
| - "Num: Value Size Type Bind Vis Ndx Name\n" |
44 |
| - f" 0: 00000000 0 NOTYPE LOCAL DEFAULT UND \n" |
45 |
| - f" 1: 000045fd 16 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[0]}\n" |
46 |
| - f" 2: 00004609 16 FUNC GLOBAL HIDDEN 3 lp_ticker_disable_interrupt\n" |
47 |
| - f" 3: 00004615 16 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[1]}\n" |
48 |
| - f" 4: 00004625 36 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[2]}\n" |
49 |
| - f" 5: 00004645 8 FUNC GLOBAL HIDDEN 3 lp_ticker_get_info\n" |
50 |
| - f" 6: 0000464d 116 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[3]}\n" |
51 |
| - f" 7: 000046bd 20 FUNC GLOBAL HIDDEN 3 lp_ticker_irq_handler\n" |
52 |
| - f" 8: 000046d1 16 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[4]}\n" |
53 |
| - f" 9: 000046e1 52 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[5]}\n" |
54 |
| - f" 10: 000046f1 52 FUNC GLOBAL HIDDEN 3 {FLOAT_SYMBOLS[6]}\n" |
| 42 | + " Symbol table '.symtab' contains 2723 entries:\n"+ |
| 43 | + "Num: Value Size Type Bind Vis Ndx Name\n"+ |
| 44 | + " 0: 00000000 0 NOTYPE LOCAL DEFAULT UND \n"+ |
| 45 | + " 1: 000045fd 16 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[0])+ |
| 46 | + " 2: 00004609 16 FUNC GLOBAL HIDDEN 3 lp_ticker_disable_interrupt\n"+ |
| 47 | + " 3: 00004615 16 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[1])+ |
| 48 | + " 4: 00004625 36 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[2])+ |
| 49 | + " 5: 00004645 8 FUNC GLOBAL HIDDEN 3 lp_ticker_get_info\n"+ |
| 50 | + " 6: 0000464d 116 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[3])+ |
| 51 | + " 7: 000046bd 20 FUNC GLOBAL HIDDEN 3 lp_ticker_irq_handler\n"+ |
| 52 | + " 8: 000046d1 16 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[4])+ |
| 53 | + " 9: 000046e1 52 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[5])+ |
| 54 | + " 10: 000046f1 52 FUNC GLOBAL HIDDEN 3 {}\n".format(FLOAT_SYMBOLS[6]) |
55 | 55 | )
|
56 | 56 |
|
57 | 57 |
|
58 | 58 | ELF_FORMAT_FILE = "mbed-os-example.elf"
|
59 |
| -OBJECT_FILE_ANALYSIS_CMD = [*(TARGET.OBJECT_FILE_ANALYSIS_CMD), f"{ELF_FORMAT_FILE}"] |
| 59 | +OBJECT_FILE_ANALYSIS_CMD = [ |
| 60 | + TARGET.OBJECT_FILE_ANALYSIS_CMD[0], |
| 61 | + TARGET.OBJECT_FILE_ANALYSIS_CMD[1], |
| 62 | + "{}".format(ELF_FORMAT_FILE) |
| 63 | +] |
60 | 64 |
|
61 | 65 | class TestElfFloatChecker:
|
62 | 66 | """Test class"""
|
63 | 67 |
|
64 | 68 | @classmethod
|
65 | 69 | def setup_class(cls):
|
66 | 70 | # Create a dummy ELF format file
|
67 |
| - Path(ELF_FORMAT_FILE).touch() |
| 71 | + if not os.path.exists(ELF_FORMAT_FILE): |
| 72 | + with open(ELF_FORMAT_FILE, 'w'): pass |
68 | 73 |
|
69 | 74 | @classmethod
|
70 | 75 | def teardown_class(cls):
|
71 | 76 | # Remove the dummy ELF format file
|
72 |
| - Path(ELF_FORMAT_FILE).unlink() |
| 77 | + if os.path.exists(ELF_FORMAT_FILE): |
| 78 | + os.remove(ELF_FORMAT_FILE) |
73 | 79 |
|
74 |
| - @mock.patch("subprocess.run") |
| 80 | + @mock.patch("subprocess.Popen") |
75 | 81 | def test_correctly_detect_absence_of_float_symbols(
|
76 |
| - self, mock_subprocess_run |
| 82 | + self, mock_subprocess_popen |
77 | 83 | ):
|
78 | 84 | """Test that no false positive occur."""
|
79 |
| - mock_subprocess_run.return_value = subprocess.CompletedProcess( |
80 |
| - args=( |
81 |
| - f"{OBJECT_FILE_ANALYSIS_CMD}" |
82 |
| - " check=True, stderr=-2, stdin=None, stdout=-1" |
| 85 | + process_mock = mock.Mock() |
| 86 | + attrs = { |
| 87 | + "communicate.return_value":( |
| 88 | + SYMBOL_TABLE_WITHOUT_FLOATS.encode(), None |
83 | 89 | ),
|
84 |
| - returncode=0, |
85 |
| - stdout=SYMBOL_TABLE_WITHOUT_FLOATS.encode(), |
86 |
| - stderr=None, |
87 |
| - ) |
| 90 | + "returncode": 0, |
| 91 | + } |
| 92 | + process_mock.configure_mock(**attrs) |
| 93 | + mock_subprocess_popen.return_value = process_mock |
88 | 94 | assert [] == TARGET.check_float_symbols(ELF_FORMAT_FILE)
|
89 |
| - mock_subprocess_run.assert_called_with( |
| 95 | + mock_subprocess_popen.assert_called_with( |
90 | 96 | OBJECT_FILE_ANALYSIS_CMD,
|
91 |
| - check=True, |
92 |
| - stdin=None, |
93 | 97 | stdout=subprocess.PIPE,
|
94 | 98 | stderr=subprocess.STDOUT,
|
95 | 99 | )
|
96 | 100 |
|
97 |
| - @mock.patch("subprocess.run") |
| 101 | + @mock.patch("subprocess.Popen") |
98 | 102 | def test_correctly_detect_presence_of_float_symbols(
|
99 |
| - self, mock_subprocess_run |
| 103 | + self, mock_subprocess_popen |
100 | 104 | ):
|
101 | 105 | """Test that float symbols can be discovered in a symbol table."""
|
102 |
| - mock_subprocess_run.return_value = subprocess.CompletedProcess( |
103 |
| - args=( |
104 |
| - f"{OBJECT_FILE_ANALYSIS_CMD}" |
105 |
| - " check=True, stderr=-2, stdin=None, stdout=-1" |
| 106 | + process_mock = mock.Mock() |
| 107 | + attrs = { |
| 108 | + "communicate.return_value":( |
| 109 | + SYMBOL_TABLE_WITH_FLOATS.encode(), None |
106 | 110 | ),
|
107 |
| - returncode=0, |
108 |
| - stdout=SYMBOL_TABLE_WITH_FLOATS.encode(), |
109 |
| - stderr=None, |
110 |
| - ) |
| 111 | + "returncode": 0, |
| 112 | + } |
| 113 | + process_mock.configure_mock(**attrs) |
| 114 | + mock_subprocess_popen.return_value = process_mock |
111 | 115 | assert FLOAT_SYMBOLS == TARGET.check_float_symbols(
|
112 | 116 | ELF_FORMAT_FILE
|
113 | 117 | )
|
114 |
| - mock_subprocess_run.assert_called_with( |
| 118 | + mock_subprocess_popen.assert_called_with( |
115 | 119 | OBJECT_FILE_ANALYSIS_CMD,
|
116 |
| - check=True, |
117 |
| - stdin=None, |
118 | 120 | stdout=subprocess.PIPE,
|
119 | 121 | stderr=subprocess.STDOUT,
|
120 | 122 | )
|
0 commit comments