blob: 72635b2e51ef67b6c6b2d211c1176edbc0350990 [file] [log] [blame]
# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for scripts/repo_sync_manifest."""
import os
from unittest import mock
from chromite.cbuildbot import manifest_version
from chromite.cbuildbot import repository
from chromite.lib import cros_test_lib
from chromite.scripts import repo_sync_manifest
class RepoSyncManifestTest(cros_test_lib.RunCommandTempDirTestCase):
"""Unit tests for repo_sync_manifest."""
INT_MANIFEST_URL = (
"https://chrome-internal-review.googlesource.com/"
"chromeos/manifest-internal"
)
EXT_MANIFEST_URL = "https://chromium.googlesource.com/chromiumos/manifest"
MV_INT_URL = (
"https://chrome-internal.googlesource.com/chromeos/manifest-versions"
)
MV_EXT_URL = (
"https://chromium.googlesource.com/chromiumos/manifest-versions"
)
def setUp(self) -> None:
self.repo_dir = os.path.join(self.tempdir, "repo")
self.repo_url = os.path.join(self.tempdir, ".repo/repo")
self.preload_src = os.path.join(self.tempdir, "source")
self.git_cache = os.path.join(self.tempdir, "git_cache")
self.manifest = os.path.join(self.tempdir, "manifest.xml")
self.mv_ext = os.path.join(self.tempdir, "mv_ext")
self.mv_int = os.path.join(self.tempdir, "mv_int")
self.manifest_url = "manifest.com"
self.repo_mock = self.PatchObject(
repository, "RepoRepository", autospec=True
)
self.refresh_manifest_mock = self.PatchObject(
manifest_version, "RefreshManifestCheckout", autospec=True
)
self.resolve_buildspec_mock = self.PatchObject(
manifest_version, "ResolveBuildspec", autospec=True
)
self.resolve_version_mock = self.PatchObject(
manifest_version, "ResolveBuildspecVersion", autospec=True
)
def notestHelp(self) -> None:
with self.assertRaises(SystemExit):
repo_sync_manifest.main(
[
"--help",
]
)
def testMinimal(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(detach=True, local_manifest=None),
],
)
def testMinimalExternal(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--external",
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.EXT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(detach=True, local_manifest=None),
],
)
def testMinimalManifestUrl(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--manifest-url",
self.manifest_url,
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.manifest_url,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(detach=True, local_manifest=None),
],
)
def testBranch(self) -> None:
repo_sync_manifest.main(
["--repo-root", self.repo_dir, "--branch", "branch"]
)
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="branch",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(detach=True, local_manifest=None),
],
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
def testBuildSpec(self) -> None:
self.resolve_buildspec_mock.return_value = "resolved_buildspec"
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--buildspec",
"test/spec",
"--manifest-versions-int",
self.mv_int,
]
)
# Ensure manifest-versions interactions are correct.
self.assertEqual(
self.refresh_manifest_mock.mock_calls,
[mock.call(self.mv_int, self.MV_INT_URL)],
)
self.assertEqual(
self.resolve_buildspec_mock.mock_calls,
[mock.call(self.mv_int, "test/spec")],
)
self.assertEqual(self.resolve_version_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(
detach=True, local_manifest="resolved_buildspec"
),
],
)
def testBuildSpecExternal(self) -> None:
self.resolve_buildspec_mock.return_value = "resolved_buildspec"
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--buildspec",
"test/spec",
"--manifest-versions-ext",
self.mv_ext,
"--external",
]
)
# Ensure manifest-versions interactions are correct.
self.assertEqual(
self.refresh_manifest_mock.mock_calls,
[mock.call(self.mv_ext, self.MV_EXT_URL)],
)
self.assertEqual(
self.resolve_buildspec_mock.mock_calls,
[mock.call(self.mv_ext, "test/spec")],
)
self.assertEqual(self.resolve_version_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.EXT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(
detach=True, local_manifest="resolved_buildspec"
),
],
)
def testVersion(self) -> None:
self.resolve_version_mock.return_value = "resolved_buildspec"
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--version",
"1.2.3",
"--manifest-versions-int",
self.mv_int,
]
)
# Ensure manifest-versions interactions are correct.
self.assertEqual(
self.refresh_manifest_mock.mock_calls,
[mock.call(self.mv_int, self.MV_INT_URL)],
)
self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
self.assertEqual(
self.resolve_version_mock.mock_calls,
[mock.call(self.mv_int, "1.2.3")],
)
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(
detach=True, local_manifest="resolved_buildspec"
),
],
)
def testVersionExternal(self) -> None:
self.resolve_version_mock.return_value = "resolved_buildspec"
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--version",
"1.2.3",
"--manifest-versions-ext",
self.mv_ext,
"--external",
]
)
# Ensure manifest-versions interactions are correct.
self.assertEqual(
self.refresh_manifest_mock.mock_calls,
[mock.call(self.mv_ext, self.MV_EXT_URL)],
)
self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
self.assertEqual(
self.resolve_version_mock.mock_calls,
[mock.call(self.mv_ext, "1.2.3")],
)
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.EXT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(
detach=True, local_manifest="resolved_buildspec"
),
],
)
def testBuildSpecNoManifestVersions(self) -> None:
with self.assertRaises(AssertionError):
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--buildspec",
"test/spec",
]
)
with self.assertRaises(AssertionError):
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--buildspec",
"test/spec",
"--external",
]
)
def testLocalManifest(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--manifest-file",
self.manifest,
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups=None,
),
mock.call().Sync(detach=True, local_manifest=self.manifest),
],
)
def testGroups(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--manifest-file",
self.manifest,
"--groups",
"all",
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=None,
repo_url=None,
groups="all",
),
mock.call().Sync(detach=True, local_manifest=self.manifest),
],
)
def testOptimizations(self) -> None:
repo_sync_manifest.main(
[
"--repo-root",
self.repo_dir,
"--copy-repo",
self.preload_src,
"--git-cache",
self.git_cache,
"--repo-url",
self.repo_url,
]
)
# Ensure manifest_versions is not updated.
self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
# Ensure RepoRepository created and Sync'd as expected.
self.assertEqual(
self.repo_mock.mock_calls,
[
mock.call(
directory=self.repo_dir,
manifest_repo_url=self.INT_MANIFEST_URL,
branch="master",
git_cache_dir=self.git_cache,
repo_url=self.repo_url,
groups=None,
),
mock.call().PreLoad(self.preload_src),
mock.call().Sync(detach=True, local_manifest=None),
],
)