• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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