diff options
-rw-r--r-- | DEVELOP.md | 18 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_metric.py | 7 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_plan.py | 7 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_qpi.py | 7 | ||||
-rw-r--r-- | qtip/reporter/console.py | 23 | ||||
-rw-r--r-- | qtip/reporter/templates/timeline.j2 (renamed from qtip/reporter/console/timeline.j2) | 0 | ||||
-rw-r--r-- | qtip/runner/__init__.py | 43 | ||||
-rw-r--r-- | qtip/runner/base.py (renamed from qtip/reporter/base.py) | 6 | ||||
-rw-r--r-- | qtip/util/logger.py | 9 | ||||
-rw-r--r-- | tests/unit/cli/cmd_metric_test.py | 10 | ||||
-rw-r--r-- | tests/unit/cli/cmd_plan_test.py | 10 | ||||
-rw-r--r-- | tests/unit/cli/cmd_qpi_test.py | 10 | ||||
-rw-r--r-- | tests/unit/reporter/console_test.py | 29 | ||||
-rw-r--r-- | tests/unit/runner/runner_test.py (renamed from qtip/reporter/console/__init__.py) | 7 | ||||
-rw-r--r-- | tests/unit/util/__init__.py | 0 | ||||
-rw-r--r-- | tests/unit/util/logger_test.py | 48 | ||||
-rw-r--r-- | tox.ini | 2 |
17 files changed, 178 insertions, 58 deletions
@@ -28,6 +28,24 @@ $ pip install tox $ tox ``` +Undering macOS system, it will happen to a **fatal error** when installing package `cryptograph`: + +``` +'openssl/opensslv.h' file not found +#incude <openssl/opensslv.h> + ^ +1 error generated. +``` + +It is for macOS uses TLS instead of OpenSSL and no header files supported. The solutions is: +``` code=bash +# brew install openssl + +# #add these lines in to your shell profiles, such as .bash_profile, .zshrc +# export CPPFLAGS='-I $openssl_install_path/include' +# export LDFLAGS='-L $openssl_install_path/lib' +``` + ## Architecture **TODO**: move to design spec diff --git a/qtip/cli/commands/cmd_metric.py b/qtip/cli/commands/cmd_metric.py index aa4df1f4..b6035e2d 100644 --- a/qtip/cli/commands/cmd_metric.py +++ b/qtip/cli/commands/cmd_metric.py @@ -27,6 +27,13 @@ def cmd_list(ctx): pass +@cli.command('show', help='View details of a Metric') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Run tests to run Performance Metrics') @click.argument('name') @pass_context diff --git a/qtip/cli/commands/cmd_plan.py b/qtip/cli/commands/cmd_plan.py index c1dd7cf6..64c702d3 100644 --- a/qtip/cli/commands/cmd_plan.py +++ b/qtip/cli/commands/cmd_plan.py @@ -35,6 +35,13 @@ def list(ctx): pass +@cli.command('show', help='View details of a Plan') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Execute a Plan') @click.argument('name') @pass_context diff --git a/qtip/cli/commands/cmd_qpi.py b/qtip/cli/commands/cmd_qpi.py index f33f0104..5fc9bec8 100644 --- a/qtip/cli/commands/cmd_qpi.py +++ b/qtip/cli/commands/cmd_qpi.py @@ -28,6 +28,13 @@ def cmd_list(ctx): pass +@cli.command('show', help='View details of a QPI') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Run performance tests for the specified QPI') @click.argument('name') @pass_context diff --git a/qtip/reporter/console.py b/qtip/reporter/console.py new file mode 100644 index 00000000..24c98e74 --- /dev/null +++ b/qtip/reporter/console.py @@ -0,0 +1,23 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corp and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +from qtip.base import BaseActor + + +class ConsoleReporter(BaseActor): + """ + report benchmark result to console + """ + def __init__(self, config, parent=None): + super(ConsoleReporter, self).__init__(config, parent=parent) + # TODO(yujunz) remove PoC code + self._fmt = "{title}: {description}" + + def render(self, var_dict): + return self._fmt.format(**var_dict) diff --git a/qtip/reporter/console/timeline.j2 b/qtip/reporter/templates/timeline.j2 index 9c18a996..9c18a996 100644 --- a/qtip/reporter/console/timeline.j2 +++ b/qtip/reporter/templates/timeline.j2 diff --git a/qtip/runner/__init__.py b/qtip/runner/__init__.py index 52c43a14..e69de29b 100644 --- a/qtip/runner/__init__.py +++ b/qtip/runner/__init__.py @@ -1,43 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corp and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -from qtip.base.constant import PkgName, BaseProp -from qtip.base.error import NotFoundError -from qtip.collector.stdout import StdoutCollector -from qtip.driver.random import RandomDriver -from qtip.reporter.console import ConsoleReporter - - -class Runner(object): - def __init__(self, spec, config=None): - if config is None: - config = spec[BaseProp.CONFIG] - - driver_name = config[BaseProp.DRIVER] - collector_name = config[BaseProp.COLLECTOR] - reporter_name = config[BaseProp.REPORTER] - - # TODO(yujunz) dynamically load modules by name - - if driver_name == 'random': - self.driver = RandomDriver() - else: - raise NotFoundError(driver_name, heystack=PkgName.DRIVER) - - if collector_name == 'stdout': - self.collector = StdoutCollector() - else: - raise NotFoundError(collector_name, - heystack=PkgName.COLLECTOR) - - if reporter_name == 'console': - self.reporter = ConsoleReporter() - else: - raise NotFoundError(reporter_name, - heystack=PkgName.REPORTER) diff --git a/qtip/reporter/base.py b/qtip/runner/base.py index b931d14d..a86626d9 100644 --- a/qtip/reporter/base.py +++ b/qtip/runner/base.py @@ -8,7 +8,5 @@ ############################################################################## -class BaseReporter(object): - """benchmark result reporter""" - def __init__(self, collector=None): - self.collector = collector +class BaseRunner(object): + """benchmark task runner""" diff --git a/qtip/util/logger.py b/qtip/util/logger.py index d5e76a64..a7847dfc 100644 --- a/qtip/util/logger.py +++ b/qtip/util/logger.py @@ -27,11 +27,11 @@ import os class Logger(object): - file_path = '/var/log' formatter = logging.Formatter('%(asctime)s - %(name)s - ' '%(levelname)s - %(message)s') - def __init__(self, logger_name): + def __init__(self, logger_name, file_path=None): + self.file_path = '/var/log' if not file_path else file_path IF_DEBUG = os.getenv('IF_DEBUG') @@ -59,10 +59,9 @@ class Logger(object): class QtipLogger(Logger): - file_path = '{}/qtip/logs'.format(os.environ['HOME']) - def __init__(self, logger_name): + self.file_path = '{}/qtip/logs'.format(os.environ['HOME']) if not os.path.exists(self.file_path): os.makedirs(self.file_path) - super(QtipLogger, self).__init__(logger_name) + super(QtipLogger, self).__init__(logger_name, self.file_path) diff --git a/tests/unit/cli/cmd_metric_test.py b/tests/unit/cli/cmd_metric_test.py index 239da96e..30f3448a 100644 --- a/tests/unit/cli/cmd_metric_test.py +++ b/tests/unit/cli/cmd_metric_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['metric', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['metric', 'show', 'fake-metric']) + assert result.output == '' + + result = runner.invoke(cli, ['metric', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/cli/cmd_plan_test.py b/tests/unit/cli/cmd_plan_test.py index 3ce3766e..1708c340 100644 --- a/tests/unit/cli/cmd_plan_test.py +++ b/tests/unit/cli/cmd_plan_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['plan', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['plan', 'show', 'fake-plan']) + assert result.output == '' + + result = runner.invoke(cli, ['plan', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/cli/cmd_qpi_test.py b/tests/unit/cli/cmd_qpi_test.py index 992c85d7..485d5462 100644 --- a/tests/unit/cli/cmd_qpi_test.py +++ b/tests/unit/cli/cmd_qpi_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['qpi', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['qpi', 'show', 'fake-qpi']) + assert result.output == '' + + result = runner.invoke(cli, ['qpi', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/reporter/console_test.py b/tests/unit/reporter/console_test.py new file mode 100644 index 00000000..8150239e --- /dev/null +++ b/tests/unit/reporter/console_test.py @@ -0,0 +1,29 @@ +############################################################################## +# Copyright (c) 2017 ZTE Corporation and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import pytest +from qtip.reporter.console import ConsoleReporter + + +@pytest.fixture +def console_reporter(): + return ConsoleReporter({}) + + +def test_constructor(console_reporter): + assert isinstance(console_reporter, ConsoleReporter) + + +def test_render(console_reporter): + var_dict = { + 'title': 'fake title', + 'description': 'fake description' + } + output = console_reporter.render(var_dict=var_dict) + assert output == 'fake title: fake description' diff --git a/qtip/reporter/console/__init__.py b/tests/unit/runner/runner_test.py index 02d63288..b7da1611 100644 --- a/qtip/reporter/console/__init__.py +++ b/tests/unit/runner/runner_test.py @@ -8,8 +8,9 @@ ############################################################################## -from qtip.reporter.base import BaseReporter +from qtip.runner.base import BaseRunner -class ConsoleReporter(BaseReporter): - """report result to console""" +def test_constructor(): + runner = BaseRunner() + assert isinstance(runner, BaseRunner) diff --git a/tests/unit/util/__init__.py b/tests/unit/util/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/unit/util/__init__.py diff --git a/tests/unit/util/logger_test.py b/tests/unit/util/logger_test.py new file mode 100644 index 00000000..339b2bf6 --- /dev/null +++ b/tests/unit/util/logger_test.py @@ -0,0 +1,48 @@ +import pytest + +from qtip.util import logger + +MODULE = 'test_logger' +ERROR_MSG = 'error level test' +INFO_MSG = 'info level test' +DEBUG_MSG = 'debug level test' + + +@pytest.fixture() +def env_home(monkeypatch, tmpdir): + monkeypatch.setenv('HOME', str(tmpdir)) + return tmpdir + + +@pytest.fixture() +def logger_file(env_home): + return env_home.mkdir('qtip').mkdir('logs').join('{}.log'.format(MODULE)) + + +def console_expect_debug(content): + assert DEBUG_MSG in content + + +def console_expect_nodebug(content): + assert DEBUG_MSG not in content + + +@pytest.mark.parametrize('debug, console_expected', [ + ('true', console_expect_debug), + ('false', console_expect_nodebug)]) +def test_logger(monkeypatch, capsys, logger_file, debug, console_expected): + monkeypatch.setenv('IF_DEBUG', debug) + + log = logger.QtipLogger(MODULE).get + log.error(ERROR_MSG) + log.info(INFO_MSG) + log.debug(DEBUG_MSG) + + file_print = logger_file.read() + assert ERROR_MSG in file_print + assert INFO_MSG in file_print + assert DEBUG_MSG in file_print + + _, console_print = capsys.readouterr() + + console_expected(console_print) @@ -17,6 +17,8 @@ commands= py.test \ --basetemp={envtmpdir} \ --cov \ + --cov-report term-missing \ + --cov-report xml \ {posargs} setenv= HOME = {envtmpdir} |