blob: 650f132f0fda5603cb1cc78366611177795c4e22 [file]
import difflib
import os
import pathlib
import unittest
from tests.integration import runner
class BzlmodLockfileTest(runner.TestCase):
def test_bzlmod_lockfile(self):
lockfile_path = self.repo_root / "MODULE.bazel.lock"
self.assertTrue(
lockfile_path.exists(),
f"Expected lockfile at {lockfile_path}",
)
original_lockfile = lockfile_path.read_text()
res = self.run_bazel("test", "//...", check=False)
if res.exit_code == 0:
return
# Generate updated lockfile to compare diff and export artifact
self.run_bazel("mod", "deps", "--lockfile_mode=update", check=False)
updated_lockfile = lockfile_path.read_text() if lockfile_path.exists() else ""
undeclared_outputs_dir = os.environ.get("TEST_UNDECLARED_OUTPUTS_DIR")
if undeclared_outputs_dir:
out_dir = pathlib.Path(undeclared_outputs_dir)
(out_dir / "MODULE.bazel.lock").write_text(updated_lockfile)
if original_lockfile != updated_lockfile:
diff_lines = list(
difflib.unified_diff(
original_lockfile.splitlines(keepends=True),
updated_lockfile.splitlines(keepends=True),
fromfile="MODULE.bazel.lock (checked-in)",
tofile="MODULE.bazel.lock (expected/updated)",
)
)
diff_str = "".join(diff_lines)
if undeclared_outputs_dir:
(out_dir / "MODULE.bazel.lock.diff").write_text(diff_str)
msg = (
f"MODULE.bazel.lock is out of date.\n\n"
f"--- DIFF ---\n{diff_str}\n"
f"--- END DIFF ---\n\n"
f"To update the lockfile, run:\n"
f" bazel mod deps --lockfile_mode=update\n"
f"inside tests/integration/bzlmod_lockfile, or copy the updated MODULE.bazel.lock artifact.\n"
)
self.fail(msg)
else:
self.fail(f"bazel test //... failed:\n{res.describe()}")
if __name__ == "__main__":
unittest.main()