fuel-plugins/fuel_plugin_builder/tests/test_build.py

359 lines
13 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2014 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import unicode_literals
import mock
import os
from os.path import join as join_path
from fuel_plugin_builder.actions.build import BaseBuildPlugin
from fuel_plugin_builder.actions.build import BuildPluginV1
from fuel_plugin_builder.actions.build import BuildPluginV2
from fuel_plugin_builder.actions.build import BuildPluginV3
from fuel_plugin_builder import errors
from fuel_plugin_builder.tests.base import BaseTestCase
class BaseBuild(BaseTestCase):
# Prevent test runner to run tests in base
__test__ = False
# Redefine class
builder_class = None
releases = [
{'os': 'ubuntu',
'deployment_scripts_path': 'deployment_scripts_path',
'repository_path': 'repository_path'}]
def setUp(self):
self.plugins_name = 'fuel_plugin'
self.plugin_path = '/tmp/{0}'.format(self.plugins_name)
self.builder = self.create_builder(self.plugin_path)
def create_builder(self, plugin_path):
with mock.patch(
'fuel_plugin_builder.actions.build.utils.parse_yaml',
return_value=self.meta):
return self.builder_class(plugin_path)
def test_run(self):
mocked_methods = [
'clean',
'run_pre_build_hook',
'check',
'build_repos',
'add_checksums_file',
'make_package']
self.mock_methods(self.builder, mocked_methods)
self.builder.run()
self.builder.clean.assert_called_once_with()
self.builder.run_pre_build_hook.assert_called_once_with()
self.builder.check.assert_called_once_with()
self.builder.add_checksums_file()
self.builder.build_repos.assert_called_once_with()
self.builder.make_package()
@mock.patch('fuel_plugin_builder.actions.build.utils.which')
@mock.patch('fuel_plugin_builder.actions.build.utils.exec_cmd',
return_value=True)
def test_run_pre_build_hook(self, exec_cmd_mock, which_mock):
self.builder.run_pre_build_hook()
exec_cmd_mock.assert_called_once_with(self.builder.pre_build_hook_cmd,
self.builder.plugin_path)
which_mock.assert_called_once_with(
join_path(self.builder.plugin_path,
self.builder.pre_build_hook_cmd))
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_build_repos(self, utils_mock):
with mock.patch.object(
self.builder_class, 'build_ubuntu_repos') as build_ubuntu_mock:
with mock.patch.object(
self.builder_class,
'build_centos_repos') as build_centos_mock:
self.builder.build_repos()
utils_mock.create_dir.assert_called_once_with(
self.builder.build_src_dir)
utils_mock.copy_files_in_dir.assert_called_once_with(
'/tmp/fuel_plugin/*',
self.builder.build_src_dir)
build_centos_mock.assert_called_once_with([])
build_ubuntu_mock.assert_called_once_with([
'/tmp/fuel_plugin/.build/src/repository_path'])
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_build_ubuntu_repos(self, utils_mock):
path = '/repo/path'
self.builder.build_ubuntu_repos([path])
utils_mock.exec_piped_cmds.assert_called_once_with(
['dpkg-scanpackages .', 'gzip -c9 > Packages.gz'],
cwd=path)
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_build_centos_repos(self, utils_mock):
path = '/repo/path'
self.builder.build_centos_repos([path])
utils_mock.create_dir.assert_called_once_with(
'/repo/path/Packages')
utils_mock.move_files_in_dir.assert_called_once_with(
'/repo/path/*.rpm', '/repo/path/Packages')
utils_mock.exec_cmd.assert_called_once_with(
'createrepo -o /repo/path /repo/path')
@mock.patch.object(BaseBuildPlugin, '_check_requirements')
@mock.patch.object(BaseBuildPlugin, '_check_structure')
def test_check(self, check_structure_mock, check_requirements_mock):
self.builder.check()
check_structure_mock.assert_called_once_with()
check_requirements_mock.assert_called_once_with()
@mock.patch('fuel_plugin_builder.actions.build.utils.which',
return_value=True)
def test_check_requirements(self, _):
self.builder._check_requirements()
@mock.patch('fuel_plugin_builder.actions.build.ValidatorManager')
def test_check_structure(self, manager_class_mock):
validator_manager_obj = mock.MagicMock()
manager_class_mock.return_value = validator_manager_obj
validator_mock = mock.MagicMock()
validator_manager_obj.get_validator.return_value = validator_mock
self.builder._check_structure()
manager_class_mock.assert_called_once_with(self.plugin_path)
validator_manager_obj.get_validator.assert_called_once_with()
validator_mock.validate.assert_called_once_with()
@mock.patch(
'fuel_plugin_builder.actions.build.utils.create_checksums_file')
def test_add_checksums_file(self, create_checksums_file_mock):
self.builder.add_checksums_file()
create_checksums_file_mock.assert_called_once_with(
self.builder.build_src_dir, self.builder.checksums_path)
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_clean(self, utils_mock):
self.builder.clean()
utils_mock.assert_has_calls([
mock.call.remove(self.builder.build_dir),
mock.call.create_dir(self.builder.build_dir),
mock.call.remove_by_mask(self.builder.result_package_mask)])
class TestBaseBuildV1(BaseBuild):
__test__ = True
builder_class = BuildPluginV1
meta = {
'releases': BaseBuild.releases,
'version': '1.2.3',
'name': 'plugin_name'
}
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_make_package(self, utils_mock):
self.builder.make_package()
tar_path = '/tmp/fuel_plugin/plugin_name-1.2.3.fp'
utils_mock.make_tar_gz.assert_called_once_with(
self.builder.build_src_dir,
tar_path,
'plugin_name-1.2.3')
@mock.patch('fuel_plugin_builder.actions.build.utils.which',
return_value=False)
def test_check_requirements_raises_error(self, _):
self.assertRaisesRegexp(
errors.FuelCannotFindCommandError,
'Cannot find commands "rpm, createrepo, dpkg-scanpackages", '
'install required commands and try again',
self.builder._check_requirements)
class TestBaseBuildV2(BaseBuild):
__test__ = True
builder_class = BuildPluginV2
meta = {
'releases': BaseBuild.releases,
'version': '1.2.3',
'name': 'plugin_name',
'title': 'Plugin title',
'description': 'Description',
'licenses': ['Apache', 'BSD'],
'authors': ['author1', 'author2'],
'homepage': 'url'
}
def path_from_plugin(self, plugin_path, path):
return join_path(plugin_path, path)
@mock.patch('fuel_plugin_builder.actions.build.utils')
def check_make_package(self, builder, plugin_path, utils_mock):
plugin_path = plugin_path
utils_mock.get_current_year.return_value = '2014'
builder.make_package()
rpm_src_path = self.path_from_plugin(plugin_path,
'.build/rpm/SOURCES')
utils_mock.create_dir.assert_called_once_with(rpm_src_path)
fp_dst = self.path_from_plugin(
plugin_path, '.build/rpm/SOURCES/plugin_name-1.2.fp')
utils_mock.make_tar_gz.assert_called_once_with(
self.path_from_plugin(plugin_path, '.build/src'),
fp_dst,
'plugin_name-1.2')
spec_src = os.path.abspath(join_path(
os.path.dirname(__file__), '..',
self.builder.rpm_spec_src_path))
utils_mock.render_to_file.assert_called_once_with(
spec_src,
join_path(plugin_path, '.build/rpm/plugin_rpm.spec'),
{'vendor': 'author1, author2',
'description': 'Description',
'license': 'Apache and BSD',
'summary': 'Plugin title',
'version': '1.2.3',
'homepage': 'url',
'name': 'plugin_name-1.2',
'year': '2014'})
utils_mock.exec_cmd.assert_called_once_with(
'rpmbuild -vv --nodeps --define "_topdir {0}" -bb '
'{1}'.format(
self.path_from_plugin(plugin_path, '.build/rpm'),
self.path_from_plugin(plugin_path,
'.build/rpm/plugin_rpm.spec')))
utils_mock.copy_files_in_dir.assert_called_once_with(
self.path_from_plugin(plugin_path,
'.build/rpm/RPMS/noarch/*.rpm'),
plugin_path
)
def test_make_package(self):
self.check_make_package(self.builder, self.plugin_path)
def test_make_package_with_non_ascii_chars_in_path(self):
plugin_path = '/tmp/тест/' + self.plugins_name
builder = self.create_builder(plugin_path)
self.check_make_package(builder, plugin_path)
@mock.patch('fuel_plugin_builder.actions.build.utils.which',
return_value=False)
def test_check_requirements_raises_error(self, _):
self.assertRaisesRegexp(
errors.FuelCannotFindCommandError,
'Cannot find commands "rpmbuild, rpm, createrepo, '
'dpkg-scanpackages", install required commands and try again',
self.builder._check_requirements)
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_build_ubuntu_repos(self, utils_mock):
path = '/repo/path'
self.builder.build_ubuntu_repos([path])
utils_mock.exec_piped_cmds.assert_called_once_with(
['dpkg-scanpackages .', 'gzip -c9 > Packages.gz'],
cwd=path)
release_src = os.path.abspath(join_path(
os.path.dirname(__file__), '..',
self.builder.release_tmpl_src_path))
utils_mock.render_to_file.assert_called_once_with(
release_src,
'/repo/path/Release',
{'major_version': '1.2',
'plugin_name': 'plugin_name'})
class TestBaseBuildV3(BaseBuild):
__test__ = True
builder_class = BuildPluginV3
meta = {
'releases': BaseBuild.releases,
'version': '1.2.3',
'name': 'plugin_name',
'title': 'Plugin title',
'description': 'Description',
'licenses': ['Apache', 'BSD'],
'authors': ['author1', 'author2'],
'homepage': 'url'
}
def path_from_plugin(self, path):
return join_path(self.plugin_path, path)
@mock.patch('fuel_plugin_builder.actions.build.utils')
def test_make_package(self, utils_mock):
utils_mock.get_current_year.return_value = '2014'
utils_mock.read_if_exist.side_effect = ['echo uninst', 'echo preinst',
'echo postinst']
self.builder.make_package()
rpm_src_path = self.path_from_plugin('.build/rpm/SOURCES')
utils_mock.create_dir.assert_called_once_with(rpm_src_path)
fp_dst = self.path_from_plugin('.build/rpm/SOURCES/plugin_name-1.2.fp')
utils_mock.make_tar_gz.assert_called_once_with(
self.path_from_plugin('.build/src'),
fp_dst,
'plugin_name-1.2')
spec_src = os.path.abspath(join_path(
os.path.dirname(__file__), '..',
self.builder.rpm_spec_src_path))
utils_mock.render_to_file.assert_called_once_with(
spec_src,
join_path(self.plugin_path, '.build/rpm/plugin_rpm.spec'),
{'vendor': 'author1, author2',
'description': 'Description',
'license': 'Apache and BSD',
'summary': 'Plugin title',
'version': '1.2.3',
'homepage': 'url',
'name': 'plugin_name-1.2',
'year': '2014',
'preinstall_hook': 'echo preinst',
'postinstall_hook': 'echo postinst',
'uninstall_hook': 'echo uninst'})
utils_mock.exec_cmd.assert_called_once_with(
'rpmbuild -vv --nodeps --define "_topdir {0}" -bb '
'{1}'.format(
self.path_from_plugin('.build/rpm'),
self.path_from_plugin('.build/rpm/plugin_rpm.spec')))
utils_mock.copy_files_in_dir.assert_called_once_with(
self.path_from_plugin('.build/rpm/RPMS/noarch/*.rpm'),
self.plugin_path)
utils_mock.read_if_exist.assert_has_calls([
mock.call(self.path_from_plugin('uninstall.sh')),
mock.call(self.path_from_plugin('pre_install.sh')),
mock.call(self.path_from_plugin('post_install.sh'))])