diff options
author | Enrico Granata <egranata@apple.com> | 2013-02-08 23:39:18 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2013-02-08 23:39:18 +0000 |
commit | a94ee7da81468a4cba79d9c6d30e6524923722f8 (patch) | |
tree | 59c335062bc0a854b028bbaeba897d3fff380852 | |
parent | cd1201b98c6d3eb089c6019b424ed6f4ef7fd480 (diff) | |
download | bcm5719-llvm-a94ee7da81468a4cba79d9c6d30e6524923722f8.tar.gz bcm5719-llvm-a94ee7da81468a4cba79d9c6d30e6524923722f8.zip |
<rdar://problem/13176279>
The LLDB test suite now shows a progress bar instead of dots when not in verbose mode
If you crave the dots, make your Terminal window smaller than 10 columns :-)
(or ask for a flag to have the dots come back on demand)
llvm-svn: 174777
-rwxr-xr-x | lldb/test/dotest.py | 28 | ||||
-rwxr-xr-x | lldb/test/progress.py | 109 | ||||
-rw-r--r-- | lldb/test/unittest2/runner.py | 23 |
3 files changed, 160 insertions, 0 deletions
diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py index 0330a3585cd..599bfda2649 100755 --- a/lldb/test/dotest.py +++ b/lldb/test/dotest.py @@ -29,6 +29,7 @@ import sys import textwrap import time import unittest2 +import progress def is_exe(fpath): """Returns true if fpath is an executable.""" @@ -1302,6 +1303,30 @@ for ia in range(len(archs) if iterArchs else 1): __singleton__ = None __ignore_singleton__ = False + @staticmethod + def getTerminalSize(): + import os + env = os.environ + def ioctl_GWINSZ(fd): + try: + import fcntl, termios, struct, os + cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, + '1234')) + except: + return + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + def __init__(self, *args): if not LLDBTestResult.__ignore_singleton__ and LLDBTestResult.__singleton__: raise Exception("LLDBTestResult instantiated more than once") @@ -1316,6 +1341,9 @@ for ia in range(len(archs) if iterArchs else 1): self.indentation = ' ' * (counterWidth + 2) # This counts from 1 .. suite.countTestCases(). self.counter = 0 + (width, height) = LLDBTestResult.getTerminalSize() + if width > 10: + self.progressbar = progress.AnimatedProgressBar(stdout=self.stream,start=0,end=suite.countTestCases(),width=width-10) def _exc_info_to_string(self, err, test): """Overrides superclass TestResult's method in order to append diff --git a/lldb/test/progress.py b/lldb/test/progress.py new file mode 100755 index 00000000000..2d400a6e446 --- /dev/null +++ b/lldb/test/progress.py @@ -0,0 +1,109 @@ +#!/usr/bin/python + +import sys +import time + +class ProgressBar(object): + """ProgressBar class holds the options of the progress bar. + The options are: + start State from which start the progress. For example, if start is + 5 and the end is 10, the progress of this state is 50% + end State in which the progress has terminated. + width -- + fill String to use for "filled" used to represent the progress + blank String to use for "filled" used to represent remaining space. + format Format + incremental + """ + light_block = unichr(0x2591).encode("utf-8") + solid_block = unichr(0x2588).encode("utf-8") + solid_right_arrow = unichr(0x25BA).encode("utf-8") + + def __init__(self, + start=0, + end=10, + width=12, + fill=unichr(0x25C9).encode("utf-8"), + blank=unichr(0x25CC).encode("utf-8"), + marker=unichr(0x25CE).encode("utf-8"), + format='[%(fill)s%(marker)s%(blank)s] %(progress)s%%', + incremental=True): + super(ProgressBar, self).__init__() + + self.start = start + self.end = end + self.width = width + self.fill = fill + self.blank = blank + self.marker = marker + self.format = format + self.incremental = incremental + self.step = 100 / float(width) #fix + self.reset() + + def __add__(self, increment): + increment = self._get_progress(increment) + if 100 > self.progress + increment: + self.progress += increment + else: + self.progress = 100 + return self + + def complete(self): + self.progress = 100 + return self + + def __str__(self): + progressed = int(self.progress / self.step) #fix + fill = progressed * self.fill + blank = (self.width - progressed) * self.blank + return self.format % {'fill': fill, 'blank': blank, 'marker': self.marker, 'progress': int(self.progress)} + + __repr__ = __str__ + + def _get_progress(self, increment): + return float(increment * 100) / self.end + + def reset(self): + """Resets the current progress to the start point""" + self.progress = self._get_progress(self.start) + return self + + +class AnimatedProgressBar(ProgressBar): + """Extends ProgressBar to allow you to use it straighforward on a script. + Accepts an extra keyword argument named `stdout` (by default use sys.stdout) + and may be any file-object to which send the progress status. + """ + def __init__(self, + start=0, + end=10, + width=12, + fill=unichr(0x25C9).encode("utf-8"), + blank=unichr(0x25CC).encode("utf-8"), + marker=unichr(0x25CE).encode("utf-8"), + format='[%(fill)s%(marker)s%(blank)s] %(progress)s%%', + incremental=True, + stdout=sys.stdout): + super(AnimatedProgressBar, self).__init__(start,end,width,fill,blank,marker,format,incremental) + self.stdout = stdout + + def show_progress(self): + if hasattr(self.stdout, 'isatty') and self.stdout.isatty(): + self.stdout.write('\r') + else: + self.stdout.write('\n') + self.stdout.write(str(self)) + self.stdout.flush() + + +if __name__ == '__main__': + p = AnimatedProgressBar(end=200, width=200) + + while True: + p + 5 + p.show_progress() + time.sleep(0.3) + if p.progress == 100: + break + print #new line
\ No newline at end of file diff --git a/lldb/test/unittest2/runner.py b/lldb/test/unittest2/runner.py index 15a6f88ec79..accd7f10609 100644 --- a/lldb/test/unittest2/runner.py +++ b/lldb/test/unittest2/runner.py @@ -3,6 +3,7 @@ import sys import time import unittest +import progress from unittest2 import result @@ -45,6 +46,7 @@ class TextTestResult(result.TestResult): self.showAll = verbosity > 1 self.dots = verbosity == 1 self.descriptions = descriptions + self.progressbar = None def getDescription(self, test): doc_first_line = test.shortDescription() @@ -64,6 +66,9 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addSuccess(test) if self.showAll: self.stream.writeln("ok") + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write('.') self.stream.flush() @@ -72,6 +77,9 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addError(test, err) if self.showAll: self.stream.writeln("ERROR") + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write('E') self.stream.flush() @@ -80,6 +88,9 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addFailure(test, err) if self.showAll: self.stream.writeln("FAIL") + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write('F') self.stream.flush() @@ -88,6 +99,9 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addSkip(test, reason) if self.showAll: self.stream.writeln("skipped %r" % (reason,)) + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write("s") self.stream.flush() @@ -96,6 +110,9 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addExpectedFailure(test, err) if self.showAll: self.stream.writeln("expected failure") + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write("x") self.stream.flush() @@ -104,11 +121,17 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addUnexpectedSuccess(test) if self.showAll: self.stream.writeln("unexpected success") + elif self.progressbar: + self.progressbar.__add__(1) + self.progressbar.show_progress() elif self.dots: self.stream.write("u") self.stream.flush() def printErrors(self): + if self.progressbar: + self.progressbar.complete() + self.progressbar.show_progress() if self.dots or self.showAll: self.stream.writeln() self.printErrorList('ERROR', self.errors) |