]> rtime.felk.cvut.cz Git - omk.git/blobdiff - tests/tester.py
RTEMS rules: provide support to build application with symbols exported.
[omk.git] / tests / tester.py
index bd849692eaceabd63e50911a3632ff90fb56398b..0cf21b8541bb5e49253f4a926ff1a10bb26ebd75 100755 (executable)
@@ -15,8 +15,21 @@ testsRoot = os.path.dirname(os.path.abspath(__file__))
 if not os.path.exists(os.path.join(testsRoot, "tester.py")): raise "Can't find tests root directory!"
 os.environ['OMK_TESTSROOT'] = testsRoot
 
-sys.path.append(os.path.join(testsRoot, ".."))
-import rulesdef
+class Rules(dict):
+    "List of all rules and their snippets"
+    def __init__(self):
+        for r in os.listdir("../rules"):
+            snippets = {}
+            fn = os.path.join("..", "rules", r, "Makefile.rules")
+            f = open(fn)
+            for line in f:
+                m = re.search("#OMK:(.*)\.omk", line);
+                if m:
+                    snippets[m.group(1)] = 1;
+            self[r] = snippets.keys()
+        print self
+
+rules = Rules()
 
 class Results(dict):
     def __init__(self):
@@ -67,10 +80,10 @@ class Results(dict):
         return s
 
     def toHtmlByRules(self):
-        rules = sorted(rulesdef.rules.keys())
+        rk = sorted(rules.keys())
         tests = sorted(self.keys())
         s=''
-        for r in rules:
+        for r in rk:
             s+="""
 <a name='results-%(rules)s' />
 <h3>Rules: %(rules)s</h3>
@@ -192,8 +205,8 @@ class RulesStat:
 
 class Stats(dict):
     def __init__(self, results):
-        rules = rulesdef.rules.keys()
-        for rule in rules:
+        rk = rules.keys()
+        for rule in rk:
             rulesStat = RulesStat(rule)
             self[rule]=rulesStat
             for resultEntry in results.values():
@@ -251,42 +264,44 @@ class TestCase:
         try:
             f = open(os.path.join(self.directory, self.executable+'.rules'))
         except IOError:
-            self.rules = rulesdef.rules.keys()
+            self.rules = rules.keys()
             return
         line = f.readline()
         colonMatch = re.search('([^:]*) *: *(.*)', line)
         if colonMatch:
             if colonMatch.group(1) == "all":
                 # all:
-                self.rules = rulesdef.rules.keys()
+                self.rules = rules.keys()
             elif colonMatch.group(1) == "snip":
                 # snip: ...
                 snip = colonMatch.group(2)
-                for r in rulesdef.rules:
-                    if snip in rulesdef.rules[r]:
+                for r in rules:
+                    if snip in rules[r]:
                         self.rules.append(r)
             elif colonMatch.group(1) == "python":
                 # python: ...
                 expr = colonMatch.group(2)
-                for r in rulesdef.rules:
-                    if eval(expr, {'rules': r, 'snippets': rulesdef.rules[r]}):
+                for r in rules:
+                    if eval(expr, {'rules': r, 'snippets': rules[r]}):
                         self.rules.append(r)
         else:
             # rule name
             line = line.strip()
-            if line in rulesdef.rules: self.rules = [ line ]
+            if line in rules: self.rules = [ line ]
         #print self.rules
         
 
     def run(self):
         self.results = TestCaseResult(self)
-        print "Testing %s:\n" % self.name,
+        print "Testing \"%s\" in %s:\n" % (self.name, self.executable),
         os.chdir(os.path.join(testsRoot, self.directory))
+        # Chose how to run the test - currently there is only one option
 #         if os.path.exists("Makefile.test"):
 #             self._exec = self._execMake
         if os.path.exists(self.executable):
             self._exec = self._execRuntest
         else: return
+        self.failed = False
         for rules in self.rules:
             resultEntry = ResultEntry(self.name, rules)
             self.results[rules] = resultEntry
@@ -341,17 +356,27 @@ class TestCase:
     
     def _doRun(self, log):
         "Runs the teset in current directory."
-        print "    ",os.environ['OMK_RULES'],
-        sys.stdout.flush()
+        print "    ",os.environ['OMK_RULES'],
+        sys.stdout.flush()
         ret = self._exec(log)
-        if log.canttest: retstr = "--"
-        elif ret == 0: retstr = "OK"
-        else: retstr = "FAILED"
-        print "%*s%s" % (20-len(os.environ['OMK_RULES']), "", retstr)
+#         if log.canttest: retstr = "--"
+#         elif ret == 0: retstr = "ok"
+#         else:
+#             retstr = "FAILED"
+#             self.failed = True
+#         print "%*s%s" % (20-len(os.environ['OMK_RULES']), "", retstr)
+        if log.canttest: retstr = "[not tested] ok"
+        elif ret == 0: retstr = "ok"
+        else:
+            retstr = "FAILED"
+            self.failed = True
+        print "! %s (%s) %s" % (self.name, os.environ['OMK_RULES'], retstr)
+        sys.stdout.flush()
 
 
 results = Results()
 
+failed = False;
 for dirpath, dirnames, filenames in os.walk(invokeDir):
     executables = fnmatch.filter(filenames, "runtest*")
     if not executables: continue
@@ -360,12 +385,15 @@ for dirpath, dirnames, filenames in os.walk(invokeDir):
         if re.search(".rules$", exe): continue
         t = TestCase(dirpath, exe)
         t.run()
+        if t.failed: failed = True
         results[t.name] = t.results
 
 os.chdir(invokeDir)
 results.genStats()
 results.save()
 
+sys.exit(failed)
+
 # Local Variables:
 # compile-command: "python tester.py"
 # End: