123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #!/usr/bin/env python3
- # Copyright 2022 The ChromiumOS Authors
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- import os
- from pathlib import Path
- import shutil
- import sys
- import tempfile
- import unittest
- sys.path.append(os.path.dirname(sys.path[0]))
- from impl.common import CROSVM_ROOT, cmd, quoted, TOOLS_ROOT
- git = cmd("git")
- cl = cmd(f"{TOOLS_ROOT}/cl")
- class ClTests(unittest.TestCase):
- test_root: Path
- def setUp(self):
- self.test_root = Path(tempfile.mkdtemp())
- os.chdir(self.test_root)
- git("clone", CROSVM_ROOT, ".").fg(quiet=True)
- # Set up user name (it's not set up in Luci)
- git("config user.name Nobody").fg(quiet=True)
- git("config user.email nobody@chromium.org").fg(quiet=True)
- # Check out a detached head and delete all branches.
- git("checkout -d HEAD").fg(quiet=True)
- branch_list = git("branch").lines()
- for branch in branch_list:
- if not branch.startswith("*"):
- git("branch -D", branch).fg(quiet=True)
- # Set up the origin for testing uploads and rebases.
- git("remote set-url origin https://chromium.googlesource.com/crosvm/crosvm").fg(quiet=True)
- git("fetch -q origin main").fg(quiet=True)
- git("fetch -q origin chromeos").fg(quiet=True)
- def tearDown(self) -> None:
- shutil.rmtree(self.test_root)
- def create_test_commit(self, message: str, branch: str, upstream: str = "origin/main"):
- git("checkout -b", branch, "--track", upstream).fg(quiet=True)
- with Path("Cargo.toml").open("a") as file:
- file.write("# Foo")
- git("commit -a -m", quoted(message)).fg(quiet=True)
- return git("rev-parse HEAD").stdout()
- def test_cl_upload(self):
- sha = self.create_test_commit("Test Commit", "foo")
- expected = f"""\
- Uploading to origin/main:
- {sha} Test Commit
- Not running: git push origin HEAD:refs/for/main%"""
- self.assertEqual(cl("upload --dry-run").stdout(), expected)
- def test_cl_status(self):
- self.create_test_commit("Test Commit", "foo")
- expected = """\
- Branch foo tracking origin/main
- NOT_UPLOADED Test Commit"""
- self.assertEqual(cl("status").stdout(), expected)
- def test_cl_rebase(self):
- self.create_test_commit("Test Commit", "foo", "origin/chromeos")
- cl("rebase").fg()
- # Expect foo-upstream to be tracking `main` and have the same commit
- self.assertEqual(git("rev-parse --abbrev-ref foo-upstream@{u}").stdout(), "origin/main")
- self.assertEqual(
- git("log -1 --format=%s foo").stdout(),
- git("log -1 --format=%s foo-upstream").stdout(),
- )
- def test_cl_rebase_with_existing_branch(self):
- previous_sha = self.create_test_commit("Previous commit", "foo-upstream ")
- self.create_test_commit("Test Commit", "foo", "origin/chromeos")
- message = cl("rebase").stdout()
- # `cl rebase` will overwrite the branch, but we should print the previous sha in case
- # the user needs to recover it.
- self.assertIn(previous_sha, message)
- # Expect foo-upstream to be tracking `main` and have the same commit. The previous commit
- # would be dropped.
- self.assertEqual(git("rev-parse --abbrev-ref foo-upstream@{u}").stdout(), "origin/main")
- self.assertEqual(
- git("log -1 --format=%s foo").stdout(),
- git("log -1 --format=%s foo-upstream").stdout(),
- )
- def test_prune(self):
- self.create_test_commit("Test Commit", "foo")
- git("branch foo-no-commit origin/main").fg()
- cl("prune --force").fg()
- # `foo` has unsubmitted commits, it should still be there.
- self.assertTrue(git("rev-parse foo").success())
- # `foo-no-commit` has no commits, it should have been pruned.
- self.assertFalse(git("rev-parse foo-no-commit").success())
- if __name__ == "__main__":
- unittest.main(warnings="ignore")
|