diff -r de8cc85b688a -r 65c5f66e9298 tests/ide_tests/sikuliberemiz.py --- a/tests/ide_tests/sikuliberemiz.py Tue Mar 29 08:50:01 2022 +0200 +++ b/tests/ide_tests/sikuliberemiz.py Thu Apr 07 07:40:32 2022 +0200 @@ -3,6 +3,7 @@ import os import sys import subprocess +import traceback from threading import Thread, Event, Lock from time import time as timesec @@ -33,17 +34,17 @@ "Address": ("l",sikuli.Key.CTRL)} # to reach address bar in GTK's file selector def __init__(self, app): - self.app = app.sikuliapp + self.app = app def __getattr__(self, name): fkey = self.fkeys[name] if type(fkey) != tuple: fkey = (fkey,) - app = self.app def PressShortCut(): - app.focus() + self.app.sikuliapp.focus() sikuli.type(*fkey) + self.app.ReportText("Sending " + name + " shortcut") return PressShortCut @@ -86,6 +87,8 @@ break c = c - 1 + self.ReportScreenShot("UI is idle" if c != 0 else "UI is not idle") + if c == 0: raise Exception("Window did not idle before timeout") @@ -113,6 +116,7 @@ if len(a) == 0 or a is None: break sys.stdout.write(a) + self.ReportOutput(a) self.event.set() if self.pattern is not None and a.find(self.pattern) >= 0: sys.stdout.write("found pattern in '" + a +"'") @@ -126,7 +130,11 @@ """ start_time = timesec() - if self.event.wait(timeout): + wait_result = self.event.wait(timeout) + + self.ReportScreenShot("stdout changed" if wait_result else "stdout didn't change") + + if wait_result: self.event.clear() else: raise Exception("Stdout didn't become active before timeout") @@ -148,8 +156,11 @@ self.event.clear() else: # timeout -> no event -> idle -> exit + self.ReportScreenShot("stdout is idle") return True + self.ReportScreenShot("stdout did not idle") + raise Exception("Stdout did not idle before timeout") def waitPatternInStdout(self, pattern, timeout, count=1): @@ -170,6 +181,7 @@ if found >= count: break self.pattern = None + self.ReportScreenShot("found pattern" if res else "pattern not found") return res class BeremizApp(IDEIdleObserver, stdoutIdleObserver): @@ -185,6 +197,21 @@ Sikuli App class instance """ + self.screenshotnum = 0 + self.starttime = timesec() + self.screen = sikuli.Screen() + + self.report = open("report.html", "w") + self.report.write(""" + + + + + Test report + + +""") + command = [python_bin, opj(beremiz_path,"Beremiz.py"), "--log=/dev/stdout"] if exemple is not None: @@ -198,6 +225,8 @@ # - use wmctrl to find IDE window details and maximize it # - pass exact window title to App class constructor + self.ReportText("Launching " + repr(command)) + self.proc = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=0) # Window are macthed against process' PID @@ -236,12 +265,21 @@ stdoutIdleObserver.__init__(self) # stubs for common sikuli calls to allow adding hooks later - for n in ["click","doubleClick","type"]: - setattr(self, n, getattr(sikuli, n)) + for name in ["click","doubleClick","type"]: + def makeMyMeth(n): + def myMeth(*args, **kwargs): + getattr(sikuli, n)(*args, **kwargs) + self.ReportScreenShot(n + "(" + repr(args) + "," + repr(kwargs) + ")") + return myMeth + setattr(self, name, makeMyMeth(name)) def close(self): self.sikuliapp.close() self.sikuliapp = None + self.report.write(""" + +""") + self.report.close() def __del__(self): if self.sikuliapp is not None: @@ -249,3 +287,44 @@ IDEIdleObserver.__del__(self) stdoutIdleObserver.__del__(self) + def ReportScreenShot(self, msg): + elapsed = "%.3fs: "%(timesec() - self.starttime) + fname = "capture"+str(self.screenshotnum)+".png" + cap = self.screen.capture(self.r) + cap.save(".", fname) + # self.report.write("ReportScreenShot " + msg + " " + fname + "\n") + self.screenshotnum = self.screenshotnum + 1 + self.report.write( "

" + elapsed + msg + "" + "

") + + def ReportText(self, text): + elapsed = "%.3fs: "%(timesec() - self.starttime) + self.report.write("

" + elapsed + text + "

") + + def ReportOutput(self, text): + elapsed = "%.3fs: "%(timesec() - self.starttime) + self.report.write("
" + elapsed + text + "
") + + +def run_test(func, *args, **kwargs): + app = BeremizApp(*args, **kwargs) + try: + success = func(app) + except: + # sadly, sys.excepthook is broken in sikuli/jython + # purpose of this run_test function is to work around it. + # and catch exception cleanly anyhow + e_type, e_value, e_traceback = sys.exc_info() + err_msg = "\n".join(traceback.format_exception(e_type, e_value, e_traceback)) + sys.stdout.write(err_msg) + app.ReportOutput(err_msg) + success = False + + app.close() + + if success: + sikuli.exit(0) + else: + sikuli.exit(1) + + +