Fix bug when no paths is given for Plan constructor 77/29277/3
authorYujun Zhang <zhang.yujunz@zte.com.cn>
Thu, 23 Feb 2017 12:51:38 +0000 (20:51 +0800)
committerYujun Zhang <zhang.yujunz@zte.com.cn>
Fri, 24 Feb 2017 03:19:17 +0000 (11:19 +0800)
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 <zhang.yujunz@zte.com.cn>
benchmarks/plan/sample.yaml [new file with mode: 0644]
qtip/collector/logfile.py
qtip/loader/file.py
tests/data/benchmarks/plan/sample.yaml [new file with mode: 0644]
tests/unit/loader/plan_test.py

diff --git a/benchmarks/plan/sample.yaml b/benchmarks/plan/sample.yaml
new file mode 100644 (file)
index 0000000..04e8caf
--- /dev/null
@@ -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: []
index 2c2e532..5f0951c 100644 (file)
@@ -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):
index 038f57d..a39e15f 100644 (file)
@@ -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 (file)
index 0000000..04e8caf
--- /dev/null
@@ -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: []
index 70ae2ad..4c92e8d 100644 (file)
@@ -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