blob: a3fecfcd35d21ee1012ffe01a5f15f144d2b469b [file] [log] [blame] [edit]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 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.
"""Unit tests for platform2.py"""
from __future__ import print_function
import os
import sys
import mock
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)),
'..', '..', '..'))
# pylint: disable=wrong-import-position
import platform2
from chromite.lib import cros_test_lib
# pylint: enable=wrong-import-position
PLATFORM_SUBDIR = 'platform'
SYSROOT = '/'
TARGET_PREFIX = '//%s:' % PLATFORM_SUBDIR
class Platform2Configure(cros_test_lib.TestCase):
"""A base class of Platform2 unittest."""
@staticmethod
def _CreateTestPlatform2():
p2 = platform2.Platform2()
p2.platform_subdir = PLATFORM_SUBDIR
p2.sysroot = SYSROOT
return p2
def _RunWithDesc(self, func, gn_description):
"""Runs Platform2.|func| with fake |gn_description|."""
p2 = self._CreateTestPlatform2()
with mock.patch('platform2.Platform2.gn_desc', return_value=gn_description):
return getattr(p2, func)()
class Platform2ConfigureTest(Platform2Configure):
"""Tests Platform2.configure_test()."""
@staticmethod
def _CreateTestData(run_test=True, test_config=None):
"""Generates a template of test data."""
# It emulates a data that is generated by the templates in
# //common-mk/BUILDCONFIG.gn for this BUILD.gn rule example
#
# group("all") {
# deps = ["//platform:test"]
# }
#
# executable("test") {
# output_name = "output"
#
# run_test = $run_test
# test_config = $test_config
#
# # some required variables
# }
if test_config is None:
test_config = {}
return {
TARGET_PREFIX + 'all': {
'deps': [
TARGET_PREFIX + 'test',
],
},
TARGET_PREFIX + 'test': {
'metadata': {
'_run_test': [run_test],
'_test_config': [test_config],
},
'outputs': ['output'],
},
}
def _CheckConfigureTest(self, gn_description, expected):
"""Checks configure_test output |expected| outputs with |gn_description|."""
ret = self._RunWithDesc('configure_test', gn_description)
self.assertEqual(ret, expected)
@staticmethod
def _OutputTemplate(options):
"""Create Output Template.
Add platform2_test.py and some required options to the beginning.
"""
platform_tooldir = os.path.dirname(os.path.abspath(__file__))
p2_test_py = os.path.join(platform_tooldir, 'platform2_test.py')
prefix = [p2_test_py, '--action=run', '--sysroot=%s' % SYSROOT]
return prefix + options
def testMultipleTest(self):
"""Verify it can execute multiple tests."""
targets = [TARGET_PREFIX + 'test%s' % i for i in range(10)]
desc_data = {
TARGET_PREFIX + 'all': {
'deps': targets,
},
}
for target in targets:
desc_data[target] = {
'metadata': {
'_run_test': [True],
},
'outputs': [
'test-%s' % target,
],
}
self._CheckConfigureTest(
desc_data,
[self._OutputTemplate(['--', 'test-%s' % target])
for target in targets])
def testRunTest(self):
"""Verify it executes test only when run_test is true."""
self._CheckConfigureTest(
self._CreateTestData(run_test=True),
[self._OutputTemplate(['--', 'output'])])
self._CheckConfigureTest(
self._CreateTestData(run_test=False),
[])
def testBooleanConfigs(self):
"""Verify it converts boolean configs to flag options."""
self._CheckConfigureTest(
self._CreateTestData(test_config={
'run_as_root': True,
}),
[self._OutputTemplate(['--run_as_root', '--', 'output'])])
self._CheckConfigureTest(
self._CreateTestData(test_config={
'run_as_root': False,
}),
[self._OutputTemplate(['--', 'output'])])
def testStringConfigs(self):
"""Verify it converts string configs to not-flag options."""
self._CheckConfigureTest(
self._CreateTestData(test_config={
'gtest_filter': '-*.RunAsRoot',
}),
[self._OutputTemplate(['--gtest_filter=-*.RunAsRoot', '--', 'output'])])
class Platform2ConfigureInstall(Platform2Configure):
"""Tests Platform2.configure_install()."""
@staticmethod
def _CreateTestData(sources=None, install_path=None, outputs=None,
symlinks=None, recursive=False, options=None,
command_type=None):
"""Generates a template of test data."""
# It emulates a data that is generated by the templates in
# //common-mk/BUILDCONFIG.gn for this BUILD.gn rule example
#
# group("all") {
# deps = ["//platform:install"]
# }
#
# install_config("install") {
# sources = $sources
# install_path = $install_path
# outputs = $outputs
# symlinks = $symlinks
# recursive = $recursive
# options = $options
# type = $target_type
#
# # some required variables
# }
install_config = {
'sources': sources,
'install_path': install_path,
'outputs': outputs,
'symlinks': symlinks,
'recursive': recursive,
'options': options,
'type': command_type,
}
metadata = {
'_install_config': [install_config]
}
return {
TARGET_PREFIX + 'all': {
'deps': [
TARGET_PREFIX + 'install',
],
},
TARGET_PREFIX + 'install': {
'metadata': metadata,
},
}
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testEbuildParameter(self, generate_mock):
"""Makes sure the parameter passed to ebuild_function correctly."""
gn_desc = self._CreateTestData(sources=['source'], install_path='/path',
outputs=['output'], symlinks=['symlink'],
recursive=True, options='-m0644',
command_type='executable')
self._RunWithDesc('configure_install', gn_desc)
generate_mock.assert_called_with(sources=['source'], install_path='/path',
outputs=['output'], symlinks=['symlink'],
recursive=True, options='-m0644',
command_type='executable')
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testEbuildParameterWithoutNewNames(self, generate_mock):
"""Makes sure the parameter passed to ebuild_function correctly."""
gn_desc = self._CreateTestData(sources=['source'], install_path='/path',
recursive=True, options='-m0644',
command_type='executable')
self._RunWithDesc('configure_install', gn_desc)
generate_mock.assert_called_with(sources=['source'], install_path='/path',
outputs=None, symlinks=None,
recursive=True, options='-m0644',
command_type='executable')
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testWithoutSources(self, generate_mock):
"""Makes sure it returns empty list when sources aren't specified."""
self._RunWithDesc('configure_install', self._CreateTestData())
self.assertEqual(generate_mock.call_count, 0)
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testWithSources(self, generate_mock):
"""Makes sure it returns an install command when sources are specified."""
gn_desc = self._CreateTestData(sources=['source'])
self._RunWithDesc('configure_install', gn_desc)
self.assertEqual(generate_mock.call_count, 1)
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testMultipleDifferentPathCommands(self, generate_mock):
"""Checks outputs are separated when having the different install_paths."""
num_install = 10
targets = [TARGET_PREFIX + 'test%s' % str(i) for i in range(num_install)]
gn_desc = {
TARGET_PREFIX + 'all': {
'deps': targets,
},
}
for target in targets:
gn_desc[target] = {
'metadata': {
'_install_config': [{
'install_path': target,
'sources': ['source'],
}],
},
}
self._RunWithDesc('configure_install', gn_desc)
self.assertEqual(generate_mock.call_count, 10)
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testMultipleSamePathCommands(self, generate_mock):
"""Checks an output is combined when having the same install_paths."""
num_install = 10
targets = [TARGET_PREFIX + 'test%s' % str(i) for i in range(num_install)]
gn_desc = {
TARGET_PREFIX + 'all': {
'deps': targets,
},
}
for target in targets:
gn_desc[target] = {
'metadata': {
'_install_config': [{
'install_path': '/path',
'sources': ['source'],
}],
},
}
self._RunWithDesc('configure_install', gn_desc)
self.assertEqual(generate_mock.call_count, 1)
@mock.patch('ebuild_function.generate', return_value=[['test', 'command']])
def testMixedCommands(self, generate_mock):
"""Checks it returns two commands when having both new-cmd and do-cmd."""
# group("all") {
# deps = [
# "//platform:doins",
# "//platform:newins",
# ]
# }
#
# install_config("doins") {
# sources = "source-doins"
# install_path = "/path"
# }
# install_config("newins") {
# sources = "source-oldins"
# install_path = "/path"
# outputs = "source-newins"
# }
doins_target = TARGET_PREFIX + 'doins1'
newins_target = TARGET_PREFIX + 'newins'
gn_desc = {
TARGET_PREFIX + 'all': {
'deps': [
doins_target,
newins_target,
],
}, doins_target: {
'metadata': {
'_install_config': [{
'install_path': '/path',
'sources': ['source-doins'],
}],
}
}, newins_target: {
'metadata': {
'_install_config': [{
'install_path': '/path',
'sources': ['source-oldins'],
'outputs': ['source-newins'],
}],
},
}
}
self._RunWithDesc('configure_install', gn_desc)
generate_mock.assert_any_call(sources=['source-doins'],
install_path='/path',
outputs=None, symlinks=None,
recursive=None, options=None,
command_type=None)
generate_mock.assert_any_call(sources=['source-oldins'],
install_path='/path',
outputs=['source-newins'], symlinks=None,
recursive=None, options=None,
command_type=None)
if __name__ == '__main__':
cros_test_lib.main(module=__name__)