mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 15:12:25 +00:00 
			
		
		
		
	Adding ChromeOS power_LoadTest
This commit is contained in:
		
							
								
								
									
										119
									
								
								wlauto/workloads/power_loadtest/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								wlauto/workloads/power_loadtest/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | #    Copyright 2015 ARM Limited | ||||||
|  | # | ||||||
|  | # 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. | ||||||
|  | # | ||||||
|  | # pylint: disable=attribute-defined-outside-init | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from wlauto import Workload, Parameter | ||||||
|  | from wlauto.exceptions import WorkloadError | ||||||
|  | from wlauto.utils.misc import which, check_output | ||||||
|  | from wlauto.utils.types import arguments, numeric | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Location of the power_LoadTest under the chroot | ||||||
|  | #POWER_LOADTEST_DIR = '/mnt/host/source/src/third_party/autotest/files/client/site_tests/power_LoadTest' | ||||||
|  | MARKER = '---------------------------' | ||||||
|  | STATUS_REGEX = re.compile(r'^\S+\s+\[\s*(\S+)\s*\]') | ||||||
|  | METRIC_REGEX = re.compile(r'^\S+\s+(\S+)\s*(\S+)') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PowerLoadtest(Workload): | ||||||
|  |  | ||||||
|  |     name = 'power_loadtest' | ||||||
|  |     description = ''' | ||||||
|  |     power_LoadTest (part of ChromeOS autotest suite) continuously cycles through a set of | ||||||
|  |     browser-based activities and monitors battery drain on a device. | ||||||
|  |  | ||||||
|  |     .. note:: This workload *must* be run inside a CromeOS SDK chroot. | ||||||
|  |  | ||||||
|  |     See: https://www.chromium.org/chromium-os/testing/power-testing | ||||||
|  |  | ||||||
|  |     ''' | ||||||
|  |  | ||||||
|  |     parameters = [ | ||||||
|  |         Parameter('board', default=os.getenv('BOARD'), | ||||||
|  |                   description=''' | ||||||
|  |                   The name of the board to be used for the test. If this is not specified, | ||||||
|  |                   BOARD environment variable will be used. | ||||||
|  |                   '''), | ||||||
|  |         Parameter('variant', | ||||||
|  |                   description=''' | ||||||
|  |                   The variant of the test to run; If not specified, the full power_LoadTest will | ||||||
|  |                   run (until the device battery is drained). The only other variant available in the | ||||||
|  |                   vanilla test is "1hour", but further variants may be added by providing custom | ||||||
|  |                   control files. | ||||||
|  |                   '''), | ||||||
|  |         Parameter('test_that_args', kind=arguments, default='', | ||||||
|  |                   description=''' | ||||||
|  |                   Extra arguments to be passed to test_that_invocation. | ||||||
|  |                   '''), | ||||||
|  |         Parameter('run_timeout', kind=int, default=24 * 60 * 60, | ||||||
|  |                   description=''' | ||||||
|  |                   Timeout, in seconds, for the test execution. | ||||||
|  |                   '''), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     def setup(self, context): | ||||||
|  |         if self.device.platform != 'chromeos': | ||||||
|  |             raise WorkloadError('{} only supports ChromeOS devices'.format(self.name)) | ||||||
|  |         self.test_that = which('test_that') | ||||||
|  |         if not self.test_that: | ||||||
|  |             message = ('Could not find "test_that"; {} must be running in a ChromeOS SDK chroot ' | ||||||
|  |                        '(did you execute "cros_sdk"?)') | ||||||
|  |             raise WorkloadError(message.format(self.name)) | ||||||
|  |         self.command = self._build_command() | ||||||
|  |         self.raw_output = None | ||||||
|  |  | ||||||
|  |     def run(self, context): | ||||||
|  |         self.logger.debug(self.command) | ||||||
|  |         self.raw_output, _ = check_output(self.command, timeout=self.run_timeout, shell=True) | ||||||
|  |  | ||||||
|  |     def update_result(self, context): | ||||||
|  |         if not self.raw_output: | ||||||
|  |             self.logger.warning('No power_LoadTest output detected; run failed?') | ||||||
|  |             return | ||||||
|  |         raw_outfile = os.path.join(context.output_directory, 'power_loadtest.raw') | ||||||
|  |         with open(raw_outfile, 'w') as wfh: | ||||||
|  |             wfh.write(self.raw_output) | ||||||
|  |         context.add_artifact('power_LoadTest_raw', raw_outfile, kind='raw') | ||||||
|  |         lines = iter(self.raw_output.split('\n')) | ||||||
|  |         # Results are delimitted from the rest of the output by MARKER | ||||||
|  |         for line in lines: | ||||||
|  |             if MARKER in line: | ||||||
|  |                 break | ||||||
|  |         for line in lines: | ||||||
|  |             match = STATUS_REGEX.search(line) | ||||||
|  |             if match: | ||||||
|  |                 status = match.group(1) | ||||||
|  |                 if status != 'PASSED': | ||||||
|  |                     self.logger.warning(line) | ||||||
|  |             match = METRIC_REGEX.search(line) | ||||||
|  |             if match: | ||||||
|  |                 try: | ||||||
|  |                     context.result.add_metric(match.group(1), numeric(match.group(2)), lower_is_better=True) | ||||||
|  |                 except ValueError: | ||||||
|  |                     pass  # non-numeric metrics aren't supported | ||||||
|  |  | ||||||
|  |     def _build_command(self): | ||||||
|  |         test_name = 'power_LoadTest' | ||||||
|  |         if self.variant: | ||||||
|  |             test_name += '.' + self.variant | ||||||
|  |         parts = [self.test_that, self.device.host, test_name] | ||||||
|  |         if self.board: | ||||||
|  |             parts.append('-b {}'.format(self.board)) | ||||||
|  |         parts.append(str(self.test_that_args)) | ||||||
|  |         return ' '.join(parts) | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user