diff options
-rw-r--r-- | meta/lib/oeqa/buildperf/__init__.py | 4 | ||||
-rw-r--r-- | meta/lib/oeqa/buildperf/base.py | 67 |
2 files changed, 33 insertions, 38 deletions
diff --git a/meta/lib/oeqa/buildperf/__init__.py b/meta/lib/oeqa/buildperf/__init__.py index c816bd23c9..add3be2944 100644 --- a/meta/lib/oeqa/buildperf/__init__.py +++ b/meta/lib/oeqa/buildperf/__init__.py | |||
@@ -10,6 +10,8 @@ | |||
10 | # more details. | 10 | # more details. |
11 | # | 11 | # |
12 | """Build performance tests""" | 12 | """Build performance tests""" |
13 | from .base import (perf_test_case, BuildPerfTest, BuildPerfTestRunner, | 13 | from .base import (perf_test_case, |
14 | BuildPerfTestCase, | ||
15 | BuildPerfTestRunner, | ||
14 | KernelDropCaches) | 16 | KernelDropCaches) |
15 | from .test_basic import * | 17 | from .test_basic import * |
diff --git a/meta/lib/oeqa/buildperf/base.py b/meta/lib/oeqa/buildperf/base.py index 1eb21f6813..53ac9764a2 100644 --- a/meta/lib/oeqa/buildperf/base.py +++ b/meta/lib/oeqa/buildperf/base.py | |||
@@ -19,6 +19,7 @@ import socket | |||
19 | import tempfile | 19 | import tempfile |
20 | import time | 20 | import time |
21 | import traceback | 21 | import traceback |
22 | import unittest | ||
22 | from datetime import datetime, timedelta | 23 | from datetime import datetime, timedelta |
23 | 24 | ||
24 | from oeqa.utils.commands import runCmd, get_bb_vars | 25 | from oeqa.utils.commands import runCmd, get_bb_vars |
@@ -191,50 +192,34 @@ def perf_test_case(obj): | |||
191 | return obj | 192 | return obj |
192 | 193 | ||
193 | 194 | ||
194 | class BuildPerfTest(object): | 195 | class BuildPerfTestCase(unittest.TestCase): |
195 | """Base class for build performance tests""" | 196 | """Base class for build performance tests""" |
196 | SYSRES = 'sysres' | 197 | SYSRES = 'sysres' |
197 | DISKUSAGE = 'diskusage' | 198 | DISKUSAGE = 'diskusage' |
198 | 199 | ||
199 | name = None | 200 | def __init__(self, *args, **kwargs): |
200 | description = None | 201 | super(BuildPerfTestCase, self).__init__(*args, **kwargs) |
201 | 202 | self.name = self._testMethodName | |
202 | def __init__(self, out_dir): | 203 | self.out_dir = None |
203 | self.out_dir = out_dir | 204 | self.start_time = None |
204 | self.results = {'name':self.name, | 205 | self.elapsed_time = None |
205 | 'description': self.description, | 206 | self.measurements = [] |
206 | 'status': 'NOTRUN', | ||
207 | 'start_time': None, | ||
208 | 'elapsed_time': None, | ||
209 | 'measurements': []} | ||
210 | if not os.path.exists(self.out_dir): | ||
211 | os.makedirs(self.out_dir) | ||
212 | if not self.name: | ||
213 | self.name = self.__class__.__name__ | ||
214 | self.bb_vars = get_bb_vars() | 207 | self.bb_vars = get_bb_vars() |
215 | # TODO: remove the _failed flag when globalres.log is ditched as all | 208 | # TODO: remove 'times' and 'sizes' arrays when globalres support is |
216 | # failures should raise an exception | 209 | # removed |
217 | self._failed = False | 210 | self.times = [] |
218 | self.cmd_log = os.path.join(self.out_dir, 'commands.log') | 211 | self.sizes = [] |
219 | 212 | ||
220 | def run(self): | 213 | def run(self, *args, **kwargs): |
221 | """Run test""" | 214 | """Run test""" |
222 | self.results['status'] = 'FAILED' | 215 | self.start_time = datetime.now() |
223 | self.results['start_time'] = datetime.now() | 216 | super(BuildPerfTestCase, self).run(*args, **kwargs) |
224 | self._run() | 217 | self.elapsed_time = datetime.now() - self.start_time |
225 | self.results['elapsed_time'] = (datetime.now() - | ||
226 | self.results['start_time']) | ||
227 | # Test is regarded as completed if it doesn't raise an exception | ||
228 | if not self._failed: | ||
229 | self.results['status'] = 'COMPLETED' | ||
230 | |||
231 | def _run(self): | ||
232 | """Actual test payload""" | ||
233 | raise NotImplementedError | ||
234 | 218 | ||
235 | def log_cmd_output(self, cmd): | 219 | def log_cmd_output(self, cmd): |
236 | """Run a command and log it's output""" | 220 | """Run a command and log it's output""" |
237 | with open(self.cmd_log, 'a') as fobj: | 221 | cmd_log = os.path.join(self.out_dir, 'commands.log') |
222 | with open(cmd_log, 'a') as fobj: | ||
238 | runCmd(cmd, stdout=fobj) | 223 | runCmd(cmd, stdout=fobj) |
239 | 224 | ||
240 | def measure_cmd_resources(self, cmd, name, legend): | 225 | def measure_cmd_resources(self, cmd, name, legend): |
@@ -255,7 +240,8 @@ class BuildPerfTest(object): | |||
255 | 240 | ||
256 | cmd_str = cmd if isinstance(cmd, str) else ' '.join(cmd) | 241 | cmd_str = cmd if isinstance(cmd, str) else ' '.join(cmd) |
257 | log.info("Timing command: %s", cmd_str) | 242 | log.info("Timing command: %s", cmd_str) |
258 | with open(self.cmd_log, 'a') as fobj: | 243 | cmd_log = os.path.join(self.out_dir, 'commands.log') |
244 | with open(cmd_log, 'a') as fobj: | ||
259 | ret, timedata = time_cmd(cmd, stdout=fobj) | 245 | ret, timedata = time_cmd(cmd, stdout=fobj) |
260 | if ret.status: | 246 | if ret.status: |
261 | log.error("Time will be reported as 0. Command failed: %s", | 247 | log.error("Time will be reported as 0. Command failed: %s", |
@@ -270,12 +256,17 @@ class BuildPerfTest(object): | |||
270 | 'name': name, | 256 | 'name': name, |
271 | 'legend': legend} | 257 | 'legend': legend} |
272 | measurement['values'] = {'elapsed_time': etime} | 258 | measurement['values'] = {'elapsed_time': etime} |
273 | self.results['measurements'].append(measurement) | 259 | self.measurements.append(measurement) |
260 | e_sec = etime.total_seconds() | ||
274 | nlogs = len(glob.glob(self.out_dir + '/results.log*')) | 261 | nlogs = len(glob.glob(self.out_dir + '/results.log*')) |
275 | results_log = os.path.join(self.out_dir, | 262 | results_log = os.path.join(self.out_dir, |
276 | 'results.log.{}'.format(nlogs + 1)) | 263 | 'results.log.{}'.format(nlogs + 1)) |
277 | with open(results_log, 'w') as fobj: | 264 | with open(results_log, 'w') as fobj: |
278 | fobj.write(timedata) | 265 | fobj.write(timedata) |
266 | # Append to 'times' array for globalres log | ||
267 | self.times.append('{:d}:{:02d}:{:.2f}'.format(int(e_sec / 3600), | ||
268 | int((e_sec % 3600) / 60), | ||
269 | e_sec % 60)) | ||
279 | 270 | ||
280 | def measure_disk_usage(self, path, name, legend): | 271 | def measure_disk_usage(self, path, name, legend): |
281 | """Estimate disk usage of a file or directory""" | 272 | """Estimate disk usage of a file or directory""" |
@@ -293,7 +284,9 @@ class BuildPerfTest(object): | |||
293 | 'name': name, | 284 | 'name': name, |
294 | 'legend': legend} | 285 | 'legend': legend} |
295 | measurement['values'] = {'size': size} | 286 | measurement['values'] = {'size': size} |
296 | self.results['measurements'].append(measurement) | 287 | self.measurements.append(measurement) |
288 | # Append to 'sizes' array for globalres log | ||
289 | self.sizes.append(str(size)) | ||
297 | 290 | ||
298 | def save_buildstats(self): | 291 | def save_buildstats(self): |
299 | """Save buildstats""" | 292 | """Save buildstats""" |