Browse Source
This also removes test cases discovery function and tobiko-fixture command that where using it Change-Id: I8ec1cde0b5ada0e63a213aa09a5a877d432bbd73changes/51/772651/6
10 changed files with 0 additions and 678 deletions
@ -1,52 +0,0 @@
|
||||
# Copyright (c) 2018 Red Hat |
||||
# All Rights Reserved. |
||||
# |
||||
# 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 absolute_import |
||||
|
||||
import logging |
||||
import argparse |
||||
|
||||
from oslo_log import log |
||||
|
||||
from tobiko import config |
||||
|
||||
|
||||
LOG = log.getLogger(__name__) |
||||
|
||||
|
||||
class TobikoCMD(object): |
||||
"""Manages different command line utilities.""" |
||||
|
||||
def __init__(self): |
||||
config.CONF.tobiko.use_stderr = True |
||||
log.setup(config.CONF.tobiko, 'tobiko') |
||||
self.parser = self.get_parser() |
||||
self.args = (self.parser).parse_args() |
||||
|
||||
def get_parser(self): |
||||
parser = argparse.ArgumentParser(add_help=True) |
||||
parser.add_argument('--verbose', '-v', action='count', |
||||
help='Make the output more verbose, incremental.') |
||||
parser.add_argument('--quiet', '-q', action='count', |
||||
help='Make the output less verbose, incremental.') |
||||
return parser |
||||
|
||||
def set_stream_handler_logging_level(self): |
||||
num_quiet = self.args.quiet or 0 |
||||
num_verb = self.args.verbose or 0 |
||||
level = logging.WARNING - (num_verb * 10) + (num_quiet * 10) |
||||
root_logger = logging.getLogger() |
||||
for handler in root_logger.handlers: |
||||
if isinstance(handler, logging.StreamHandler): |
||||
handler.setLevel(level) |
@ -1,182 +0,0 @@
|
||||
# Copyright 2018 Red Hat |
||||
# |
||||
# 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 absolute_import |
||||
|
||||
import sys |
||||
|
||||
from oslo_log import log |
||||
import six |
||||
|
||||
import tobiko |
||||
from tobiko.cmd import base |
||||
|
||||
LOG = log.getLogger(__name__) |
||||
|
||||
|
||||
class FixtureUtil(base.TobikoCMD): |
||||
|
||||
def get_parser(self): |
||||
parser = super(FixtureUtil, self).get_parser() |
||||
|
||||
subparsers = parser.add_subparsers( |
||||
title='subcommands', description='fixture operation') |
||||
|
||||
subcommand_parser = subparsers.add_parser( |
||||
'help', help=('show this help message')) |
||||
subcommand_parser.set_defaults(subcommand='help') |
||||
|
||||
for subcommand_name in ['cleanup', 'list', 'setup']: |
||||
subcommand_parser = subparsers.add_parser( |
||||
subcommand_name, help=(subcommand_name + ' fixtures')) |
||||
subcommand_parser.set_defaults(subcommand=subcommand_name) |
||||
subcommand_parser.add_argument( |
||||
'--config', '-c', |
||||
default='.stestr.conf', |
||||
help=("Set a stestr config file to use with this command. " |
||||
"If one isn't specified then .stestr.conf in the " |
||||
"directory that a command is running from is used")) |
||||
subcommand_parser.add_argument( |
||||
'--repo-type', '-r', |
||||
choices=['file'], |
||||
default='file', |
||||
help=("Select the repo backend to use")) |
||||
subcommand_parser.add_argument( |
||||
'--repo-url', '-u', |
||||
help=("Set the repo url to use. An acceptable value for " |
||||
"this depends on the repository type used.")) |
||||
subcommand_parser.add_argument( |
||||
'--test-path', '-t', |
||||
help=("Set the test path to use for unittest discovery. If " |
||||
"both this and the corresponding config file option " |
||||
"are set, this value will be used.")) |
||||
subcommand_parser.add_argument( |
||||
'--top-dir', |
||||
help=("Set the top dir to use for unittest discovery. If " |
||||
"both this and the corresponding config file option " |
||||
"are set, this value will be used.")) |
||||
subcommand_parser.add_argument( |
||||
'--group-regex', '--group_regex', '-g', |
||||
help=("Set a group regex to use for grouping tests together " |
||||
"in the stestr scheduler. If both this and the " |
||||
"corresponding config file option are set this value " |
||||
"will be used.")) |
||||
subcommand_parser.add_argument( |
||||
'--blacklist-file', '-b', |
||||
help=("Path to a blacklist file, this file contains a " |
||||
"separate regex exclude on each newline.")) |
||||
subcommand_parser.add_argument( |
||||
'--whitelist-file', '-w', |
||||
help=("Path to a whitelist file, this file contains a " |
||||
"separate regex on each newline.")) |
||||
subcommand_parser.add_argument( |
||||
'--black-regex', '-B', |
||||
help=("Test rejection regex. If a test cases name matches " |
||||
"on re.search() operation , it will be removed from " |
||||
"the final test list. Effectively the black-regexp is " |
||||
"added to black regexp list, but you do need to edit " |
||||
"a file. The black filtering happens after the " |
||||
"initial white selection, which by default is " |
||||
"everything.")) |
||||
subcommand_parser.add_argument( |
||||
'filters', |
||||
nargs='*', |
||||
help=("A list of string regex filters to initially apply " |
||||
"on the test list. Tests that match any of the " |
||||
"regexes will be used. (assuming any other filtering " |
||||
"specified also uses it).")) |
||||
return parser |
||||
|
||||
def execute(self): |
||||
action = self.args.subcommand or 'list' |
||||
if action == 'help': |
||||
return self.show_help() |
||||
if action == 'list': |
||||
return self.list_fixtures() |
||||
elif action == 'setup': |
||||
return self.setup_fixtures() |
||||
elif action == 'cleanup': |
||||
return self.cleanup_fixtures() |
||||
|
||||
def show_help(self, stream=None): |
||||
stream = stream or sys.stdout |
||||
self.parser.print_help(stream) |
||||
|
||||
def discover_testcases(self): |
||||
args = self.args |
||||
return tobiko.discover_test_cases( |
||||
config=args.config, |
||||
repo_type=args.repo_type, |
||||
repo_url=args.repo_url, |
||||
test_path=args.test_path, |
||||
top_dir=args.top_dir, |
||||
group_regex=args.group_regex, |
||||
blacklist_file=args.blacklist_file, |
||||
whitelist_file=args.whitelist_file, |
||||
black_regex=args.black_regex, |
||||
filters=args.filters) |
||||
|
||||
def list_fixtures(self, stream=None): |
||||
stream = stream or sys.stdout |
||||
test_cases = self.discover_testcases() |
||||
fixtures_names = tobiko.list_required_fixtures(test_cases) |
||||
if fixtures_names: |
||||
output = '\n'.join(fixtures_names) + '\n' |
||||
if six.PY2: |
||||
output = output.decode() |
||||
stream.write(output) |
||||
|
||||
def setup_fixtures(self, stream=None): |
||||
stream = stream or sys.stdout |
||||
test_cases = self.discover_testcases() |
||||
success = True |
||||
for fixture_name in tobiko.list_required_fixtures(test_cases): |
||||
output = fixture_name + '\n' |
||||
if six.PY2: |
||||
output = output.decode() |
||||
stream.write(output) |
||||
try: |
||||
tobiko.setup_fixture(fixture_name) |
||||
except Exception: |
||||
LOG.exception('Fixture %r setup failed', fixture_name) |
||||
success = False |
||||
if not success: |
||||
sys.exit(1) |
||||
|
||||
def cleanup_fixtures(self, stream=None): |
||||
stream = stream or sys.stdout |
||||
test_cases = self.discover_testcases() |
||||
success = True |
||||
for fixture_name in tobiko.list_required_fixtures(test_cases): |
||||
output = fixture_name + '\n' |
||||
if six.PY2: |
||||
output = output.decode() |
||||
stream.write(output) |
||||
try: |
||||
tobiko.cleanup_fixture(fixture_name) |
||||
except Exception: |
||||
LOG.exception('Fixture %r cleanup failed', fixture_name) |
||||
success = False |
||||
if not success: |
||||
sys.exit(1) |
||||
|
||||
|
||||
def main(): |
||||
"""Create CLI main entry.""" |
||||
fixture_util = FixtureUtil() |
||||
fixture_util.set_stream_handler_logging_level() |
||||
fixture_util.execute() |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
sys.exit(main()) |
@ -1,33 +0,0 @@
|
||||
# Copyright (c) 2018 Red Hat |
||||
# All Rights Reserved. |
||||
# |
||||
# 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 absolute_import |
||||
|
||||
import sys |
||||
|
||||
from tobiko.cmd import base |
||||
from tobiko.tests.unit import openstack |
||||
|
||||
|
||||
class TobikoCMDTest(openstack.OpenstackTest): |
||||
|
||||
command_name = 'tobiko-base' |
||||
command_class = base.TobikoCMD |
||||
|
||||
def test_init(self, argv=None): |
||||
self.patch_argv(argv=argv) |
||||
return self.command_class() |
||||
|
||||
def patch_argv(self, argv=None): |
||||
return self.patch(sys, 'argv', [self.command_name] + (argv or [])) |
@ -1,273 +0,0 @@
|
||||
# Copyright (c) 2018 Red Hat |
||||
# All Rights Reserved. |
||||
# |
||||
# 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 absolute_import |
||||
|
||||
import argparse |
||||
import io |
||||
import os |
||||
import subprocess |
||||
import sys |
||||
|
||||
import tobiko |
||||
from tobiko.cmd import fixture as _fixture |
||||
from tobiko.tests.unit import test_fixture |
||||
from tobiko.tests import unit |
||||
|
||||
|
||||
MyFixture = test_fixture.MyFixture |
||||
MyFixture2 = test_fixture.MyFixture2 |
||||
MyRequiredFixture = test_fixture.MyRequiredFixture |
||||
canonical_name = test_fixture.canonical_name |
||||
|
||||
|
||||
class ExitCalled(Exception): |
||||
pass |
||||
|
||||
|
||||
class FixtureUtilTest(unit.TobikoUnitTest): |
||||
|
||||
command_name = 'tobiko-fixture' |
||||
command_class = _fixture.FixtureUtil |
||||
|
||||
test_path = os.path.dirname(__file__) |
||||
top_dir = os.path.dirname(os.path.dirname(tobiko.__file__)) |
||||
|
||||
required_fixture = tobiko.required_fixture(MyRequiredFixture) |
||||
|
||||
def setUp(self): |
||||
super(FixtureUtilTest, self).setUp() |
||||
self.mock_error = self.patch(argparse.ArgumentParser, 'error', |
||||
side_effect=self.fail) |
||||
|
||||
def patch_argv(self, subcommand=None, arguments=None, filters=None, |
||||
**options): |
||||
subcommand = subcommand or 'list' |
||||
arguments = arguments or [] |
||||
if options: |
||||
arguments += make_options(**options) |
||||
if filters: |
||||
arguments += list(filters) |
||||
argv = [self.command_name, subcommand] + arguments |
||||
return self.patch(sys, 'argv', argv) |
||||
|
||||
def test_init(self, subcommand=None, arguments=None, filters=None, |
||||
config_file=None, repo_type=None, |
||||
repo_url=None, test_path=None, top_dir=None, |
||||
group_regex=None, blacklist_file=None, |
||||
whitelist_file=None, black_regex=None): |
||||
self.patch_argv(subcommand=subcommand, arguments=arguments) |
||||
command = self.command_class() |
||||
self.mock_error.assert_not_called() |
||||
args = command.args |
||||
self.assertIsNotNone(args) |
||||
self.assertEqual(filters or [], args.filters) |
||||
self.assertEqual(config_file or '.stestr.conf', args.config) |
||||
self.assertEqual(subcommand or 'list', args.subcommand) |
||||
self.assertEqual(repo_type or 'file', args.repo_type) |
||||
self.assertEqual(repo_url, args.repo_url) |
||||
self.assertEqual(test_path, args.test_path) |
||||
self.assertEqual(top_dir, args.top_dir) |
||||
self.assertEqual(group_regex, args.group_regex) |
||||
self.assertEqual(blacklist_file, args.blacklist_file) |
||||
self.assertEqual(whitelist_file, whitelist_file) |
||||
self.assertEqual(black_regex, args.black_regex) |
||||
|
||||
def test_init_with_list(self): |
||||
self.test_init(subcommand='list') |
||||
|
||||
def test_init_with_seutp(self): |
||||
self.test_init(subcommand='setup') |
||||
|
||||
def test_init_with_cleanup(self): |
||||
self.test_init(subcommand='cleanup') |
||||
|
||||
def test_init_with_c(self): |
||||
self.test_init(arguments=['-c', 'some-config-file'], |
||||
config_file='some-config-file') |
||||
|
||||
def test_init_with_config(self): |
||||
self.test_init(arguments=['--config', 'some-config-file'], |
||||
config_file='some-config-file') |
||||
|
||||
def test_init_with_r(self): |
||||
self.test_init(arguments=['-r', 'file'], repo_type='file') |
||||
|
||||
def test_init_with_repo_type_file(self): |
||||
self.test_init(arguments=['--repo-type', 'file'], repo_type='file') |
||||
|
||||
def test_init_with_repo_type_sql(self): |
||||
self.assertRaises(self.failureException, self.test_init, |
||||
arguments=['--repo-type', 'sql']) |
||||
|
||||
def test_init_with_u(self): |
||||
self.test_init(arguments=['-u', 'some-url'], repo_url='some-url') |
||||
|
||||
def test_init_with_repo_url(self): |
||||
self.test_init(arguments=['--repo-url', 'some-url'], |
||||
repo_url='some-url') |
||||
|
||||
def test_init_with_filters(self): |
||||
self.test_init(arguments=['a', 'b', 'c'], filters=['a', 'b', 'c']) |
||||
|
||||
def test_init_with_t(self): |
||||
self.test_init(arguments=['-t', 'some/test/path'], |
||||
test_path='some/test/path') |
||||
|
||||
def test_init_with_test_path(self): |
||||
self.test_init(arguments=['--test-path', 'some/test/path'], |
||||
test_path='some/test/path') |
||||
|
||||
def test_init_with_top_dir(self): |
||||
self.test_init(arguments=['--top-dir', 'some/top/dir'], |
||||
top_dir='some/top/dir') |
||||
|
||||
def test_init_with_g(self): |
||||
self.test_init(arguments=['-g', 'some-regex'], |
||||
group_regex='some-regex') |
||||
|
||||
def test_init_with_group_regex(self): |
||||
self.test_init(arguments=['--group-regex', 'some-regex'], |
||||
group_regex='some-regex') |
||||
|
||||
def test_init_with_group_regex2(self): |
||||
self.test_init(arguments=['--group_regex', 'some-regex'], |
||||
group_regex='some-regex') |
||||
|
||||
def test_init_with_b(self): |
||||
self.test_init(arguments=['-b', 'some/blacklist-file'], |
||||
blacklist_file='some/blacklist-file') |
||||
|
||||
def test_init_with_blacklist_file(self): |
||||
self.test_init(arguments=['--blacklist-file', 'some/blacklist-file'], |
||||
blacklist_file='some/blacklist-file') |
||||
|
||||
def test_init_with_w(self): |
||||
self.test_init(arguments=['-w', 'some/whitelist-file'], |
||||
whitelist_file='some/whitelist-file') |
||||
|
||||
def test_init_with_whitelist_file(self): |
||||
self.test_init(arguments=['--whitelist-file', 'some/whitelist-file'], |
||||
whitelist_file='some/whitelist-file') |
||||
|
||||
def test_init_with_B(self): |
||||
self.test_init(arguments=['-B', 'some-black-regex'], |
||||
black_regex='some-black-regex') |
||||
|
||||
def test_init_with_blacklist_regex(self): |
||||
self.test_init(arguments=['--black-regex', 'some-black-regex'], |
||||
black_regex='some-black-regex') |
||||
|
||||
def test_main(self, subcommand=None, config_file=None, repo_type=None, |
||||
repo_url=None, test_path=None, top_dir=None, |
||||
group_regex=None, blacklist_file=None, whitelist_file=None, |
||||
black_regex=None, filters=None): |
||||
test_path = test_path or self.test_path |
||||
top_dir = top_dir or self.top_dir |
||||
self.setup_file_repo(top_dir=top_dir) |
||||
self.patch_argv(subcommand=subcommand, config_file=config_file, |
||||
repo_type=repo_type, repo_url=repo_url, |
||||
test_path=test_path, top_dir=top_dir, |
||||
group_regex=group_regex, |
||||
blacklist_file=blacklist_file, |
||||
whitelist_file=whitelist_file, |
||||
black_regex=black_regex, filters=filters) |
||||
stdout = self.patch(sys, 'stdout', io.StringIO()) |
||||
_fixture.main() |
||||
self.mock_error.assert_not_called() |
||||
return stdout |
||||
|
||||
def test_list(self, fixture1=MyFixture, fixture2=MyFixture2): |
||||
stdout = self.test_main(subcommand='list') |
||||
written_lines = stdout.getvalue().splitlines() |
||||
self.assertIn(canonical_name(fixture1), written_lines) |
||||
self.assertIn(canonical_name(fixture2), written_lines) |
||||
self.assertIn(canonical_name(MyRequiredFixture), |
||||
written_lines) |
||||
|
||||
def test_list_with_filters(self, fixture=MyFixture): |
||||
stdout = self.test_main(subcommand='list', filters=[self.id()]) |
||||
written_lines = stdout.getvalue().splitlines() |
||||
self.assertEqual([canonical_name(fixture), |
||||
canonical_name(MyRequiredFixture)], |
||||
written_lines) |
||||
self.assertIn(canonical_name(MyRequiredFixture), |
||||
written_lines) |
||||
|
||||
def test_setup(self, fixture=MyFixture, fixture2=MyFixture2): |
||||
stdout = self.test_main(subcommand='setup') |
||||
written_lines = stdout.getvalue().splitlines() |
||||
for obj in [fixture, fixture2, MyRequiredFixture]: |
||||
self.assertIn(canonical_name(obj), written_lines) |
||||
tobiko.get_fixture(obj).setup_fixture.assert_called_once_with() |
||||
tobiko.get_fixture(obj).cleanup_fixture.assert_not_called() |
||||
|
||||
def test_setup_with_filters(self, fixture=MyFixture): |
||||
stdout = self.test_main(subcommand='setup', filters=[self.id()]) |
||||
written_lines = stdout.getvalue().splitlines() |
||||
self.assertEqual([canonical_name(fixture), |
||||
canonical_name(MyRequiredFixture)], |
||||
written_lines) |
||||
for obj in [fixture, MyRequiredFixture]: |
||||
tobiko.get_fixture(obj).setup_fixture.assert_called_once_with() |
||||
tobiko.get_fixture(obj).cleanup_fixture.assert_not_called() |
||||
|
||||
def test_cleanup(self, fixture=MyFixture, fixture2=MyFixture2): |
||||
stdout = self.test_main(subcommand='cleanup') |
||||
written_lines = stdout.getvalue().splitlines() |
||||
for obj in [fixture, fixture2, MyRequiredFixture]: |
||||
self.assertIn(canonical_name(obj), written_lines) |
||||
tobiko.get_fixture(obj).setup_fixture.assert_not_called() |
||||
tobiko.get_fixture(obj).cleanup_fixture.assert_called_once_with() |
||||
|
||||
def test_cleanup_with_filters(self, fixture=MyFixture): |
||||
stdout = self.test_main(subcommand='cleanup', filters=[self.id()]) |
||||
written_lines = stdout.getvalue().splitlines() |
||||
self.assertEqual([canonical_name(fixture), |
||||
canonical_name(MyRequiredFixture)], |
||||
written_lines) |
||||
for obj in [fixture, MyRequiredFixture]: |
||||
tobiko.get_fixture(obj).setup_fixture.assert_not_called() |
||||
tobiko.get_fixture(obj).cleanup_fixture.assert_called_once_with() |
||||
|
||||
def setup_file_repo(self, top_dir): |
||||
if not os.path.isdir(os.path.join(top_dir, '.stestr')): |
||||
command = ['stestr', '--top-dir', top_dir, 'init'] |
||||
subprocess.check_call(command) |
||||
|
||||
|
||||
def make_options(config_file=None, repo_type=None, repo_url=None, |
||||
test_path=None, top_dir=None, group_regex=None, |
||||
blacklist_file=None, whitelist_file=None, |
||||
black_regex=None): |
||||
options = [] |
||||
if config_file: |
||||
options += ['--config', config_file] |
||||
if repo_type: |
||||
options += ['--repo-type', repo_type] |
||||
if repo_url: |
||||
options += ['--repo-url', repo_url] |
||||
if test_path: |
||||
options += ['--test-path', test_path] |
||||
if top_dir: |
||||
options += ['--top-dir', top_dir] |
||||
if group_regex: |
||||
options += ['--group-regex', group_regex] |
||||
if blacklist_file: |
||||
options += ['--blacklist-file', blacklist_file] |
||||
if whitelist_file: |
||||
options += ['--whitelist-file', whitelist_file] |
||||
if black_regex: |
||||
options += ['--black-regex', black_regex] |
||||
return options |
Loading…
Reference in new issue