blob: 302d712912e082cdd90c895acc7e058e74b2b44c [file] [log] [blame]
# Copyright 2015 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.
"""This module tests the brillo test command."""
from __future__ import print_function
from chromite.cli import command_unittest
from chromite.cli.brillo import brillo_test
from chromite.lib import chroot_util
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import portage_util
from chromite.lib import workon_helper
class FakeWorkonHelper(object):
"""Fakes the workon helper module."""
def __init__(self, packages):
self._packages = packages
def ListAtoms(self, *_args, **_kwargs):
"""Returns the list of packages available."""
return self._packages
class MockTestCommand(command_unittest.MockCommand):
"""Mock out the `brillo test` command."""
TARGET = 'chromite.cli.brillo.brillo_test.TestCommand'
TARGET_CLASS = brillo_test.TestCommand
COMMAND = 'test'
class TestCommandTest(cros_test_lib.WorkspaceTestCase):
"""Test the flow of TestCommand.Run()."""
_PACKAGES_WITH_TESTS = set(['chromeos-base/shill',
'chromeos-base/metrics'])
_PACKAGES_WITHOUT_TESTS = set(['brillo-base/foo'])
def setUp(self):
"""Patches objects."""
self.cmd_mock = None
self.run_unittests_mock = None
self.CreateWorkspace()
self.blueprint = self.CreateBlueprint()
def SetupCommandMock(self, cmd_args):
"""Sets up the MockTestCommand."""
self.cmd_mock = MockTestCommand(cmd_args)
self.StartPatcher(self.cmd_mock)
fake_workon = FakeWorkonHelper(
list(self._PACKAGES_WITH_TESTS | self._PACKAGES_WITHOUT_TESTS))
self.PatchObject(workon_helper, 'WorkonHelper', return_value=fake_workon)
self.PatchObject(portage_util, 'PackagesWithTest',
side_effect=self._PackagesWithTests)
self.run_unittests_mock = self.PatchObject(chroot_util, 'RunUnittests')
self.PatchObject(cros_build_lib, 'IsInsideChroot', return_value=True)
def _PackagesWithTests(self, _sysroot, packages):
"""Fakes portage_util.PackagesWithTests."""
return packages & self._PACKAGES_WITH_TESTS
def RunCommandMock(self, *args, **kwargs):
"""Sets up and runs the MockTestCommand."""
self.SetupCommandMock(*args, **kwargs)
self.cmd_mock.inst.Run()
def testMatchingPackages(self):
"""Tests that we match the correct packages."""
self.SetupCommandMock([self.blueprint.path, 'foo'])
# Getting an unknown package.
unknown = set(['chromeos-base/bar'])
cmd = self.cmd_mock.inst
# pylint: disable=protected-access
self.assertEqual((set(), unknown),
cmd._GetMatchingPackages(unknown))
# Only the names are specified.
name_only = set(['foo', 'metrics'])
self.assertEqual((name_only, set()),
cmd._GetMatchingPackages(name_only))
# The full category/package_name is specified.
full_name = set(['chromeos-base/shill'])
self.assertEqual((full_name, set()),
cmd._GetMatchingPackages(full_name))
# Both known and unknown packages are passed.
self.assertEqual((name_only, unknown),
cmd._GetMatchingPackages(name_only | unknown))
def testExistingPackage(self):
"""Tests that RunUnittests is called when the package is valid."""
self.RunCommandMock([self.blueprint.path, 'chromeos-base/shill'])
self.assertEqual(1, self.run_unittests_mock.call_count)
def testUnknownPackage(self):
"""Tests that we don't do anything when the package is not valid."""
self.RunCommandMock([self.blueprint.path, 'brillo-base/foo'])
self.assertEqual(0, self.run_unittests_mock.call_count)