def invoke_sub(self): tip_msg = self.get_tip_msg("Run test") self.say_begin(tip_msg) if not self.test_installed(self.args.test_id): raise LavaCommandError( "The test (%s) has not been installed yet." % self.args.test_id) test = TestProvider().load_test(self.args.test_id, self.args.serial) if not self.test_installed(test.testname): raise LavaCommandError( "The test (%s) has not been installed yet." % self.args.test_id) try: result_id = test.run(quiet=self.args.quiet, run_options=self.args.run_option) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) bundle = generate_bundle(self.args.serial, result_id) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, bundle) except Exception as strerror: raise LavaCommandError("Test execution error: %s" % strerror) self.say_end(tip_msg)
def _write_results_bundle(self, bundle): rdir = self.context.host_result_dir (fd, name) = tempfile.mkstemp(prefix='lava-command', suffix='.bundle', dir=rdir) with os.fdopen(fd, 'w') as f: DocumentIO.dump(f, bundle)
def invoke_sub(self): tip_msg = self.get_tip_msg("Run test") self.say_begin(tip_msg) if not self.test_installed(self.args.test_id): raise LavaCommandError( "The test (%s) has not been installed yet." % self.args.test_id) test = TestProvider().load_test(self.args.test_id, self.args.serial) if not self.test_installed(test.testname): raise LavaCommandError( "The test (%s) has not been installed yet." % self.args.test_id) try: result_id = test.run(quiet=self.args.quiet, run_options=self.args.run_option) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) bundle = generate_bundle(self.args.serial, result_id) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, bundle) except Exception as strerror: raise LavaCommandError("Test execution error: %s" % strerror) self.say_end(tip_msg)
def _bundle_results(self, target, signal_director, testdef_objs): """ Pulls the results from the target device and builds a bundle """ results_part = target.deployment_data['lava_test_results_part_attr'] results_part = getattr(target.config, results_part) rdir = self.context.host_result_dir parse_err_msg = None filesystem_access_failure = True try: with target.file_system(results_part, target.lava_test_results_dir) as d: filesystem_access_failure = False err_log = os.path.join(d, 'parse_err.log') results_dir = os.path.join(d, 'results') bundle = lava_test_shell.get_bundle(results_dir, testdef_objs, err_log) parse_err_msg = read_content(err_log, ignore_missing=True) if os.path.isfile(err_log): os.unlink(err_log) # lava/results must be empty, but we keep a copy named # lava/results-XXXXXXXXXX for post-mortem analysis timestamp = datetime.now().strftime("%s") os.rename(results_dir, results_dir + '-' + timestamp) utils.ensure_directory(results_dir) except Exception as e: if filesystem_access_failure: # a failure when accessing the filesystem means the device # probably crashed. We use the backup bundle then. bundle = self._backup_bundle logging.warning( """Error extracting test results from device: %s""" % e) logging.warning( """This may mean that the device under test crashed. """ """We will use test results parsed from the serial """ """output as a backup, but note that some test """ """artifacts (such as attachments and """ """hardware/software contexts) will not be available""") else: raise e signal_director.postprocess_bundle(bundle) (fd, name) = tempfile.mkstemp( prefix='lava-test-shell', suffix='.bundle', dir=rdir) with os.fdopen(fd, 'w') as f: DocumentIO.dump(f, bundle) printer = PrettyPrinter(self.context) printer.print_results(bundle) if parse_err_msg: raise GeneralError(parse_err_msg)
def _write_results_bundle(self, bundle): rdir = self.context.host_result_dir (fd, name) = tempfile.mkstemp( prefix='lava-command', suffix='.bundle', dir=rdir) with os.fdopen(fd, 'w') as f: DocumentIO.dump(f, bundle)
def test_dump_produces_compact_sorted_output(self): stream = StringIO() DocumentIO.dump(stream, self.doc, human_readable=False, sort_keys=True) observed_text = stream.getvalue() self.assertEqual(observed_text, self.expected_compact_sorted_text)
def invoke_sub(self): if not utils.check_command_exist('monkeyrunner'): raise LavaCommandError('The command monkeyrunner can not be found') if self.args.repo_type == 'git': target_dir = mkdtemp(prefix='git_repo', dir=self.config.tempdir_host) os.chmod(target_dir, 0755) GitRepository(self.args.url).checkout(target_dir) else: raise LavaCommandError("The repository type(%s) is not supported" % self.args.repo_type) script_list = utils.find_files(target_dir, '.py') test_id = self.args.url if len(test_id) > 40: test_id = '%s...' % (test_id[:40]) test_id = 'monkeyrunner_%s' % test_id tip_msg = ("Run monkeyrunner scripts in following url on device(%s):" "\n\turl=%s") % (self.serial, self.args.url) self.say_begin(tip_msg) bundles = [] for script in script_list: if "monkeycommon.py" == os.path.basename(script): continue sub_bundle = {} from datetime import datetime starttime = datetime.utcnow() test_case_id = script.replace('%s/' % target_dir, '') if len(test_case_id) > 50: test_case_id = '%s...' % (test_case_id[:50]) try: sub_bundle = self.run_monkeyrunner_test( script, self.serial, test_case_id) test_result = {"test_case_id": test_case_id, "result": 'pass'} if sub_bundle: sub_bundle['test_runs'][0]['test_results'].append( test_result) except Exception as strerror: self.say('Failed to run script(%s) with error:\n%s' % (script, strerror)) test_result = {"test_case_id": test_case_id, "result": 'fail'} TIMEFORMAT = '%Y-%m-%dT%H:%M:%SZ' sub_bundle['test_runs'] = [{ 'test_results': [test_result], 'test_id': 'monkeyrunner(%s)' % test_case_id, 'time_check_performed': False, 'analyzer_assigned_uuid': str(uuid4()), 'analyzer_assigned_date': starttime.strftime(TIMEFORMAT) }] if sub_bundle: bundles.append(sub_bundle) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, merge_bundles(bundles)) self.say_end(tip_msg)
def invoke_sub(self): test_name = 'custom' ADB_SHELL_STEPS = [] STEPS_HOST_PRE = [] STEPS_ADB_PRE = [] file_name = None if self.args.android_command: ADB_SHELL_STEPS = self.args.android_command cmds_str = ','.join(ADB_SHELL_STEPS) if len(cmds_str) > 40: cmds_str = '%s...' % (cmds_str[:40]) test_name_suffix = 'command=[%s]' % (cmds_str) elif self.args.command_file: file_url = self.args.command_file urlpath = urlparse.urlsplit(file_url).path file_name = os.path.basename(urlpath) target_path = os.path.join(self.config.installdir_android, test_name, file_name) STEPS_HOST_PRE = ["wget %s -O %s" % (file_url, file_name)] STEPS_ADB_PRE = ["push %s %s" % (file_name, target_path)] ADB_SHELL_STEPS = ["chmod 777 %s" % target_path, target_path] file_name_str = file_name if len(file_name_str) > 40: file_name_str = '%s...' % (cmds_str[:40]) test_name_suffix = 'command_file=%s' % (file_name_str) PATTERN = None if self.args.parse_regex: PATTERN = self.args.parse_regex tip_msg = '' if self.args.serial: tip_msg = ("Run following custom test(s) on device(%s):" "\n\tcommands=%s" "\n\tcommand-file=%s\n") % ( self.args.serial, '\n\t\t'.join(ADB_SHELL_STEPS), file_name) else: tip_msg = ("Run following custom test(s):" "\n\t\tcommands=%s" "\n\tcommand-file=%s\n") % ( '\n\t\t'.join(ADB_SHELL_STEPS), file_name) self.say_begin(tip_msg) inst = AndroidTestInstaller() run = AndroidTestRunner(steps_host_pre=STEPS_HOST_PRE, steps_adb_pre=STEPS_ADB_PRE, adbshell_steps=ADB_SHELL_STEPS) parser = AndroidTestParser(pattern=PATTERN) test = AndroidTest(testname=test_name, installer=inst, runner=run, parser=parser) test.parser.results = {'test_results': []} test.setadb(self.adb) if not self.test_installed(test.testname): test.install() try: result_id = test.run(quiet=self.args.quiet) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) bundle = generate_bundle(self.args.serial, result_id, test=test, test_id='%s(%s)' % (test_name, test_name_suffix)) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, bundle) except Exception as strerror: raise LavaCommandError("Test execution error: %s" % strerror) self.say_end(tip_msg)
def invoke_sub(self): if not utils.check_command_exist('monkeyrunner'): raise LavaCommandError('The command monkeyrunner can not be found') if self.args.repo_type == 'git': target_dir = mkdtemp(prefix='git_repo', dir=self.config.tempdir_host) os.chmod(target_dir, 0755) GitRepository(self.args.url).checkout(target_dir) else: raise LavaCommandError("The repository type(%s) is not supported" % self.args.repo_type) script_list = utils.find_files(target_dir, '.py') test_id = self.args.url if len(test_id) > 40: test_id = '%s...' % (test_id[:40]) test_id = 'monkeyrunner_%s' % test_id tip_msg = ("Run monkeyrunner scripts in following url on device(%s):" "\n\turl=%s") % ( self.serial, self.args.url) self.say_begin(tip_msg) bundles = [] for script in script_list: if "monkeycommon.py" == os.path.basename(script): continue sub_bundle = {} from datetime import datetime starttime = datetime.utcnow() test_case_id = script.replace('%s/' % target_dir, '') if len(test_case_id) > 50: test_case_id = '%s...' % (test_case_id[:50]) try: sub_bundle = self.run_monkeyrunner_test(script, self.serial, test_case_id) test_result = {"test_case_id": test_case_id, "result": 'pass'} if sub_bundle: sub_bundle['test_runs'][0]['test_results'].append( test_result) except Exception as strerror: self.say('Failed to run script(%s) with error:\n%s' % ( script, strerror)) test_result = {"test_case_id": test_case_id, "result": 'fail'} TIMEFORMAT = '%Y-%m-%dT%H:%M:%SZ' sub_bundle['test_runs'] = [{'test_results': [test_result], 'test_id': 'monkeyrunner(%s)' % test_case_id, 'time_check_performed': False, 'analyzer_assigned_uuid': str(uuid4()), 'analyzer_assigned_date': starttime.strftime(TIMEFORMAT)}] if sub_bundle: bundles.append(sub_bundle) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, merge_bundles(bundles)) self.say_end(tip_msg)
def invoke_sub(self): test_name = 'custom' ADB_SHELL_STEPS = [] STEPS_HOST_PRE = [] STEPS_ADB_PRE = [] file_name = None if self.args.android_command: ADB_SHELL_STEPS = self.args.android_command cmds_str = ','.join(ADB_SHELL_STEPS) if len(cmds_str) > 40: cmds_str = '%s...' % (cmds_str[:40]) test_name_suffix = 'command=[%s]' % (cmds_str) elif self.args.command_file: file_url = self.args.command_file urlpath = urlparse.urlsplit(file_url).path file_name = os.path.basename(urlpath) target_path = os.path.join(self.config.installdir_android, test_name, file_name) STEPS_HOST_PRE = ["wget %s -O %s" % (file_url, file_name)] STEPS_ADB_PRE = ["push %s %s" % (file_name, target_path)] ADB_SHELL_STEPS = ["chmod 777 %s" % target_path, target_path] file_name_str = file_name if len(file_name_str) > 40: file_name_str = '%s...' % (cmds_str[:40]) test_name_suffix = 'command_file=%s' % (file_name_str) PATTERN = None if self.args.parse_regex: PATTERN = self.args.parse_regex tip_msg = '' if self.args.serial: tip_msg = ("Run following custom test(s) on device(%s):" "\n\tcommands=%s" "\n\tcommand-file=%s\n") % ( self.args.serial, '\n\t\t'.join(ADB_SHELL_STEPS), file_name) else: tip_msg = ("Run following custom test(s):" "\n\t\tcommands=%s" "\n\tcommand-file=%s\n") % ( '\n\t\t'.join(ADB_SHELL_STEPS), file_name) self.say_begin(tip_msg) inst = AndroidTestInstaller() run = AndroidTestRunner(steps_host_pre=STEPS_HOST_PRE, steps_adb_pre=STEPS_ADB_PRE, adbshell_steps=ADB_SHELL_STEPS) parser = AndroidTestParser(pattern=PATTERN) test = AndroidTest(testname=test_name, installer=inst, runner=run, parser=parser) test.parser.results = {'test_results': []} test.setadb(self.adb) if not self.test_installed(test.testname): test.install() try: result_id = test.run(quiet=self.args.quiet) if self.args.output: output_dir = os.path.dirname(self.args.output) if output_dir and (not os.path.exists(output_dir)): os.makedirs(output_dir) bundle = generate_bundle(self.args.serial, result_id, test=test, test_id='%s(%s)' % (test_name, test_name_suffix)) with open(self.args.output, "wt") as stream: DocumentIO.dump(stream, bundle) except Exception as strerror: raise LavaCommandError("Test execution error: %s" % strerror) self.say_end(tip_msg)
def test_dump_produces_compact_sorted_output(self): stream = StringIO() DocumentIO.dump(stream, self.doc, human_readable=False, sort_keys=True) observed_text = stream.getvalue() self.assertEqual(observed_text, self.expected_compact_sorted_text)