crosvm/tools/tests/cl_tests.py
Dennis Kempin a7b5a94480 tools/cl upload: Add a few convenience flags
--try: set CQ+1
--autosubmit: Set Auto-Submit and CQ+1
--submit: set CQ+2
--reviewer: Set a username as reviewer

BUG=None
TEST=This CL was uploaded with:
tools/cl upload --autosubmit -r dverkamp

Change-Id: I1ec9834d2f5d365eaa500e8e5915c77a4f066c6b
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/3997873
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Auto-Submit: Dennis Kempin <denniskempin@google.com>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
2022-11-02 20:20:47 +00:00

114 lines
3.9 KiB
Python

#!/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()