blob: daed07986f7fccd6e8c01fd6f5229dcd1e46f2e7 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for prebuilts."""
from __future__ import print_function
import os
import sys
import mock
from chromite.cbuildbot import cbuildbot_unittest
from chromite.lib import constants
from chromite.cbuildbot import prebuilts
from chromite.cbuildbot.stages import generic_stages_unittest
from chromite.lib import cros_test_lib
from chromite.lib import osutils
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
DEFAULT_CHROME_BRANCH = '27'
# pylint: disable=protected-access
class PrebuiltTest(cros_test_lib.RunCommandTempDirTestCase):
"""Test general cbuildbot command methods."""
def setUp(self):
self._board = 'test-board'
self._buildroot = self.tempdir
self._overlays = ['%s/src/third_party/chromiumos-overlay' % self._buildroot]
self._chroot = os.path.join(self._buildroot, 'chroot')
os.makedirs(os.path.join(self._buildroot, '.repo'))
def testSdkPrebuilts(self):
"""Test UploadPrebuilts for SDK builds."""
# A magical date for a magical time.
version = '1994.04.02.000000'
# Fake out toolchains overlay tarballs.
tarball_dir = os.path.join(self._buildroot, constants.DEFAULT_CHROOT_DIR,
constants.SDK_OVERLAYS_OUTPUT)
osutils.SafeMakedirs(tarball_dir)
toolchain_overlay_tarball_args = []
# Sample toolchain combos, corresponding to x86-alex and daisy.
toolchain_combos = (
('i686-pc-linux-gnu',),
('armv7a-cros-linux-gnueabi', 'arm-none-eabi'),
)
for toolchains in ['-'.join(sorted(combo)) for combo in toolchain_combos]:
tarball = 'built-sdk-overlay-toolchains-%s.tar.xz' % toolchains
tarball_path = os.path.join(tarball_dir, tarball)
osutils.Touch(tarball_path)
tarball_arg = '%s:%s' % (toolchains, tarball_path)
toolchain_overlay_tarball_args.append(['--toolchains-overlay-tarball',
tarball_arg])
# Fake out toolchain tarballs.
tarball_dir = os.path.join(self._buildroot, constants.DEFAULT_CHROOT_DIR,
constants.SDK_TOOLCHAINS_OUTPUT)
osutils.SafeMakedirs(tarball_dir)
toolchain_tarball_args = []
for tarball_base in ('i686', 'arm-none-eabi'):
tarball = '%s.tar.xz' % tarball_base
tarball_path = os.path.join(tarball_dir, tarball)
osutils.Touch(tarball_path)
tarball_arg = '%s:%s' % (tarball_base, tarball_path)
toolchain_tarball_args.append(['--toolchain-tarball', tarball_arg])
prebuilts.UploadPrebuilts(constants.CHROOT_BUILDER_TYPE, False,
buildroot=self._buildroot, board=self._board,
version=version)
self.assertCommandContains(
[constants.CHROOT_BUILDER_TYPE, 'gs://chromeos-prebuilt'])
self.assertCommandContains([
'--toolchains-overlay-upload-path',
'1994/04/cros-sdk-overlay-toolchains-%%(toolchains)s-'
'%(version)s.tar.xz'])
self.assertCommandContains(['--toolchain-upload-path',
'1994/04/%%(target)s-%(version)s.tar.xz'])
for args in toolchain_overlay_tarball_args + toolchain_tarball_args:
self.assertCommandContains(args)
self.assertCommandContains(['--set-version', version])
self.assertCommandContains(['--prepackaged-tarball',
os.path.join(self._buildroot,
'built-sdk.tar.xz')])
def testDevInstallerPrebuilts(self, packages=('package1', 'package2')):
"""Test UploadDevInstallerPrebuilts."""
args = ['gs://dontcare', 'some_path_to_key', 'https://my_test/location']
with mock.patch.object(prebuilts, '_AddPackagesForPrebuilt',
return_value=packages):
prebuilts.UploadDevInstallerPrebuilts(*args, buildroot=self._buildroot,
board=self._board)
self.assertCommandContains(args[2:] + args[0:2])
def testAddPackagesForPrebuilt(self):
"""Test AddPackagesForPrebuilt."""
self.assertEqual(prebuilts._AddPackagesForPrebuilt('/'), None)
data = """# comment!
cat/pkg-0
ca-t2/pkg2-123
ca-t3/pk-g4-4.0.1-r333
"""
pkgs = [
'cat/pkg',
'ca-t2/pkg2',
'ca-t3/pk-g4',
]
cmds = ['--packages=' + x for x in pkgs]
f = os.path.join(self.tempdir, 'package.provided')
osutils.WriteFile(f, data)
self.assertEqual(prebuilts._AddPackagesForPrebuilt(f), cmds)
def testMissingDevInstallerFile(self):
"""Test that we raise an exception when the installer file is missing."""
self.assertRaises(prebuilts.PackageFileMissing,
self.testDevInstallerPrebuilts, packages=())
# pylint: disable=too-many-ancestors
class BinhostConfWriterTest(
generic_stages_unittest.RunCommandAbstractStageTestCase,
cbuildbot_unittest.SimpleBuilderTestCase):
"""Tests for the BinhostConfWriter class."""
cmd = 'upload_prebuilts'
RELEASE_TAG = '1234.5.6'
VERSION = 'R%s-%s' % (DEFAULT_CHROME_BRANCH, RELEASE_TAG)
# Our API here is not great when it comes to kwargs passing.
def _Prepare(self, bot_id=None, **kwargs): # pylint: disable=arguments-differ
super(BinhostConfWriterTest, self)._Prepare(bot_id, **kwargs)
self.cmd = os.path.join(self.build_root, constants.CHROMITE_BIN_SUBDIR,
'upload_prebuilts')
self._run.options.prebuilts = True
def _Run(self, build_config):
"""Prepare and run a BinhostConfWriter.
Args:
build_config: Name of build config to run for.
"""
self._Prepare(build_config)
confwriter = prebuilts.BinhostConfWriter(self._run)
confwriter.Perform()
def ConstructStage(self):
pass
def _VerifyResults(self, public_slave_boards=(), private_slave_boards=()):
"""Verify that the expected prebuilt commands were run.
Do various assertions on the two RunCommands that were run by stage.
There should be one private (--private) and one public (default) run.
Args:
public_slave_boards: List of public slave boards.
private_slave_boards: List of private slave boards.
"""
# TODO(mtennant): Add functionality in partial_mock to support more flexible
# asserting. For example here, asserting that '--sync-host' appears in
# the command that did not include '--public'.
# Some args are expected for any public run.
if public_slave_boards:
# It would be nice to confirm that --private is not in command, but note
# that --sync-host should not appear in the --private command.
cmd = [self.cmd, '--sync-binhost-conf', '--sync-host']
self.assertCommandContains(cmd, expected=True)
# Some args are expected for any private run.
if private_slave_boards:
cmd = [self.cmd, '--sync-binhost-conf', '--private']
self.assertCommandContains(cmd, expected=True)
# Assert public slave boards are mentioned in public run.
for board in public_slave_boards:
# This check does not actually confirm that this board was in the public
# run rather than the private run, unfortunately.
cmd = [self.cmd, '--slave-board', board]
self.assertCommandContains(cmd, expected=True)
# Assert private slave boards are mentioned in private run.
for board in private_slave_boards:
cmd = [self.cmd, '--slave-board', board, '--private']
self.assertCommandContains(cmd, expected=True)
# We expect --set-version so long as build config has manifest_version=True.
self.assertCommandContains([self.cmd, '--set-version', self.VERSION],
expected=self._run.config.manifest_version)