def test_macro_name(self): source_scanner = SourceScanner() report = Report('/root') io_object = io.StringIO('#define MACRO __asm__("mov r0, r1")') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 1) self.assertEqual(report.issues[0].function, 'MACRO')
def test_function_name(self): source_scanner = SourceScanner() report = Report('/root') io_object = io.StringIO('void func(void) {\n__asm__("mov r0, r1");\n}') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 1) self.assertEqual(report.issues[0].function, 'func')
def test_no_equivalent_intrinsic_file(self): source_scanner = SourceScanner() port_filter = PortFilter() report = Report('/root') port_filter.initialize_report(report) source_scanner.initialize_report(report) io_object = io.StringIO('_otherarch_intrinsic_xyz(123)') report.add_source_file('otherarch.c') source_scanner.scan_file_object('otherarch.c', io_object, report) io_object = io.StringIO('foo') report.add_source_file('aarch64.c') source_scanner.scan_file_object('aarch64.c', io_object, report) source_scanner.finalize_report(report) port_filter.finalize_report(report) self.assertEqual(len(report.issues), 1)
def test_no_equivalent_inline_asm_single_file(self): source_scanner = SourceScanner() report = Report('/root') source_scanner.initialize_report(report) io_object = io.StringIO('__asm__("mov r0, r1"') source_scanner.scan_file_object('test.c', io_object, report) source_scanner.finalize_report(report) self.assertEqual(len(report.issues), 2)
def test_no_equivalent_intrinsic_function_inline(self): source_scanner = SourceScanner() report = Report('/root') source_scanner.initialize_report(report) io_object = io.StringIO( 'void func() {\n#if defined(__otherarch__)\n_otherarch_intrinsic_xyz(123));\n#elif defined(__aarch64__)\nfoo\n#endif\n}' ) source_scanner.scan_file_object('test.c', io_object, report) source_scanner.finalize_report(report) self.assertEqual(len(report.issues), 1)
def test_equivalent_inline_asm_function_outline(self): source_scanner = SourceScanner() report = Report('/root') source_scanner.initialize_report(report) io_object = io.StringIO( '#if defined(__otherarch__)\nvoid func() {\n__asm__("mov r0, r1");\n}\n#elif defined(__aarch64__)\nvoid func() {\n__asm__("mov r0, r1");\n}\n#endif' ) source_scanner.scan_file_object('test.c', io_object, report) source_scanner.finalize_report(report) self.assertEqual(len(report.issues), 0)
def test_accepts_file(self): source_scanner = SourceScanner() self.assertFalse(source_scanner.accepts_file('test')) self.assertTrue(source_scanner.accepts_file('test.c')) self.assertTrue(source_scanner.accepts_file('test.cc')) self.assertTrue(source_scanner.accepts_file('test.CC')) self.assertTrue(source_scanner.accepts_file('test.f90')) self.assertTrue(source_scanner.accepts_file('test.F'))
def test_equivalent_inline_asm_file(self): source_scanner = SourceScanner() port_filter = PortFilter() report = Report('/root') port_filter.initialize_report(report) source_scanner.initialize_report(report) io_object = io.StringIO('__asm__("mov r0, r1")') report.add_source_file('otherarch.c') source_scanner.scan_file_object('otherarch.c', io_object, report) io_object = io.StringIO('__asm__("mov r0, r1")') report.add_source_file('aarch64.c') source_scanner.scan_file_object('aarch64.c', io_object, report) source_scanner.finalize_report(report) port_filter.finalize_report(report) self.assertEqual(len(report.issues), 0) found_ported_remark = False for remark in report.remarks: if isinstance(remark, PortedInlineAsmRemark): found_ported_remark = True break self.assertTrue(found_ported_remark)
def test_comments_are_ignored(self): source_scanner = SourceScanner() report = Report('/root') io_object = io.StringIO('// __asm__("mov r0, r1")') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 0) report = Report('/root') io_object = io.StringIO('/*\n__asm__("mov r0, r1")\n*/') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 0)
def test_output(self): config_guess_scanner = ConfigGuessScanner() source_scanner = SourceScanner() report = CsvReport('/root') report.add_source_file('test_negative.c') io_object = io.StringIO('__asm__("mov r0, r1")') source_scanner.scan_file_object( 'test_negative.c', io_object, report) report.add_source_file('test_neutral.c') io_object = io.StringIO('#pragma simd foo') source_scanner.scan_file_object( 'test_neutral.c', io_object, report) report.add_source_file('config.guess') io_object = io.StringIO('aarch64:Linux') config_guess_scanner.scan_file_object( 'config.guess', io_object, report) self.assertEqual(len(report.issues), 2) self.assertEqual(len(report.remarks), 1) with tempfile.NamedTemporaryFile(mode='w', delete=False) as ofp: report.write(ofp) fname = ofp.name ofp.close() with open(fname) as ifp: csv_reader = csv.DictReader(ifp) seen_issue1 = False seen_issue2 = False for row in csv_reader: if 'test_negative.c' in row['filename']: self.assertIn('InlineAsm', row['issue_type']) seen_issue1 = True elif 'test_neutral.c' in row['filename']: self.assertIn('PragmaSimd', row['issue_type']) seen_issue2 = True else: self.fail('Unexpected row in CSV output') self.assertTrue(seen_issue1) self.assertTrue(seen_issue2)
def test_scan_file_object(self): source_scanner = SourceScanner() report = Report('/root') io_object = io.StringIO('xxx') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 0) report = Report('/root') io_object = io.StringIO('__asm__("")') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 0) report = Report('/root') io_object = io.StringIO('__asm__("mov r0, r1")') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 1) report = Report('/root') io_object = io.StringIO('_otherarch_intrinsic_xyz(123)') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 1) report = Report('/root') io_object = io.StringIO('#pragma simd foo') source_scanner.scan_file_object('test.c', io_object, report) self.assertEqual(len(report.issues), 1) self.assertEqual(report.issues[0].item_type, ReportItem.NEUTRAL)
def test_output(self): config_guess_scanner = ConfigGuessScanner() source_scanner = SourceScanner() issue_type_config = IssueTypeConfig() report = CsvIssueTypeCountByFileReport('/root', issue_type_config=issue_type_config) report.add_source_file('test_negative.c') io_object = io.StringIO('__asm__("mov r0, r1")') source_scanner.scan_file_object( 'test_negative.c', io_object, report) report.add_source_file('test_neutral.c') io_object = io.StringIO('#pragma simd foo') source_scanner.scan_file_object( 'test_neutral.c', io_object, report) report.add_source_file('config.guess') io_object = io.StringIO('aarch64:Linux') config_guess_scanner.scan_file_object( 'config.guess', io_object, report) report.add_source_file('test_nothing.c') io_object = io.StringIO('foobar') source_scanner.scan_file_object( 'test_nothing.c', io_object, report) self.assertEqual(len(report.issues), 2) self.assertEqual(len(report.remarks), 1) with tempfile.NamedTemporaryFile(mode='w', delete=False) as ofp: report.write(ofp) fname = ofp.name ofp.close() with open(fname) as ifp: csv_reader = csv.DictReader(ifp) seen_negative = False seen_neutral = False seen_config_guess = False seen_nothing = False for row in csv_reader: if 'test_negative.c' in row['filename']: seen_negative = True for (field, actual) in row.items(): if field == 'filename': continue expected = '1' if field == 'InlineAsm' else '0' self.assertEqual(expected, actual) elif 'test_neutral.c' in row['filename']: seen_neutral = True for (field, actual) in row.items(): if field == 'filename': continue expected = '1' if field == 'PragmaSimd' else '0' self.assertEqual(expected, actual) elif 'config.guess' in row['filename']: seen_config_guess = True for (field, actual) in row.items(): if field == 'filename': continue self.assertEqual('0', actual) elif 'test_nothing.c' in row['filename']: seen_nothing = True for (field, actual) in row.items(): if field == 'filename': continue self.assertEqual('0', actual) else: print(row) self.fail('Unexpected row in CSV output') self.assertTrue(seen_negative) self.assertTrue(seen_neutral) self.assertTrue(seen_config_guess) self.assertTrue(seen_nothing)