blob: 7238281a54d1368efb763f3c81bce635fe05cb21 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 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.
"""Tests for upload_lexan_crashes_to_forcey."""
import datetime
import os
import unittest
import unittest.mock
import upload_lexan_crashes_to_forcey
class Test(unittest.TestCase):
"""Tests for upload_lexan_crashes_to_forcey."""
def test_date_parsing_functions(self):
self.assertEqual(
datetime.date(2020, 2, 1),
upload_lexan_crashes_to_forcey.from_ymd("2020-02-01"),
)
@unittest.mock.patch(
"upload_lexan_crashes_to_forcey.test_cases_on_or_after",
return_value=(
(
datetime.date(2020, 1, 1),
("gs://test-case-1", "gs://test-case-1.1"),
),
(datetime.date(2020, 1, 2), ("gs://test-case-2",)),
(datetime.date(2020, 1, 1), ("gs://test-case-3",)),
(datetime.date(2020, 1, 4), ("gs://test-case-4",)),
),
)
@unittest.mock.patch("upload_lexan_crashes_to_forcey.submit_test_case")
@unittest.mock.patch("upload_lexan_crashes_to_forcey.persist_state")
def test_new_test_case_submission_functions(
self,
persist_state_mock,
submit_test_case_mock,
test_cases_on_or_after_mock,
):
forcey_path = "/path/to/4c"
real_state_file_path = "/path/to/state/file"
earliest_date = datetime.date(2020, 1, 1)
persist_state_calls = []
# Since the set this gets is mutated, we need to copy it somehow.
def persist_state_side_effect(
test_cases_to_persist, state_file_path, most_recent_date
):
self.assertEqual(state_file_path, real_state_file_path)
persist_state_calls.append(
(sorted(test_cases_to_persist), most_recent_date)
)
persist_state_mock.side_effect = persist_state_side_effect
upload_lexan_crashes_to_forcey.submit_new_test_cases(
last_seen_test_cases=(
"gs://test-case-0",
"gs://test-case-1",
),
earliest_date_to_check=earliest_date,
forcey=forcey_path,
state_file_path=real_state_file_path,
)
test_cases_on_or_after_mock.assert_called_once_with(earliest_date)
self.assertEqual(
submit_test_case_mock.call_args_list,
[
unittest.mock.call("gs://test-case-1.1", forcey_path),
unittest.mock.call("gs://test-case-2", forcey_path),
unittest.mock.call("gs://test-case-3", forcey_path),
unittest.mock.call("gs://test-case-4", forcey_path),
],
)
self.assertEqual(
persist_state_calls,
[
(
[
"gs://test-case-0",
"gs://test-case-1",
"gs://test-case-1.1",
],
datetime.date(2020, 1, 1),
),
(
[
"gs://test-case-0",
"gs://test-case-1",
"gs://test-case-1.1",
"gs://test-case-2",
],
datetime.date(2020, 1, 2),
),
(
[
"gs://test-case-0",
"gs://test-case-1",
"gs://test-case-1.1",
"gs://test-case-2",
"gs://test-case-3",
],
datetime.date(2020, 1, 2),
),
(
[
"gs://test-case-0",
"gs://test-case-1",
"gs://test-case-1.1",
"gs://test-case-2",
"gs://test-case-3",
"gs://test-case-4",
],
datetime.date(2020, 1, 4),
),
(
[
"gs://test-case-1",
"gs://test-case-1.1",
"gs://test-case-2",
"gs://test-case-3",
"gs://test-case-4",
],
datetime.date(2020, 1, 4),
),
],
)
@unittest.mock.patch(
"upload_lexan_crashes_to_forcey.download_and_unpack_test_case"
)
@unittest.mock.patch("subprocess.run")
def test_test_case_submission_functions(
self, subprocess_run_mock, download_and_unpack_mock
):
mock_gs_url = "gs://foo/bar/baz"
def side_effect(gs_url: str, tempdir: str) -> None:
self.assertEqual(gs_url, mock_gs_url)
with open(os.path.join(tempdir, "test_case.c"), "w") as f:
# All we need is an empty file here.
pass
with open(
os.path.join(tempdir, "test_case.sh"), "w", encoding="utf-8"
) as f:
f.write("# Crash reproducer for clang version 9.0.0 (...)\n")
f.write("clang something or other\n")
download_and_unpack_mock.side_effect = side_effect
upload_lexan_crashes_to_forcey.submit_test_case(mock_gs_url, "4c")
subprocess_run_mock.assert_not_called()
if __name__ == "__main__":
unittest.main()