diff options
author | George Burgess IV <gbiv@google.com> | 2024-01-12 21:52:20 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-01-19 16:39:55 +0000 |
commit | f750cb6d675ac35e0719685f2b0ca2a6cf543fa1 (patch) | |
tree | 1d36af3bc343b4f2d2b90294ba3445965212d87e /llvm_tools/nightly_revert_checker_test.py | |
parent | 4093f8fd0bf1ff8649b0cd6b7c71c945ed9e7c89 (diff) | |
download | toolchain-utils-f750cb6d675ac35e0719685f2b0ca2a6cf543fa1.tar.gz |
nightly_revert_checker: add stale HEAD notifications
This notifies teams when this tool doesn't observe their LLVM revision
moving for a while. The intent isn't to put pressure on LLVM upgrade
rotations; more to catch bugs in this checker earlier rather than later.
BUG=b:319635292
TEST=Unittests
Change-Id: I211b8803f483a96952f5d573bdb083ac723d3ca4
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/5200618
Commit-Queue: George Burgess <gbiv@chromium.org>
Reviewed-by: Jordan Abrahams-Whitehead <ajordanr@google.com>
Tested-by: George Burgess <gbiv@chromium.org>
Diffstat (limited to 'llvm_tools/nightly_revert_checker_test.py')
-rwxr-xr-x | llvm_tools/nightly_revert_checker_test.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/llvm_tools/nightly_revert_checker_test.py b/llvm_tools/nightly_revert_checker_test.py index 7e95766d..722ad125 100755 --- a/llvm_tools/nightly_revert_checker_test.py +++ b/llvm_tools/nightly_revert_checker_test.py @@ -184,6 +184,7 @@ class Test(unittest.TestCase): nightly_revert_checker.do_cherrypick( chroot_path="/path/to/chroot", llvm_dir="/path/to/llvm", + repository="repository_name", interesting_shas=[("12345abcdef", "fedcba54321")], state=nightly_revert_checker.State(), reviewers=["meow@chromium.org"], @@ -207,6 +208,7 @@ class Test(unittest.TestCase): nightly_revert_checker.do_cherrypick( chroot_path="/path/to/chroot", llvm_dir="/path/to/llvm", + repository="repository_name", interesting_shas=[("12345abcdef", "fedcba54321")], state=nightly_revert_checker.State(), reviewers=["meow@chromium.org"], @@ -230,6 +232,114 @@ class Test(unittest.TestCase): ), ) + @mock.patch("time.time") + def test_emailing_about_stale_heads_skips_in_simple_cases(self, time_time): + now = 1_000_000_000 + time_time.return_value = now + + def assert_no_email(state: nightly_revert_checker.State): + self.assertFalse( + nightly_revert_checker.maybe_email_about_stale_heads( + state, + repository_name="foo", + recipients=nightly_revert_checker._EmailRecipients( + well_known=[], direct=[] + ), + prettify_sha=lambda *args: self.fail( + "SHAs shouldn't be prettified" + ), + is_dry_run=True, + ) + ) + + assert_no_email(nightly_revert_checker.State()) + assert_no_email( + nightly_revert_checker.State( + heads={ + "foo": nightly_revert_checker.HeadInfo( + last_sha="", + first_seen_timestamp=0, + next_notification_timestamp=now + 1, + ), + "bar": nightly_revert_checker.HeadInfo( + last_sha="", + first_seen_timestamp=0, + next_notification_timestamp=now * 2, + ), + } + ) + ) + + def test_state_autoupgrades_from_json_properly(self): + state = nightly_revert_checker.State.from_json({"abc123": ["def456"]}) + self.assertEqual(state.seen_reverts, {"abc123": ["def456"]}) + self.assertEqual(state.heads, {}) + + def test_state_round_trips_through_json(self): + state = nightly_revert_checker.State( + seen_reverts={"abc123": ["def456"]}, + heads={ + "head_name": nightly_revert_checker.HeadInfo( + last_sha="abc", + first_seen_timestamp=123, + next_notification_timestamp=456, + ), + }, + ) + self.assertEqual( + state, nightly_revert_checker.State.from_json(state.to_json()) + ) + + @mock.patch("time.time") + @mock.patch("nightly_revert_checker._send_revert_email") + def test_emailing_about_stale_with_one_report( + self, send_revert_email, time_time + ): + def prettify_sha(sha: str) -> str: + return f"pretty({sha})" + + now = 1_000_000_000 + two_days_ago = now - 2 * nightly_revert_checker.ONE_DAY_SECS + time_time.return_value = now + recipients = nightly_revert_checker._EmailRecipients( + well_known=[], direct=[] + ) + self.assertTrue( + nightly_revert_checker.maybe_email_about_stale_heads( + nightly_revert_checker.State( + heads={ + "foo": nightly_revert_checker.HeadInfo( + last_sha="<foo sha>", + first_seen_timestamp=two_days_ago, + next_notification_timestamp=now - 1, + ), + "bar": nightly_revert_checker.HeadInfo( + last_sha="", + first_seen_timestamp=0, + next_notification_timestamp=now + 1, + ), + } + ), + repository_name="repo", + recipients=recipients, + prettify_sha=prettify_sha, + is_dry_run=False, + ) + ) + send_revert_email.assert_called_once() + recipients, email = send_revert_email.call_args[0] + + self.assertEqual( + tiny_render.render_text_pieces(email.body), + "Hi! This is a friendly notification that the current upstream " + "LLVM SHA is being tracked by the LLVM revert checker:\n" + " - foo at pretty(<foo sha>), which was last updated ~2 days " + "ago.\n" + "If that's still correct, great! If it looks wrong, the revert " + "checker's SHA autodetection may need an update. Please file a " + "bug at go/crostc-bug if an update is needed. Thanks!", + ) + if __name__ == "__main__": unittest.main() |