Lines Matching full:self
77 def __init__(self): argument
78 self.starttime = None
79 self.returncode = None
80 self.runtime = ''
81 self.stdout = []
82 self.stderr = []
83 self.kmemleak = ''
84 self.result = ''
86 def done(self, proc, killed, reran): argument
91 m, s = divmod(monotonic_time() - self.starttime, 60)
92 self.runtime = '%02d:%02d' % (m, s)
93 self.returncode = proc.returncode
97 self.result = 'KILLED'
99 elif len(self.kmemleak) > 0:
100 self.result = 'FAIL'
102 elif self.returncode == 0:
103 self.result = 'PASS'
105 elif self.returncode == 4:
106 self.result = 'SKIP'
108 elif self.returncode != 0:
109 self.result = 'FAIL'
118 def __init__(self, stream, debug=False): argument
119 self.stream = stream
120 self.debug = debug
121 self._buf = b''
122 self.lines = []
124 def fileno(self): argument
125 return self.stream.fileno()
127 def read(self, drain=0): argument
131 while self._read() is not None:
135 def _read(self): argument
142 fd = self.fileno()
146 if self.debug:
149 self._buf += buf
152 buf = self._buf + buf
154 self._buf = rest
157 self.lines += [(now, r) for r in rows]
163 def __init__(self, pathname, identifier=None, outputdir=None, argument
165 self.pathname = pathname
166 self.identifier = identifier
167 self.outputdir = outputdir or 'BASEDIR'
171 self.timeout = timeout
172 self.user = user or ''
173 self.killed = False
174 self.reran = None
175 self.result = Result()
177 if self.timeout is None:
178 self.timeout = 60
180 def __str__(self): argument
187 ''' % (self.pathname, self.identifier, self.outputdir, self.timeout, self.user)
189 def kill_cmd(self, proc, options, kmemleak, keyboard_interrupt=False): argument
194 self.killed = True
195 do_sudo = len(self.user) != 0
214 if keyboard_interrupt is False and self.reran is None:
215 runtime = monotonic_time() - self.result.starttime
216 if int(self.timeout) > runtime:
217 self.killed = False
218 self.reran = False
219 self.run(options, dryrun=False, kmemleak=kmemleak)
220 self.reran = True
222 def update_cmd_privs(self, cmd, user): argument
254 def collect_output(self, proc, debug=False): argument
273 def run(self, options, dryrun=None, kmemleak=None): argument
282 print(self)
287 privcmd = self.update_cmd_privs(self.pathname, self.user)
290 if not os.path.isdir(self.outputdir):
291 os.makedirs(self.outputdir, mode=0o777)
303 f"echo ZTS run {self.pathname} > /dev/kmsg"])
315 f"echo ZTS run {self.pathname} > /dev/ttyu0"])
320 self.result.starttime = monotonic_time()
328 if int(self.timeout) == 0:
329 self.timeout = sys.maxsize / (10 ** 9)
331 int(self.timeout), self.kill_cmd, [proc, options, kmemleak]
337 out, err = self.collect_output(proc, options.debug)
338 self.result.stdout = out
339 self.result.stderr = err
345 self.result.kmemleak = check_output(cmd, shell=True)
347 self.kill_cmd(proc, options, kmemleak, True)
352 if self.reran is not False:
353 self.result.done(proc, self.killed, self.reran)
355 def skip(self): argument
362 self.result.stdout = self.result.stderr = []
363 self.result.starttime = monotonic_time()
364 m, s = divmod(monotonic_time() - self.result.starttime, 60)
365 self.result.runtime = '%02d:%02d' % (m, s)
366 self.result.result = 'SKIP'
368 def log(self, options, suppress_console=False): argument
380 if self.reran is True:
382 user = ' (run as %s)' % (self.user if len(self.user) else logname)
383 if self.identifier:
384 msga = 'Test (%s): %s%s ' % (self.identifier, self.pathname, user)
386 msga = 'Test: %s%s ' % (self.pathname, user)
387 msgb = '[%s] [%s]%s\n' % (self.result.runtime, self.result.result, rer)
399 elif options.quiet and self.result.result != 'PASS':
402 lines = sorted(self.result.stdout + self.result.stderr,
412 if len(self.result.stdout):
413 with open(os.path.join(self.outputdir, 'stdout'), 'wb') as out:
414 for _, line in self.result.stdout:
416 if len(self.result.stderr):
417 with open(os.path.join(self.outputdir, 'stderr'), 'wb') as err:
418 for _, line in self.result.stderr:
420 if len(self.result.stdout) and len(self.result.stderr):
421 with open(os.path.join(self.outputdir, 'merged'), 'wb') as merged:
424 if len(self.result.kmemleak):
425 with open(os.path.join(self.outputdir, 'kmemleak'), 'wb') as kmem:
426 kmem.write(self.result.kmemleak)
433 def __init__(self, pathname, argument
436 super(Test, self).__init__(pathname, **kwargs)
437 self.pre = pre or ''
438 self.pre_user = pre_user or ''
439 self.post = post or ''
440 self.post_user = post_user or ''
441 self.failsafe = failsafe or ''
442 self.failsafe_user = failsafe_user or ''
443 self.tags = tags or []
445 def __str__(self): argument
447 if len(self.pre_user):
448 pre_user = ' (as %s)' % (self.pre_user)
449 if len(self.post_user):
450 post_user = ' (as %s)' % (self.post_user)
451 if len(self.failsafe_user):
452 failsafe_user = ' (as %s)' % (self.failsafe_user)
463 ''' % (self.pathname, self.identifier, self.outputdir, self.timeout, self.user,
464 self.pre, pre_user, self.post, post_user, self.failsafe,
465 failsafe_user, self.tags)
467 def verify(self): argument
472 files = [self.pre, self.pathname, self.post, self.failsafe]
473 users = [self.pre_user, self.user, self.post_user, self.failsafe_user]
484 self.pathname, LOG_ERR)
489 def run(self, options, dryrun=None, kmemleak=None): argument
495 odir = os.path.join(self.outputdir, os.path.basename(self.pre))
496 pretest = Cmd(self.pre, identifier=self.identifier, outputdir=odir,
497 timeout=self.timeout, user=self.pre_user)
498 test = Cmd(self.pathname, identifier=self.identifier,
499 outputdir=self.outputdir, timeout=self.timeout,
500 user=self.user)
501 odir = os.path.join(self.outputdir, os.path.basename(self.failsafe))
502 failsafe = Cmd(self.failsafe, identifier=self.identifier,
503 outputdir=odir, timeout=self.timeout,
504 user=self.failsafe_user)
505 odir = os.path.join(self.outputdir, os.path.basename(self.post))
506 posttest = Cmd(self.post, identifier=self.identifier, outputdir=odir,
507 timeout=self.timeout, user=self.post_user)
533 def __init__(self, pathname, tests=None, **kwargs): argument
534 super(TestGroup, self).__init__(pathname, **kwargs)
535 self.tests = tests or []
537 def __str__(self): argument
539 if len(self.pre_user):
540 pre_user = ' (as %s)' % (self.pre_user)
541 if len(self.post_user):
542 post_user = ' (as %s)' % (self.post_user)
543 if len(self.failsafe_user):
544 failsafe_user = ' (as %s)' % (self.failsafe_user)
556 ''' % (self.pathname, self.identifier, self.outputdir, self.tests,
557 self.timeout, self.user, self.pre, pre_user, self.post, post_user,
558 self.failsafe, failsafe_user, self.tags)
560 def filter(self, keeplist): argument
561 self.tests = [x for x in self.tests if x in keeplist]
563 def verify(self): argument
571 if len(self.pre) and not os.path.isabs(self.pre):
572 self.pre = os.path.join(self.pathname, self.pre)
573 if len(self.post) and not os.path.isabs(self.post):
574 self.post = os.path.join(self.pathname, self.post)
575 if len(self.failsafe) and not os.path.isabs(self.failsafe):
576 self.post = os.path.join(self.pathname, self.post)
578 auxfiles = [self.pre, self.post, self.failsafe]
579 users = [self.pre_user, self.user, self.post_user, self.failsafe_user]
582 if f != self.failsafe and self.pathname != os.path.dirname(f):
585 "directory.\n" % (self.pathname, f), LOG_ERR)
591 (self.pathname, f), LOG_ERR)
597 self.pathname, LOG_ERR)
601 for test in self.tests:
602 if not verify_file(os.path.join(self.pathname, test)):
603 del self.tests[self.tests.index(test)]
606 (test, self.pathname), LOG_ERR)
608 return len(self.tests) != 0
610 def run(self, options, dryrun=None, kmemleak=None): argument
617 if options.tags and not set(self.tags).intersection(set(options.tags)):
620 odir = os.path.join(self.outputdir, os.path.basename(self.pre))
621 pretest = Cmd(self.pre, outputdir=odir, timeout=self.timeout,
622 user=self.pre_user, identifier=self.identifier)
623 odir = os.path.join(self.outputdir, os.path.basename(self.post))
624 posttest = Cmd(self.post, outputdir=odir, timeout=self.timeout,
625 user=self.post_user, identifier=self.identifier)
633 for fname in self.tests:
634 odir = os.path.join(self.outputdir, fname)
635 test = Cmd(os.path.join(self.pathname, fname), outputdir=odir,
636 timeout=self.timeout, user=self.user,
637 identifier=self.identifier)
638 odir = os.path.join(odir, os.path.basename(self.failsafe))
639 failsafe = Cmd(self.failsafe, outputdir=odir, timeout=self.timeout,
640 user=self.failsafe_user, identifier=self.identifier)
659 def __init__(self, options): argument
660 self.tests = {}
661 self.testgroups = {}
662 self.starttime = time()
663 self.timestamp = datetime.now().strftime('%Y%m%dT%H%M%S')
664 self.outputdir = os.path.join(options.outputdir, self.timestamp)
665 self.setup_logging(options)
666 self.defaults = [
681 def __str__(self): argument
682 s = 'TestRun:\n outputdir: %s\n' % self.outputdir
684 for key in sorted(self.tests.keys()):
685 s += '%s%s' % (self.tests[key].__str__(), '\n')
687 for key in sorted(self.testgroups.keys()):
688 s += '%s%s' % (self.testgroups[key].__str__(), '\n')
691 def addtest(self, pathname, options): argument
702 self.tests[pathname] = test
704 def addtestgroup(self, dirname, filenames, options): argument
710 if dirname not in self.testgroups:
720 self.testgroups[dirname] = testgroup
721 self.testgroups[dirname].tests = sorted(filenames)
725 def filter(self, keeplist): argument
726 for group in list(self.testgroups.keys()):
728 del self.testgroups[group]
731 g = self.testgroups[group]
738 for test in list(self.tests.keys()):
741 del self.tests[test]
743 def read(self, options): argument
763 setattr(self, opt, os.path.join(outputdir, self.timestamp))
765 setattr(self, opt, config.get('DEFAULT', opt))
795 setattr(self, opt,
797 self.timestamp))
806 self.testgroups[section] = testgroup
818 setattr(self, opt,
820 self.timestamp))
825 self.tests[section] = test
827 def write(self, options): argument
838 self.defaults])
841 for test in sorted(self.tests.keys()):
844 if prop not in self.props:
846 getattr(self.tests[test], prop))
848 for testgroup in sorted(self.testgroups.keys()):
850 config.set(testgroup, 'tests', self.testgroups[testgroup].tests)
852 if prop not in self.props:
854 getattr(self.testgroups[testgroup], prop))
862 def complete_outputdirs(self): argument
877 alltests = dict(list(self.tests.items()) +
878 list(self.testgroups.items()))
879 base = os.path.join(self.outputdir, 'output')
901 def setup_logging(self, options): argument
914 os.makedirs(self.outputdir, mode=0o777)
916 filename = os.path.join(self.outputdir, 'log')
921 def run(self, options): argument
926 os.chdir(self.outputdir)
928 fail('Could not change to directory %s' % self.outputdir)
930 logsymlink = os.path.join(self.outputdir, '../current')
934 os.symlink(self.outputdir, logsymlink)
937 self.outputdir, LOG_ERR)
945 for test in sorted(self.tests.keys()):
946 self.tests[test].run(options)
947 for testgroup in sorted(self.testgroups.keys()):
948 self.testgroups[testgroup].run(options)
951 def summary(self): argument
960 m, s = divmod(time() - self.starttime, 60)
965 print('Log directory:\t%s' % self.outputdir)