aboutsummaryrefslogtreecommitdiff
path: root/llvm_tools/nightly_revert_checker_test.py
diff options
context:
space:
mode:
authorGeorge Burgess IV <gbiv@google.com>2024-01-12 21:52:20 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-01-19 16:39:55 +0000
commitf750cb6d675ac35e0719685f2b0ca2a6cf543fa1 (patch)
tree1d36af3bc343b4f2d2b90294ba3445965212d87e /llvm_tools/nightly_revert_checker_test.py
parent4093f8fd0bf1ff8649b0cd6b7c71c945ed9e7c89 (diff)
downloadtoolchain-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-xllvm_tools/nightly_revert_checker_test.py110
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()