blob: 70e3349c9dbd0a81cf638ec33b1b86e1bd846cb8 [file] [log] [blame]
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for workspace stages."""
import os
from pathlib import Path
from unittest import mock
from chromite.cbuildbot import commands
from chromite.cbuildbot.builders import workspace_builders_unittest
from chromite.cbuildbot.stages import generic_stages
from chromite.cbuildbot.stages import generic_stages_unittest
from chromite.cbuildbot.stages import workspace_stages
from chromite.lib import chromeos_version
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import osutils
from chromite.lib import path_util
from chromite.lib import portage_util
from chromite.lib.parser import package_info
# pylint: disable=too-many-ancestors
# pylint: disable=protected-access
class WorkspaceStageBase(
generic_stages_unittest.RunCommandAbstractStageTestCase
):
"""Base class for test suites covering workspace stages."""
# Default version for tests.
OLD_VERSION = "1.2.3"
# Version newer than all "limits" in workspace_stages.
MODERN_VERSION = "15000.0.0"
def setUp(self) -> None:
self.workspace = os.path.join(self.tempdir, "workspace")
# Make it a 'repo' for chroot path conversions.
osutils.SafeMakedirs(os.path.join(self.workspace, ".repo"))
osutils.SafeMakedirs(os.path.join(self.workspace, "chroot"))
self.from_repo_mock = self.PatchObject(
chromeos_version.VersionInfo, "from_repo"
)
self.SetWorkspaceVersion(self.OLD_VERSION)
self.manifest_versions = os.path.join(
self.build_root, "manifest-versions"
)
self.manifest_versions_int = os.path.join(
self.build_root, "manifest-versions-internal"
)
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
def SetWorkspaceVersion(self, version, chrome_branch="1") -> None:
"""Change the "version" of the workspace."""
self.from_repo_mock.return_value = chromeos_version.VersionInfo(
version, chrome_branch=chrome_branch
)
def ConstructStage(self) -> None:
"""Returns an instance of the stage to be tested.
Note: Must be implemented in subclasses.
"""
raise NotImplementedError(
self, "ConstructStage: Implement in your test"
)
class WorkspaceStageBaseTest(WorkspaceStageBase):
"""Test the WorkspaceStageBase."""
def ConstructStage(self):
return workspace_stages.WorkspaceStageBase(
self._run, self.buildstore, build_root=self.workspace
)
def testBuildRoots(self) -> None:
"""Tests that various properties are correctly set."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
stage = self.ConstructStage()
# Verify buildroot directories.
self.assertEqual(self.build_root, stage._orig_root)
self.assertEqual(self.workspace, stage._build_root)
# Verify repo creation.
repo = stage.GetWorkspaceRepo()
self.assertEqual(repo.directory, self.workspace)
# Verify manifest-versions directories.
self.assertEqual(
self.manifest_versions, stage.ext_manifest_versions_path
)
self.assertEqual(
self.manifest_versions_int, stage.int_manifest_versions_path
)
def testVersionInfo(self) -> None:
"""Tests GetWorkspaceVersionInfo."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
stage = self.ConstructStage()
stage.GetWorkspaceVersionInfo()
self.assertEqual(
self.from_repo_mock.call_args_list,
[
mock.call(self.workspace),
],
)
def testAfterLimit(self) -> None:
"""Tests AfterLimit."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
stage = self.ConstructStage()
# 1.2.3
self.SetWorkspaceVersion(self.OLD_VERSION)
LIMITS_BEFORE_OLD = ("1.0.0", "1.0.5", "1.2.2")
LIMITS_AFTER_OLD = ("1.2.3", "1.2.4", "2.0.0")
# The workspace is after these limits.
for l in LIMITS_BEFORE_OLD:
self.assertTrue(stage.AfterLimit(l))
# The workspace is before these limits.
for l in LIMITS_AFTER_OLD:
self.assertFalse(stage.AfterLimit(l))
# 11000.0.0
self.SetWorkspaceVersion(self.MODERN_VERSION)
# The workspace is after ALL of these limits.
for l in LIMITS_BEFORE_OLD + LIMITS_AFTER_OLD:
self.assertTrue(stage.AfterLimit(l))
class SyncStageTest(WorkspaceStageBase):
"""Test the SyncStage."""
# Our API here is not great when it comes to kwargs passing.
def ConstructStage(self, **kwargs): # pylint: disable=arguments-differ
return workspace_stages.SyncStage(self._run, self.buildstore, **kwargs)
def testDefaults(self) -> None:
"""Tests sync command used by default."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
self.RunStage(build_root="/root")
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
constants.CHROMITE_DIR / "scripts" / "repo_sync_manifest",
"--repo-root",
"/root",
"--manifest-versions-int",
self.manifest_versions_int,
"--manifest-versions-ext",
self.manifest_versions,
]
)
def testBranch(self) -> None:
"""Tests sync command used for branch."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
self.RunStage(build_root="/root", branch="branch")
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
constants.CHROMITE_DIR / "scripts" / "repo_sync_manifest",
"--repo-root",
"/root",
"--manifest-versions-int",
self.manifest_versions_int,
"--manifest-versions-ext",
self.manifest_versions,
"--branch",
"branch",
]
)
def testVersion(self) -> None:
"""Tests sync command used for version."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
self.RunStage(build_root="/root", version="version")
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
constants.CHROMITE_DIR / "scripts" / "repo_sync_manifest",
"--repo-root",
"/root",
"--manifest-versions-int",
self.manifest_versions_int,
"--manifest-versions-ext",
self.manifest_versions,
"--version",
"version",
]
)
def testPatches(self) -> None:
"""Tests sync command used with patches."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
patchA = mock.Mock()
patchA.url = "urlA"
patchA.gerrit_number_str = "1"
patchB = mock.Mock()
patchB.url = "urlB"
patchB.gerrit_number_str = "2"
self.RunStage(build_root="/root", patch_pool=[patchA, patchB])
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
constants.CHROMITE_DIR / "scripts" / "repo_sync_manifest",
"--repo-root",
"/root",
"--manifest-versions-int",
self.manifest_versions_int,
"--manifest-versions-ext",
self.manifest_versions,
"--gerrit-patches",
"1",
"--gerrit-patches",
"2",
]
)
def testMax(self) -> None:
"""Tests sync command with as many options as possible."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
patchA = mock.Mock()
patchA.url = "urlA"
patchA.gerrit_number_str = "1"
patchB = mock.Mock()
patchB.url = "urlB"
patchB.gerrit_number_str = "2"
self.RunStage(
build_root="/root",
branch="branch",
patch_pool=[patchA, patchB],
copy_repo="/source",
)
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
constants.CHROMITE_DIR / "scripts" / "repo_sync_manifest",
"--repo-root",
"/root",
"--manifest-versions-int",
self.manifest_versions_int,
"--manifest-versions-ext",
self.manifest_versions,
"--branch",
"branch",
"--gerrit-patches",
"1",
"--gerrit-patches",
"2",
"--copy-repo",
"/source",
]
)
class WorkspaceSyncStageTest(WorkspaceStageBase):
"""Test the WorkspaceSyncStage."""
def setUp(self) -> None:
self.sync_stage_mock = self.PatchObject(workspace_stages, "SyncStage")
def ConstructStage(self):
return workspace_stages.WorkspaceSyncStage(
self._run, self.buildstore, build_root=self.workspace
)
def SyncCallToPathNumbers(self, mock_call):
"""Extract patch_pool from a mock call, and convert to gerrit int."""
return [p.gerrit_number_str for p in mock_call[1]["patch_pool"]]
def testBasic(self) -> None:
"""Test invoking child syncs in standard case."""
self._Prepare(
"buildspec",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
self.RunStage()
self.assertEqual(
self.sync_stage_mock.call_args_list,
[
mock.call(
self._run,
self.buildstore,
patch_pool=mock.ANY,
suffix=" [Infra ooga_booga]",
external=True,
branch="ooga_booga",
build_root=self.build_root,
),
mock.call(
self._run,
self.buildstore,
patch_pool=mock.ANY,
suffix=" [test-branch]",
external=False,
branch="test-branch",
version=None,
build_root=self.workspace,
copy_repo=self.build_root,
),
],
)
self.assertEqual(
self.SyncCallToPathNumbers(self.sync_stage_mock.call_args_list[0]),
[],
)
self.assertEqual(
self.SyncCallToPathNumbers(self.sync_stage_mock.call_args_list[1]),
[],
)
# TODO(dgarrett): Enable. Failing in _Prepare, and I don't understand why.
def notestPatches(self) -> None:
"""Test invoking child syncs with patches to apply."""
self._Prepare(
cmd_args=[
"-r",
self.build_root,
"--buildbot",
"--noprebuilts",
"--branch",
self.TARGET_MANIFEST_BRANCH,
"-g",
"1",
"-g",
"2",
"buildspec",
],
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
self.RunStage()
self.assertEqual(
self.sync_stage_mock.call_args_list,
[
mock.call(
self._run,
self.buildstore,
patch_pool=mock.ANY,
suffix=" [Infra]",
external=True,
branch="master",
build_root=self.build_root,
),
mock.call(
self._run,
self.buildstore,
patch_pool=mock.ANY,
suffix=" [test-branch]",
external=True,
branch="test-branch",
version=None,
build_root=self.workspace,
copy_repo=self.build_root,
),
],
)
self.assertEqual(
self.SyncCallToPathNumbers(self.sync_stage_mock.call_args_list[0]),
[],
)
self.assertEqual(
self.SyncCallToPathNumbers(self.sync_stage_mock.call_args_list[1]),
[],
)
class WorkspaceSyncChromeStageTest(WorkspaceStageBase):
"""Test the WorkspaceSyncChromeStage."""
def setUp(self) -> None:
pkg_info = package_info.PackageInfo(version="0.0.1")
self.mock_best_visible = self.PatchObject(
portage_util, "PortageqBestVisible", return_value=pkg_info
)
def ConstructStage(self):
self._run.options.chrome_preload_dir = "/preload/chrome_cache"
return workspace_stages.WorkspaceSyncChromeStage(
self._run, self.buildstore, build_root=self.workspace
)
def testNormal(self) -> None:
"""Test SyncChrome with normal usage."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--chrome_root", "/chrome"],
)
self.RunStage()
self.assertEqual(
self.mock_best_visible.call_args_list,
[mock.call("chromeos-base/chromeos-chrome", cwd=self.workspace)],
)
self.assertEqual(
self.rc.call_args_list,
[
mock.call(
[
os.path.join(
self.build_root, "chromite/bin/sync_chrome"
),
"--reset",
"--internal",
"--tag",
"0.0.1",
"--git_cache_dir",
mock.ANY,
"/chrome",
],
cwd=self.workspace,
),
],
)
# TODO(dgarret): Test WorkspaceUprevAndPublishStage
# TODO(dgarret): Test WorkspacePublishBuildspecStage
# TODO(dgarret): Test WorkspaceScheduleChildrenStage
class WorkspaceInitSDKStageTest(WorkspaceStageBase):
"""Test the WorkspaceInitSDKStage."""
def ConstructStage(self):
return workspace_stages.WorkspaceInitSDKStage(
self._run, self.buildstore, build_root=self.workspace
)
def testInitSDK(self) -> None:
"""Test InitSDK old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
os.path.join(self.workspace, "chromite", "bin", "cros_sdk"),
"--create",
"--cache-dir",
"/cache",
],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
def testInitSDKWithChrome(self) -> None:
"""Test InitSDK old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
os.path.join(self.workspace, "chromite", "bin", "cros_sdk"),
"--create",
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
"CHROME_ORIGIN": "LOCAL_SOURCE",
},
cwd=self.workspace,
)
class WorkspaceLinkMountPathsStageTest(WorkspaceStageBase):
"""Test the WorkspaceLinkMountPathsStage."""
def ConstructStage(self) -> workspace_stages.WorkspaceLinkMountPathsStage:
"""Set up a new stage to run."""
return workspace_stages.WorkspaceLinkMountPathsStage(
self._run, self.buildstore, build_root=self.workspace
)
def testRunStage(self) -> None:
"""Make sure the stage is at least runnable."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
)
with self.PatchObject(Path, "exists", return_value=True):
self.RunStage()
# Assert that some expected things happen.
for path in (
Path(self.workspace) / "out",
Path(self.workspace) / "out" / "tmp",
Path(self.workspace) / "out" / "build",
Path(self.workspace) / "out" / "home",
Path(self.workspace) / "chroot" / "tmp",
Path(self.workspace) / "chroot" / "build",
Path(self.workspace) / "chroot" / "home",
):
self.assertTrue(path.exists())
for touch_file in ("/tmp/find_me", "/home/find_me", "/build/find_me"):
self.rc.assertCommandCalled(
["sudo", "--", "touch", touch_file],
enter_chroot=True,
cwd=self.workspace,
)
class WorkspaceUpdateSDKStageTest(WorkspaceStageBase):
"""Test the WorkspaceUpdateSDKStage."""
def ConstructStage(self):
return workspace_stages.WorkspaceUpdateSDKStage(
self._run, self.buildstore, build_root=self.workspace
)
def testUpdateSDK(self) -> None:
"""Test UpdateSDK old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
["./update_chroot"],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal",
"FEATURES": " -separatedebug splitdebug",
},
cwd=self.workspace,
)
def testUpdateSDKWithChrome(self) -> None:
"""Test UpdateSDK old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
["./update_chroot"],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"CHROME_ORIGIN": "LOCAL_SOURCE",
"FEATURES": " -separatedebug splitdebug",
"USE": "-cros-debug chrome_internal",
},
cwd=self.workspace,
)
class WorkspaceSetupBoardStageTest(WorkspaceStageBase):
"""Test the WorkspaceSetupBoardStage."""
def setUp(self) -> None:
# Prevent the setup_board tempdir path from being translated because it
# ends up raising an error when that path can't be found in the chroot.
self.PatchObject(
path_util, "ToChrootPath", side_effect=lambda x, **kwargs: x
)
self.setup_board = os.path.join(
self.workspace, constants.CHROMITE_BIN_SUBDIR, "setup_board"
)
def ConstructStage(self):
return workspace_stages.WorkspaceSetupBoardStage(
self._run, self.buildstore, build_root=self.workspace, board="board"
)
def testSetupBoard(self) -> None:
"""Test setup_board old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
"./setup_board",
"--board=board",
"--accept_licenses=@CHROMEOS",
"--skip_chroot_upgrade",
"--nousepkg",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
def testSetupBoardModern(self) -> None:
"""Test setup_board modern workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.SetWorkspaceVersion(self.MODERN_VERSION)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
self.setup_board,
"--board=board",
"--accept-licenses=@CHROMEOS",
"--skip-chroot-upgrade",
"--nousepkg",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
def testSetupBoardWithChrome(self) -> None:
"""Test setup_board old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.SetWorkspaceVersion(self.OLD_VERSION)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
"./setup_board",
"--board=board",
"--accept_licenses=@CHROMEOS",
"--skip_chroot_upgrade",
"--nousepkg",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache", "--chrome_root", "/chrome"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
"CHROME_ORIGIN": "LOCAL_SOURCE",
},
cwd=self.workspace,
)
def testSetupBoardWithChromeModern(self) -> None:
"""Test setup_board modern workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.SetWorkspaceVersion(self.MODERN_VERSION)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
self.setup_board,
"--board=board",
"--accept-licenses=@CHROMEOS",
"--skip-chroot-upgrade",
"--nousepkg",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache", "--chrome_root", "/chrome"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
"CHROME_ORIGIN": "LOCAL_SOURCE",
},
cwd=self.workspace,
)
class WorkspaceBuildPackagesStageTest(WorkspaceStageBase):
"""Test the WorkspaceBuildPackagesStage."""
def ConstructStage(self):
return workspace_stages.WorkspaceBuildPackagesStage(
self._run, self.buildstore, build_root=self.workspace, board="board"
)
def testFactoryBuildPackages(self) -> None:
"""Test building factory for an old workspace version."""
self.SetWorkspaceVersion(self.MODERN_VERSION)
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
str(constants.CHROMITE_BIN_DIR / "build_packages"),
"--board=board",
"--accept-licenses=@CHROMEOS",
"--withdebugsymbols",
"--skip-chroot-upgrade",
"--no-usepkg",
"virtual/target-os",
"virtual/target-os-dev",
"virtual/target-os-test",
"virtual/target-os-factory",
"virtual/target-os-factory-shim",
"chromeos-base/autotest-all",
],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
"CHROME_ORIGIN": "LOCAL_SOURCE",
},
chroot_args=["--cache-dir", "/cache", "--chrome_root", "/chrome"],
enter_chroot=True,
cwd=self.workspace,
)
def testFactoryBuildPackagesLegacy(self) -> None:
"""Test building factory for an old workspace version."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=[
"--cache-dir",
"/cache",
"--chrome_root",
"/chrome",
],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
self.rc.assertCommandCalled(
[
"./build_packages",
"--board=board",
"--accept_licenses=@CHROMEOS",
"--withdebugsymbols",
"--skip_chroot_upgrade",
"--nousepkg",
"virtual/target-os",
"virtual/target-os-dev",
"virtual/target-os-test",
"virtual/target-os-factory",
"virtual/target-os-factory-shim",
"chromeos-base/autotest-all",
],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
"CHROME_ORIGIN": "LOCAL_SOURCE",
},
chroot_args=["--cache-dir", "/cache", "--chrome_root", "/chrome"],
enter_chroot=True,
cwd=self.workspace,
)
class WorkspaceUnitTestStageTest(WorkspaceStageBase):
"""Test the workspace_stages classes."""
def ConstructStage(self):
return workspace_stages.WorkspaceUnitTestStage(
self._run, self.buildstore, build_root=self.workspace, board="board"
)
def testFactoryNew(self) -> None:
self.SetWorkspaceVersion(self.MODERN_VERSION)
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(
self.rc.call_args_list,
[
mock.call(
[
"/mnt/host/source/chromite/bin/cros_run_unit_tests",
"--board=board",
"--jobs=10",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={"USE": "-cros-debug chrome_internal thinlto"},
cwd=self.workspace,
),
],
)
class WorkspaceBuildImageStageTest(WorkspaceStageBase):
"""Test the workspace_stages classes."""
def ConstructStage(self):
return workspace_stages.WorkspaceBuildImageStage(
self._run, self.buildstore, build_root=self.workspace, board="board"
)
def testFactoryOld(self) -> None:
self.SetWorkspaceVersion(self.OLD_VERSION)
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
# Ensure no --builderpath
self.rc.assertCommandCalled(
[
"./build_image",
"--board",
"board",
"--replace",
"--version",
"R1-1.2.3",
"test",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
def testFactoryModern(self) -> None:
self.SetWorkspaceVersion(self.MODERN_VERSION)
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
self.RunStage()
self.assertEqual(self.rc.call_count, 1)
# Ensure has --builderpath
self.rc.assertCommandCalled(
[
"./build_image",
"--board",
"board",
"--replace",
"--version",
"R1-%s" % self.MODERN_VERSION,
"--noeclean",
"--builder_path",
"test-factorybranch/R1-%s" % self.MODERN_VERSION,
"test",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
class WorkspaceDebugSymbolsStageTest(WorkspaceStageBase):
"""Test the workspace_stages classes."""
def setUp(self) -> None:
self.tarball_mock = self.PatchObject(
commands,
"GenerateDebugTarball",
side_effect=("/debug.tgz", "/breakpad.tgz"),
)
self.archive_mock = self.PatchObject(
generic_stages.ArchivingStageMixin, "UploadArtifact"
)
def ConstructStage(self):
# Version for the infra branch.
self._run.attrs.version_info = chromeos_version.VersionInfo(
"10.0.0", chrome_branch="10"
)
self._run.attrs.release_tag = "infra-tag"
return workspace_stages.WorkspaceDebugSymbolsStage(
self._run, self.buildstore, build_root=self.workspace, board="board"
)
def testFactory(self) -> None:
"""Test with a generic factory build config."""
self._Prepare(
"test-factorybranch",
site_config=workspace_builders_unittest.CreateMockSiteConfig(),
extra_cmd_args=["--cache-dir", "/cache"],
)
pkg_dep_patch = self.PatchObject(
portage_util, "GetPackageDependencies", return_value=[]
)
self.RunStage()
self.rc.assertCommandCalled(
[
"/mnt/host/source/chromite/bin/cros_generate_breakpad_symbols",
"--board=board",
"--jobs",
mock.ANY,
"--exclude-dir=firmware",
],
enter_chroot=True,
chroot_args=["--cache-dir", "/cache"],
extra_env={
"USE": "-cros-debug chrome_internal thinlto",
},
cwd=self.workspace,
)
# Verify set_empty_root is True when using an old version.
pkg_dep_patch.assert_called_with(
mock.ANY, board=mock.ANY, buildroot=mock.ANY, set_empty_root=True
)
self.assertEqual(
self.tarball_mock.call_args_list,
[
mock.call(
buildroot=self.workspace,
board="board",
archive_path=os.path.join(
self.build_root,
"buildbot_archive/test-factorybranch/R10-infra-tag",
),
gdb_symbols=True,
archive_name="debug.tgz",
chroot_compression=False,
),
mock.call(
buildroot=self.workspace,
board="board",
archive_path=os.path.join(
self.build_root,
"buildbot_archive/test-factorybranch/R10-infra-tag",
),
gdb_symbols=False,
archive_name="debug_breakpad.tar.xz",
chroot_compression=False,
),
],
)
self.assertEqual(
self.archive_mock.call_args_list,
[
mock.call("/debug.tgz", archive=False),
mock.call("/breakpad.tgz", archive=False),
],
)