diff options
Diffstat (limited to 'llvm_tools/bisect_clang_crashes_unittest.py')
-rwxr-xr-x | llvm_tools/bisect_clang_crashes_unittest.py | 156 |
1 files changed, 83 insertions, 73 deletions
diff --git a/llvm_tools/bisect_clang_crashes_unittest.py b/llvm_tools/bisect_clang_crashes_unittest.py index a3dc0c6d..22c9be19 100755 --- a/llvm_tools/bisect_clang_crashes_unittest.py +++ b/llvm_tools/bisect_clang_crashes_unittest.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright 2020 The Chromium OS Authors. All rights reserved. +# Copyright 2020 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -17,75 +17,85 @@ import bisect_clang_crashes class Test(unittest.TestCase): - """Tests for bisect_clang_crashes.""" - - class _SilencingFilter(object): - """Silences all log messages. - - Also collects info about log messages that would've been emitted. - """ - - def __init__(self): - self.messages = [] - - def filter(self, record): - self.messages.append(record.getMessage()) - return 0 - - @mock.patch.object(subprocess, 'check_output') - def test_get_artifacts(self, mock_gsutil_ls): - pattern = 'gs://chromeos-toolchain-artifacts/clang-crash-diagnoses/' \ - '**/*clang_crash_diagnoses.tar.xz' - mock_gsutil_ls.return_value = 'artifact1\nartifact2\nartifact3' - results = bisect_clang_crashes.get_artifacts(pattern) - self.assertEqual(results, ['artifact1', 'artifact2', 'artifact3']) - mock_gsutil_ls.assert_called_once_with(['gsutil.py', 'ls', pattern], - stderr=subprocess.STDOUT, - encoding='utf-8') - - @mock.patch.object(os.path, 'exists') - @mock.patch.object(glob, 'glob') - def test_get_crash_reproducers_succeed(self, mock_file_search, - mock_file_check): - working_dir = 'SomeDirectory' - mock_file_search.return_value = ['a.c', 'b.cpp', 'c.cc'] - mock_file_check.side_effect = [True, True, True] - results = bisect_clang_crashes.get_crash_reproducers(working_dir) - mock_file_search.assert_called_once_with('%s/*.c*' % working_dir) - self.assertEqual(mock_file_check.call_count, 3) - self.assertEqual(mock_file_check.call_args_list[0], mock.call('a.sh')) - self.assertEqual(mock_file_check.call_args_list[1], mock.call('b.sh')) - self.assertEqual(mock_file_check.call_args_list[2], mock.call('c.sh')) - self.assertEqual(results, [('a.c', 'a.sh'), ('b.cpp', 'b.sh'), - ('c.cc', 'c.sh')]) - - @mock.patch.object(os.path, 'exists') - @mock.patch.object(glob, 'glob') - def test_get_crash_reproducers_no_matching_script(self, mock_file_search, - mock_file_check): - - def silence_logging(): - root = logging.getLogger() - filt = self._SilencingFilter() - root.addFilter(filt) - self.addCleanup(root.removeFilter, filt) - return filt - - log_filter = silence_logging() - working_dir = 'SomeDirectory' - mock_file_search.return_value = ['a.c', 'b.cpp', 'c.cc'] - mock_file_check.side_effect = [True, False, True] - results = bisect_clang_crashes.get_crash_reproducers(working_dir) - mock_file_search.assert_called_once_with('%s/*.c*' % working_dir) - self.assertEqual(mock_file_check.call_count, 3) - self.assertEqual(mock_file_check.call_args_list[0], mock.call('a.sh')) - self.assertEqual(mock_file_check.call_args_list[1], mock.call('b.sh')) - self.assertEqual(mock_file_check.call_args_list[2], mock.call('c.sh')) - self.assertEqual(results, [('a.c', 'a.sh'), ('c.cc', 'c.sh')]) - self.assertTrue( - any('could not find the matching script of b.cpp' in x - for x in log_filter.messages), log_filter.messages) - - -if __name__ == '__main__': - unittest.main() + """Tests for bisect_clang_crashes.""" + + class _SilencingFilter(object): + """Silences all log messages. + + Also collects info about log messages that would've been emitted. + """ + + def __init__(self): + self.messages = [] + + def filter(self, record): + self.messages.append(record.getMessage()) + return 0 + + @mock.patch.object(subprocess, "check_output") + def test_get_artifacts(self, mock_gsutil_ls): + pattern = ( + "gs://chromeos-toolchain-artifacts/clang-crash-diagnoses/" + "**/*clang_crash_diagnoses.tar.xz" + ) + mock_gsutil_ls.return_value = "artifact1\nartifact2\nartifact3" + results = bisect_clang_crashes.get_artifacts(pattern) + self.assertEqual(results, ["artifact1", "artifact2", "artifact3"]) + mock_gsutil_ls.assert_called_once_with( + ["gsutil.py", "ls", pattern], + stderr=subprocess.STDOUT, + encoding="utf-8", + ) + + @mock.patch.object(os.path, "exists") + @mock.patch.object(glob, "glob") + def test_get_crash_reproducers_succeed( + self, mock_file_search, mock_file_check + ): + working_dir = "SomeDirectory" + mock_file_search.return_value = ["a.c", "b.cpp", "c.cc"] + mock_file_check.side_effect = [True, True, True] + results = bisect_clang_crashes.get_crash_reproducers(working_dir) + mock_file_search.assert_called_once_with("%s/*.c*" % working_dir) + self.assertEqual(mock_file_check.call_count, 3) + self.assertEqual(mock_file_check.call_args_list[0], mock.call("a.sh")) + self.assertEqual(mock_file_check.call_args_list[1], mock.call("b.sh")) + self.assertEqual(mock_file_check.call_args_list[2], mock.call("c.sh")) + self.assertEqual( + results, [("a.c", "a.sh"), ("b.cpp", "b.sh"), ("c.cc", "c.sh")] + ) + + @mock.patch.object(os.path, "exists") + @mock.patch.object(glob, "glob") + def test_get_crash_reproducers_no_matching_script( + self, mock_file_search, mock_file_check + ): + def silence_logging(): + root = logging.getLogger() + filt = self._SilencingFilter() + root.addFilter(filt) + self.addCleanup(root.removeFilter, filt) + return filt + + log_filter = silence_logging() + working_dir = "SomeDirectory" + mock_file_search.return_value = ["a.c", "b.cpp", "c.cc"] + mock_file_check.side_effect = [True, False, True] + results = bisect_clang_crashes.get_crash_reproducers(working_dir) + mock_file_search.assert_called_once_with("%s/*.c*" % working_dir) + self.assertEqual(mock_file_check.call_count, 3) + self.assertEqual(mock_file_check.call_args_list[0], mock.call("a.sh")) + self.assertEqual(mock_file_check.call_args_list[1], mock.call("b.sh")) + self.assertEqual(mock_file_check.call_args_list[2], mock.call("c.sh")) + self.assertEqual(results, [("a.c", "a.sh"), ("c.cc", "c.sh")]) + self.assertTrue( + any( + "could not find the matching script of b.cpp" in x + for x in log_filter.messages + ), + log_filter.messages, + ) + + +if __name__ == "__main__": + unittest.main() |