CLAHE Python bindings
[profile/ivi/opencv.git] / modules / ts / misc / testlog_parser.py
1 #!/usr/bin/env python
2
3 import sys, re, os.path
4 from xml.dom.minidom import parse
5
6 class TestInfo(object):
7
8     def __init__(self, xmlnode):
9         self.fixture = xmlnode.getAttribute("classname")
10         self.name = xmlnode.getAttribute("name")
11         self.value_param = xmlnode.getAttribute("value_param")
12         self.type_param = xmlnode.getAttribute("type_param")
13         if xmlnode.getElementsByTagName("failure"):
14             self.status = "failed"
15         else:
16             self.status = xmlnode.getAttribute("status")
17         if self.name.startswith("DISABLED_"):
18             self.status = "disabled"
19             self.fixture = self.fixture.replace("DISABLED_", "")
20             self.name = self.name.replace("DISABLED_", "")
21         self.metrix = {}
22         self.parseLongMetric(xmlnode, "bytesIn");
23         self.parseLongMetric(xmlnode, "bytesOut");
24         self.parseIntMetric(xmlnode, "samples");
25         self.parseIntMetric(xmlnode, "outliers");
26         self.parseFloatMetric(xmlnode, "frequency", 1);
27         self.parseLongMetric(xmlnode, "min");
28         self.parseLongMetric(xmlnode, "median");
29         self.parseLongMetric(xmlnode, "gmean");
30         self.parseLongMetric(xmlnode, "mean");
31         self.parseLongMetric(xmlnode, "stddev");
32         self.parseFloatMetric(xmlnode, "gstddev");
33         self.parseFloatMetric(xmlnode, "time");
34
35     def parseLongMetric(self, xmlnode, name, default = 0):
36         if xmlnode.hasAttribute(name):
37             tmp = xmlnode.getAttribute(name)
38             val = long(tmp)
39             self.metrix[name] = val
40         else:
41             self.metrix[name] = default
42
43     def parseIntMetric(self, xmlnode, name, default = 0):
44         if xmlnode.hasAttribute(name):
45             tmp = xmlnode.getAttribute(name)
46             val = int(tmp)
47             self.metrix[name] = val
48         else:
49             self.metrix[name] = default
50
51     def parseFloatMetric(self, xmlnode, name, default = 0):
52         if xmlnode.hasAttribute(name):
53             tmp = xmlnode.getAttribute(name)
54             val = float(tmp)
55             self.metrix[name] = val
56         else:
57             self.metrix[name] = default
58
59     def parseStringMetric(self, xmlnode, name, default = None):
60         if xmlnode.hasAttribute(name):
61             tmp = xmlnode.getAttribute(name)
62             self.metrix[name] = tmp.strip()
63         else:
64             self.metrix[name] = default
65
66     def get(self, name, units="ms"):
67         if name == "classname":
68             return self.fixture
69         if name == "name":
70             return self.name
71         if name == "fullname":
72             return self.__str__()
73         if name == "value_param":
74             return self.value_param
75         if name == "type_param":
76             return self.type_param
77         if name == "status":
78             return self.status
79         val = self.metrix.get(name, None)
80         if not val:
81             return val
82         if name == "time":
83             return self.metrix.get("time")
84         if name in ["gmean", "min", "mean", "median", "stddev"]:
85             scale = 1.0
86             frequency = self.metrix.get("frequency", 1.0) or 1.0
87             if units == "ms":
88                 scale = 1000.0
89             if units == "mks":
90                 scale = 1000000.0
91             if units == "ns":
92                 scale = 1000000000.0
93             if units == "ticks":
94                 frequency = long(1)
95                 scale = long(1)
96             return val * scale / frequency
97         return val
98
99
100     def dump(self, units="ms"):
101         print "%s ->\t\033[1;31m%s\033[0m = \t%.2f%s" % (str(self), self.status, self.get("gmean", units), units)
102
103     def shortName(self):
104         pos = self.name.find("/")
105         if pos > 0:
106             name = self.name[:pos]
107         else:
108             name = self.name
109         if self.fixture.endswith(name):
110             fixture = self.fixture[:-len(name)]
111         else:
112             fixture = self.fixture
113         if fixture.endswith("_"):
114             fixture = fixture[:-1]
115         return '::'.join(filter(None, [name, fixture]))
116
117     def __str__(self):
118         pos = self.name.find("/")
119         if pos > 0:
120             name = self.name[:pos]
121         else:
122             name = self.name
123         if self.fixture.endswith(name):
124             fixture = self.fixture[:-len(name)]
125         else:
126             fixture = self.fixture
127         if fixture.endswith("_"):
128             fixture = fixture[:-1]
129         return '::'.join(filter(None, [name, fixture, self.type_param, self.value_param]))
130
131     def __cmp__(self, other):
132         r = cmp(self.fixture, other.fixture);
133         if r != 0:
134             return r
135         if self.type_param:
136             if other.type_param:
137                 r = cmp(self.type_param, other.type_param);
138                 if r != 0:
139                      return r
140             else:
141                 return -1
142         else:
143             if other.type_param:
144                 return 1
145         if self.value_param:
146             if other.value_param:
147                 r = cmp(self.value_param, other.value_param);
148                 if r != 0:
149                      return r
150             else:
151                 return -1
152         else:
153             if other.value_param:
154                 return 1
155         return 0
156
157 def parseLogFile(filename):
158     tests = []
159     log = parse(filename)
160     for case in log.getElementsByTagName("testcase"):
161         tests.append(TestInfo(case))
162     return tests
163
164
165 if __name__ == "__main__":
166     if len(sys.argv) < 2:
167         print "Usage:\n", os.path.basename(sys.argv[0]), "<log_name>.xml"
168         exit(0)
169
170     for arg in sys.argv[1:]:
171         print "Tests found in", arg
172         tests = parseLogFile(arg)
173         for t in sorted(tests):
174             t.dump()
175         print