Merge branch 'master' of rtime.felk.cvut.cz:/can-benchmark
[can-benchmark.git] / gw-tests / genhtml / genhtml.py
1 #!/usr/bin/env python
2
3 import os;
4 import dircache;
5 import sys;
6 import urllib
7
8 if __name__ == "__main__":
9     os.chdir(sys.argv[1])
10 else:
11     from wvtest import *
12
13 class DimValue:
14     def __init__(self, dim, value):
15         self.dim = dim
16         self.value = value
17     def __repr__(self):
18         return repr(self.value)
19     def htmlLabel(self):
20         return self.dim.htmlLabel(self.value)
21
22 class Dimension(dict):
23     def __init__(self, atype, name=None):
24         self.type = atype
25         if (name):
26             self.name = name
27         else:
28             self.name = atype            
29
30     def __iter__(self):
31         keys = self.keys()
32         keys.sort()
33         for k in keys:
34             yield self[k]
35
36     def addValue(self, *values):
37         for value in values:
38             if value not in self:
39                 self[value] = DimValue(self, value)
40     def htmlLabel(self, v):
41         return v
42
43 @wvtest
44 def Dimension_and_DimValue():
45     d = Dimension('kern', 'Kernel')
46     d.addValue('2.6.31')
47     d.addValue('2.6.30')
48     l=[]
49     for v in d:
50         WVPASSEQ(v.__class__, DimValue)
51         l.append(v.value)
52     lsorted = ['2.6.30', '2.6.31']
53     WVPASSEQ(l, lsorted)
54     WVPASSEQ(v.htmlLabel(), '2.6.31')
55     WVPASSEQ(d['2.6.31'].value, '2.6.31')
56     
57
58 class DimensionKern(Dimension):
59     def __init__(self):
60         Dimension.__init__(self, 'kern', 'Kernel')
61     def htmlLabel(self, v):
62         i=v.find(":")
63         if i>0: kver=v[:i]
64         else: kver=v
65         return v+"<br><a href='config-%s'>config</a>"%(urllib.quote(kver))
66     def versions(self):
67         for v in self.values:
68             i=v.find(":")
69             if i>0: kver=v[:i]
70             else: kver=v
71             yield kver
72         
73 class DimensionTest(Dimension):
74     def __init__(self):
75         Dimension.__init__(self, 'test', 'Test')
76     def htmlLabel(self, v):
77         return v+"<br><a href='%s.sh.html'>source</a>"%(urllib.quote(v))
78
79 class Test:
80     @classmethod
81     def isOnPath(cls, path):
82         f = os.path.join(path, 'plot.gp')
83         return os.path.isfile(f)
84     def __init__(self, path):
85         self.path = path
86
87 def iterDimValues(dimensions):
88     idx = [0 for i in xrange(len(dimensions))]
89     done=False
90     while not done:
91         values=[]
92         for i in xrange(len(dimensions)):
93             values.append(dimensions[i].values()[idx[i]])
94         yield values
95         done=True
96         for i in xrange(len(dimensions)):
97             idx[i] += 1
98             if idx[i] < len(dimensions[i]):
99                 done=False
100                 break
101             idx[i] = 0
102
103 class Tests(dict):
104     """Represents all tests organized along several dimensions"""
105     def __init__(self, rootpath, *dimensions):
106         dict.__init__(self)
107         self.dimensions = dimensions
108         if (rootpath):
109             self.populate(rootpath)
110     def getTest(self, key):
111         realkey=[]
112         for d in self.dimensions:
113             for i in key:
114                 if i.dim == d:
115                     realkey.append(i.value)
116         if len(realkey) != len(self.dimensions):
117             raise KeyError("The coordinates in key do not match dimensions")
118         return self[tuple(realkey)]
119         
120     def addTest(self, test, coordinates):
121         if len(coordinates) != len(self.dimensions):
122             raise KeyError("The number coordinates do not match the number of dimensions")
123         self[tuple(coordinates)] = test
124         for i in xrange(len(coordinates)):
125             self.dimensions[i].addValue(coordinates[i])
126
127     def populate(self, rootpath):
128         for root, dirs, files in os.walk(rootpath):
129             if (root.find(rootpath) == 0):
130                 coordinates = root[len(rootpath):]
131             else:
132                 coordinates = rootpath
133             if Test.isOnPath(root):
134                 self.addTest(Test(root), coordinates.split("/"))
135     def iterDimensionPairs(self):
136         for i in xrange(len(self.dimensions)):
137             for j in xrange(i+1, len(self.dimensions)):
138                 yield (self.dimensions[i], self.dimensions[j])
139                 yield (self.dimensions[j], self.dimensions[i])
140     def iterRemainingDimensions(self, dimensionPair):
141         for d in self.dimensions:
142             if d not in dimensionPair:
143                 yield d
144     def generateHtml(self):
145         for pair in self.iterDimensionPairs():
146             remdims = self.iterRemainingDimensions(pair)
147             for vals in iterDimValues(remdims):
148                 self.generatePage(pair, remdims, vals)
149
150     def generatePage(self, dimpair, dimother, valsother):
151         dimy, dimx = dimpair
152         html = open("%s-vs-%s-%s.html"%(dimy.type, dimx.type, "-".join([v.value for v in valsother])), "w")
153         title = "CAN gateway benchmark for " + ", ".join([v.dim.name+" "+v.value for v in valsother])
154         print >> html, """<html>
155 <head>
156 <title>%s</title>
157 <style>
158 img { border: 0; }
159 table { border-collapse: collapse; }
160 th, td { border: 1px solid lightgray; padding: 4px;}
161 </style>
162 </head>
163 <body>
164 <h1>%s</h1>"""  % (title, title)
165         for d in dimother:
166             pass
167 #             print >>html, "View for %s: " % str(ps.pageclass.name)
168 #             for v in ps.values:
169 #                 print >>html, "<a href='%s-%s.html'>%s</a> | "%(ps.values.type, urllib.quote(v), v)
170 #             print >>html, "<br>"
171 #             try:
172 #                 print >>html, d.htmlPreamble()
173 #             except Exception:
174 #                 pass
175
176         print >>html, "<table><thead><tr><td> </td>"
177         for x in dimx.values():
178             print >>html, "<th>%s</th>" % x.htmlLabel()
179         print >>html, "</tr></thead>"
180         for y in dimy.values():
181             print >>html, "<tr><th>%s</th>" % y.htmlLabel()
182
183             for x in dimx.values():
184                 print >>html, "<td>"
185                 idx = valsother
186                 idx.extend([x,y])
187                 test = self.getTest(idx)
188                 
189                 d="by-%s/%s/%s/%s/" % (self.prefix, self.value, y, x)
190                 dthumb = d+"thumb"
191                 try:
192                     for img in dircache.listdir(dthumb):
193                         print >>html, "<a href='%s/%s'><img src='%s/thumb/%s'></a>" % (urllib.quote(d), img, urllib.quote(d), img)
194                 except OSError:
195                     print "warning: no images in %s?"%dthumb
196                 print >>html, "</td>"
197             print >>html, "</tr>"
198         print >> html, """
199 </table>
200 </body>
201 """
202
203 @wvtest                
204 def Two_Dimensions_in_Tests():
205     t = Tests(None, DimensionTest(), DimensionKern())
206     WVPASSEQ([(a.__class__.__name__, b.__class__.__name__) for a, b in t.iterDimensionPairs()],
207              [('DimensionTest', 'DimensionKern'), ('DimensionKern', 'DimensionTest')])
208 @wvtest                
209 def Three_Dimensions_in_Tests():
210     dt = DimensionTest()
211     dk = DimensionKern()
212     dd = Dimension('tmp', "Tmp")
213     t = Tests(None, dt, dk, dd)
214     pairs = [(a.__class__.__name__, b.__class__.__name__) for a, b in t.iterDimensionPairs()]
215     WVPASSEQ(pairs[0], ('DimensionTest', 'DimensionKern'))
216     WVPASSEQ(pairs[1], ('DimensionKern', 'DimensionTest'))
217     WVPASSEQ(pairs[2], ('DimensionTest', 'Dimension'))
218     WVPASSEQ(pairs[3], ('Dimension', 'DimensionTest'))
219     WVPASSEQ(pairs[4], ('DimensionKern', 'Dimension'))
220     WVPASSEQ(pairs[5], ('Dimension', 'DimensionKern'))
221     WVPASSEQ(len(pairs), 6)
222     WVEXCEPT(KeyError, t.addTest, None, [1, 2])
223     WVEXCEPT(KeyError, t.addTest, None, [1, 2, 3, 4])
224
225     class MyTest(Test):
226         pass
227
228     t.addTest(MyTest, [1, 'a', 'A']);
229
230     WVPASSEQ(dt.keys(), [1])
231     WVPASSEQ(dk.keys(), ['a'])
232     WVPASSEQ(dd.keys(), ['A'])
233
234     v1 = dt[1]
235     v2 = dk['a']
236     v3 = dd['A']
237
238     WVPASSEQ(t.getTest((v1, v2, v3)), MyTest)
239     WVPASSEQ(t.getTest((v1, v3, v2)), MyTest)
240     WVPASSEQ(t.getTest((v3, v2, v1)), MyTest)
241     WVEXCEPT(KeyError, t.getTest, (v1, v1, v1))
242     WVEXCEPT(KeyError, t.getTest, (v1, v2))
243     WVEXCEPT(TypeError, t.getTest, v1)
244
245     WVPASSEQ([d.__class__.__name__ for d in t.iterRemainingDimensions([dt])], ['DimensionKern', 'Dimension']) 
246     WVPASSEQ([d.__class__.__name__ for d in t.iterRemainingDimensions([dt, dd])], ['DimensionKern'])
247
248     WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1,'a']]))
249     dt.addValue(2)
250     dk.addValue('b')
251     WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1, 'a'], [2, 'a'], [1, 'b'], [2, 'b']]))
252
253
254 # tests = Tests("by-kern/", DimensionKern(), DimensionTest())
255     
256 # sys.exit(0)
257
258
259
260 # class Page:
261 #     def __init__(self, tests, yaxis, xaxis=None):
262
263 # class PageKern(Page):
264 #     prefix = 'kern'
265 #     name = 'kernel'
266 #     def __init__(self, value, xvals, yvals):
267 #         Page.__init__(self, value, xvals, yvals)
268 #     def getPreambule(self):
269 #         i=self.value.find(":")
270 #         if i>0: kver=self.value[:i]
271 #         else: kver=self.value
272 #         return "<p><a href='config-%s'>Kernel config</a></p>"%kver
273
274 # class PageClck(Page):
275 #     prefix = 'clck'
276 #     name = 'CPU clock'
277 #     def __init__(self, value, xvals, yvals):
278 #         Page.__init__(self, value, xvals, yvals)
279
280 # class PageTest(Page):
281 #     prefix = 'test'
282 #     name = 'test'
283 #     def __init__(self, value, xvals, yvals):
284 #         Page.__init__(self, value, xvals, yvals)
285 #     def getPreambule(self):
286 #         return "<p><a href='%s.sh.html'>Test source</a></p>"%(urllib.quote(self.value))
287
288
289
290 # pagesets = [ PageSet(PageKern, kernels, clocks, tests),
291 #              PageSet(PageTest, tests, clocks, kernels)]
292
293 # for ps in pagesets:
294 #     for p in ps.getPages():
295 #         p.generate(pagesets)
296
297 # try:
298 #     os.remove("index.html")
299 # except OSError: pass
300
301 # os.symlink("%s-%s.html"%(clocks.type, clocks[0]), "index.html")
302
303 # os.system("source-highlight -d --output-dir=. ../*.sh")
304     
305
306 # for v in kernels.versions():
307 #     os.system("cp /boot/config-%s ."%v)