1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# Copyright 2020 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Tests for upload_lexan_crashes_to_forcey.""" 8 9import datetime 10import os 11import unittest 12import unittest.mock 13 14import upload_lexan_crashes_to_forcey 15 16 17class Test(unittest.TestCase): 18 """Tests for upload_lexan_crashes_to_forcey.""" 19 20 def test_date_parsing_functions(self): 21 self.assertEqual( 22 datetime.date(2020, 2, 1), 23 upload_lexan_crashes_to_forcey.from_ymd('2020-02-01')) 24 25 @unittest.mock.patch( 26 'upload_lexan_crashes_to_forcey.test_cases_on_or_after', 27 return_value=( 28 ( 29 datetime.date(2020, 1, 1), 30 ('gs://test-case-1', 'gs://test-case-1.1'), 31 ), 32 (datetime.date(2020, 1, 2), ('gs://test-case-2',)), 33 (datetime.date(2020, 1, 1), ('gs://test-case-3',)), 34 (datetime.date(2020, 1, 4), ('gs://test-case-4',)), 35 )) 36 @unittest.mock.patch('upload_lexan_crashes_to_forcey.submit_test_case') 37 @unittest.mock.patch('upload_lexan_crashes_to_forcey.persist_state') 38 def test_new_test_case_submission_functions(self, persist_state_mock, 39 submit_test_case_mock, 40 test_cases_on_or_after_mock): 41 forcey_path = '/path/to/4c' 42 real_state_file_path = '/path/to/state/file' 43 earliest_date = datetime.date(2020, 1, 1) 44 45 persist_state_calls = [] 46 47 # Since the set this gets is mutated, we need to copy it somehow. 48 def persist_state_side_effect(test_cases_to_persist, state_file_path, 49 most_recent_date): 50 self.assertEqual(state_file_path, real_state_file_path) 51 persist_state_calls.append( 52 (sorted(test_cases_to_persist), most_recent_date)) 53 54 persist_state_mock.side_effect = persist_state_side_effect 55 56 upload_lexan_crashes_to_forcey.submit_new_test_cases( 57 last_seen_test_cases=( 58 'gs://test-case-0', 59 'gs://test-case-1', 60 ), 61 earliest_date_to_check=earliest_date, 62 forcey=forcey_path, 63 state_file_path=real_state_file_path, 64 ) 65 66 test_cases_on_or_after_mock.assert_called_once_with(earliest_date) 67 self.assertEqual(submit_test_case_mock.call_args_list, [ 68 unittest.mock.call('gs://test-case-1.1', forcey_path), 69 unittest.mock.call('gs://test-case-2', forcey_path), 70 unittest.mock.call('gs://test-case-3', forcey_path), 71 unittest.mock.call('gs://test-case-4', forcey_path), 72 ]) 73 74 self.assertEqual(persist_state_calls, [ 75 ( 76 ['gs://test-case-0', 'gs://test-case-1', 'gs://test-case-1.1'], 77 datetime.date(2020, 1, 1), 78 ), 79 ( 80 [ 81 'gs://test-case-0', 82 'gs://test-case-1', 83 'gs://test-case-1.1', 84 'gs://test-case-2', 85 ], 86 datetime.date(2020, 1, 2), 87 ), 88 ( 89 [ 90 'gs://test-case-0', 91 'gs://test-case-1', 92 'gs://test-case-1.1', 93 'gs://test-case-2', 94 'gs://test-case-3', 95 ], 96 datetime.date(2020, 1, 2), 97 ), 98 ( 99 [ 100 'gs://test-case-0', 101 'gs://test-case-1', 102 'gs://test-case-1.1', 103 'gs://test-case-2', 104 'gs://test-case-3', 105 'gs://test-case-4', 106 ], 107 datetime.date(2020, 1, 4), 108 ), 109 ( 110 [ 111 'gs://test-case-1', 112 'gs://test-case-1.1', 113 'gs://test-case-2', 114 'gs://test-case-3', 115 'gs://test-case-4', 116 ], 117 datetime.date(2020, 1, 4), 118 ), 119 ]) 120 121 @unittest.mock.patch( 122 'upload_lexan_crashes_to_forcey.download_and_unpack_test_case') 123 @unittest.mock.patch('subprocess.run') 124 def test_test_case_submission_functions(self, subprocess_run_mock, 125 download_and_unpack_mock): 126 mock_gs_url = 'gs://foo/bar/baz' 127 128 def side_effect(gs_url: str, tempdir: str) -> None: 129 self.assertEqual(gs_url, mock_gs_url) 130 131 with open(os.path.join(tempdir, 'test_case.c'), 'w') as f: 132 # All we need is an empty file here. 133 pass 134 135 with open( 136 os.path.join(tempdir, 'test_case.sh'), 'w', encoding='utf-8') as f: 137 f.write('# Crash reproducer for clang version 9.0.0 (...)\n') 138 f.write('clang something or other\n') 139 140 download_and_unpack_mock.side_effect = side_effect 141 upload_lexan_crashes_to_forcey.submit_test_case(mock_gs_url, '4c') 142 subprocess_run_mock.assert_not_called() 143 144 145if __name__ == '__main__': 146 unittest.main() 147