diff options
| author | Ram Peri <ramperi@google.com> | 2026-04-21 00:02:47 +0000 |
|---|---|---|
| committer | gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2026-04-21 17:10:07 -0700 |
| commit | 5af71ce907848a546199f0d64a5dfba1db8adca0 (patch) | |
| tree | 511327039aeb7db3d08a1fdc6bdb7b537116d63d /tests/test_hooks.py | |
| parent | baa281d99e59dbf1447524e6fd95b384cadbc06e (diff) | |
| download | git-repo-5af71ce907848a546199f0d64a5dfba1db8adca0.tar.gz git-repo-5af71ce907848a546199f0d64a5dfba1db8adca0.zip | |
Add timing keyword argument for hooks
Measure the duration of the sync operation in the Execute method of the
Sync command and pass it to post-sync hooks as a standard keyword
argument (`sync_duration_seconds`).
Updates based on code review:
- Update _API_ARGS in hooks.py to allow sync_duration_seconds for post-sync hooks.
- Do not cast sync_duration_seconds to int for better granularity.
- Update docs/repo-hooks.md to document sync_duration_seconds.
- Add unit test for argument validation in test_hooks.py.
Test: Ran run_tests using venv python, all 554 tests passed.
Bug: TBD
Change-Id: Ie29e002a5d283460d993ad96c224dbf4b6d7985c
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/575021
Tested-by: Arif Kasim <arifkasim@google.com>
Commit-Queue: Ram Peri <ramperi@google.com>
Reviewed-by: Arif Kasim <arifkasim@google.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
Diffstat (limited to 'tests/test_hooks.py')
| -rw-r--r-- | tests/test_hooks.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/test_hooks.py b/tests/test_hooks.py index 9d52d1849..14c226c75 100644 --- a/tests/test_hooks.py +++ b/tests/test_hooks.py @@ -14,6 +14,9 @@ """Unittests for the hooks.py module.""" +from io import StringIO +import sys + import pytest import hooks @@ -58,3 +61,47 @@ def test_direct_interp(shebang: str, interp: str) -> None: def test_env_interp(shebang: str, interp: str) -> None: """Lines whose shebang launches through `env`.""" assert hooks.RepoHook._ExtractInterpFromShebang(shebang) == interp + + +def test_post_sync_argument_validation() -> None: + """Test that post-sync hook requires exact API arguments.""" + + class FakeProject: + + def __init__(self): + self.worktree = "/some/path" + self.enabled_repo_hooks = ["post-sync"] + + hook = hooks.RepoHook( + hook_type="post-sync", + hooks_project=FakeProject(), + repo_topdir="/topdir", + manifest_url="https://gerrit", + allow_all_hooks=True, + ) + + old_stderr = sys.stderr + sys.stderr = StringIO() + + try: + # Call with missing arg `sync_duration_seconds` + res = hook.Run(repo_topdir="/topdir") + assert res is False + assert "hook 'post-sync' called incorrectly" in sys.stderr.getvalue() + + # Mock _CheckHook and _ExecuteHook to test success path + hook._CheckHook = lambda: None + + executed_kwargs = {} + + def fake_execute(**kw): + executed_kwargs.update(kw) + + hook._ExecuteHook = fake_execute + + res = hook.Run(repo_topdir="/topdir", sync_duration_seconds=12.345) + assert res is True + assert executed_kwargs.get("sync_duration_seconds") == 12.345 + + finally: + sys.stderr = old_stderr |
