From 245b6f4070d1b3b5124a184cb6442b55000fd321 Mon Sep 17 00:00:00 2001 From: Yujun Zhang Date: Thu, 23 Feb 2017 20:51:38 +0800 Subject: Fix bug when no paths is given for Plan constructor FileLoader was trying to initialize abspath by finding a matched name from abspath which will lead to an exception. Use default paths of class instead. Change-Id: I8ca2122e97edd734aa68b4c6b12196960842313b Signed-off-by: Yujun Zhang --- benchmarks/plan/sample.yaml | 14 ++++++++++++++ qtip/collector/logfile.py | 11 +++++------ qtip/loader/file.py | 7 ++++--- tests/data/benchmarks/plan/sample.yaml | 14 ++++++++++++++ tests/unit/loader/plan_test.py | 17 ++++++++++------- 5 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 benchmarks/plan/sample.yaml create mode 100644 tests/data/benchmarks/plan/sample.yaml diff --git a/benchmarks/plan/sample.yaml b/benchmarks/plan/sample.yaml new file mode 100644 index 00000000..04e8caf9 --- /dev/null +++ b/benchmarks/plan/sample.yaml @@ -0,0 +1,14 @@ +############################################################################## +# 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 +############################################################################## +name: sample +description: sample benchmark plan for testing default path +config: + collectors: [] + reporters: [] +QPIs: [] diff --git a/qtip/collector/logfile.py b/qtip/collector/logfile.py index 2c2e532f..5f0951cb 100644 --- a/qtip/collector/logfile.py +++ b/qtip/collector/logfile.py @@ -18,8 +18,8 @@ from qtip.loader.file import FileLoader class LogItem(BaseActor): - def find(self, filename, paths=None): - return self._parent.find(filename, paths) + def find(self, filename): + return self._parent.find(filename) class LogfileCollector(BaseActor): @@ -33,8 +33,7 @@ class LogfileCollector(BaseActor): self._parent = parent # plan # TODO(yujunz) handle exception of invalid parent dirname = os.path.dirname(self._parent.abspath) - paths = [os.path.join(dirname, p) for p in config.get(self.PATHS, [])] - self._loader = FileLoader('.', paths) + self.paths = [os.path.join(dirname, p) for p in config.get(self.PATHS, [])] def run(self): collected = [] @@ -45,8 +44,8 @@ class LogfileCollector(BaseActor): collected = chain(collected, reduce(chain, matches)) return reduce(merge_matchobj_to_dict, collected, {'groups': (), 'groupdict': {}}) - def find(self, filename, paths=None): - return self._loader.find(filename, paths) + def find(self, filename): + return FileLoader.find(filename, self.paths) def merge_matchobj_to_dict(d, m): diff --git a/qtip/loader/file.py b/qtip/loader/file.py index 038f57dd..a39e15f6 100644 --- a/qtip/loader/file.py +++ b/qtip/loader/file.py @@ -28,11 +28,12 @@ class FileLoader(BaseLoader): self._filename = name self.abspath = self.find(name, paths=paths) - def find(self, name, paths=None): + @classmethod + def find(cls, name, paths=None): """find a specification in searching paths""" - paths = [self.abspath] if paths is None else paths + paths = cls._paths if paths is None else paths for p in paths: - abspath = path.join(p, self.RELATIVE_PATH, name) + abspath = path.join(p, cls.RELATIVE_PATH, name) if path.exists(abspath): return abspath raise NotFoundError(name, paths) diff --git a/tests/data/benchmarks/plan/sample.yaml b/tests/data/benchmarks/plan/sample.yaml new file mode 100644 index 00000000..04e8caf9 --- /dev/null +++ b/tests/data/benchmarks/plan/sample.yaml @@ -0,0 +1,14 @@ +############################################################################## +# 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 +############################################################################## +name: sample +description: sample benchmark plan for testing default path +config: + collectors: [] + reporters: [] +QPIs: [] diff --git a/tests/unit/loader/plan_test.py b/tests/unit/loader/plan_test.py index 70ae2ad5..4c92e8d5 100644 --- a/tests/unit/loader/plan_test.py +++ b/tests/unit/loader/plan_test.py @@ -13,15 +13,18 @@ from qtip.collector.logfile import LogfileCollector from qtip.loader.plan import load_collector from qtip.loader.plan import Plan from qtip.loader.plan import PlanProp -from qtip.loader.plan import QPISpec -def test_init(plan): - assert plan.name == 'doctor performance profiling' - assert isinstance(plan.content, dict) - for qpi in plan.qpis: - assert isinstance(qpi, QPISpec) +def test_construct(benchmarks_root): + sample = Plan('sample.yaml') + assert isinstance(sample, Plan) + # fixture can not be used in pytest.mark.parametrized + sample = Plan('sample.yaml', [benchmarks_root]) + assert isinstance(sample, Plan) + + +def test_invalid_construct(): with pytest.raises(TypeError) as excinfo: Plan() assert '__init__() takes at least 2 arguments (1 given)' \ @@ -30,7 +33,7 @@ def test_init(plan): def test_list_all(benchmarks_root): plan_list = list(Plan.list_all(paths=[benchmarks_root])) - assert len(plan_list) is 2 + assert len(plan_list) is 3 for desc in plan_list: assert PlanProp.NAME in desc assert PlanProp.ABSPATH in desc -- cgit 1.2.3-korg