8 if __name__ == "__main__":
14 def __init__(self, dim, value):
18 return repr(self.value)
20 return self.dim.htmlLabel(self.value)
22 class Dimension(dict):
23 def __init__(self, atype, name=None):
36 def addValue(self, *values):
39 self[value] = DimValue(self, value)
40 def htmlLabel(self, v):
44 def Dimension_and_DimValue():
45 d = Dimension('kern', 'Kernel')
50 WVPASSEQ(v.__class__, DimValue)
52 lsorted = ['2.6.30', '2.6.31']
54 WVPASSEQ(v.htmlLabel(), '2.6.31')
55 WVPASSEQ(d['2.6.31'].value, '2.6.31')
58 class DimensionKern(Dimension):
60 Dimension.__init__(self, 'kern', 'Kernel')
61 def htmlLabel(self, v):
65 return v+"<br><a href='config-%s'>config</a>"%(urllib.quote(kver))
73 class DimensionTest(Dimension):
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))
81 def isOnPath(cls, path):
82 f = os.path.join(path, 'plot.gp')
83 return os.path.isfile(f)
84 def __init__(self, path):
87 def iterDimValues(dimensions):
88 idx = [0 for i in xrange(len(dimensions))]
92 for i in xrange(len(dimensions)):
93 values.append(dimensions[i].values()[idx[i]])
96 for i in xrange(len(dimensions)):
98 if idx[i] < len(dimensions[i]):
104 """Represents all tests organized along several dimensions"""
105 def __init__(self, rootpath, *dimensions):
107 self.dimensions = dimensions
109 self.populate(rootpath)
110 def getTest(self, key):
112 for d in self.dimensions:
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)]
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])
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):]
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:
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)
150 def generatePage(self, dimpair, dimother, valsother):
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>
159 table { border-collapse: collapse; }
160 th, td { border: 1px solid lightgray; padding: 4px;}
164 <h1>%s</h1>""" % (title, title)
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>"
172 # print >>html, d.htmlPreamble()
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()
183 for x in dimx.values():
187 test = self.getTest(idx)
189 d="by-%s/%s/%s/%s/" % (self.prefix, self.value, y, x)
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)
195 print "warning: no images in %s?"%dthumb
196 print >>html, "</td>"
197 print >>html, "</tr>"
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')])
209 def Three_Dimensions_in_Tests():
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])
228 t.addTest(MyTest, [1, 'a', 'A']);
230 WVPASSEQ(dt.keys(), [1])
231 WVPASSEQ(dk.keys(), ['a'])
232 WVPASSEQ(dd.keys(), ['A'])
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)
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'])
248 WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1,'a']]))
251 WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1, 'a'], [2, 'a'], [1, 'b'], [2, 'b']]))
254 # tests = Tests("by-kern/", DimensionKern(), DimensionTest())
261 # def __init__(self, tests, yaxis, xaxis=None):
263 # class PageKern(Page):
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
274 # class PageClck(Page):
277 # def __init__(self, value, xvals, yvals):
278 # Page.__init__(self, value, xvals, yvals)
280 # class PageTest(Page):
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))
290 # pagesets = [ PageSet(PageKern, kernels, clocks, tests),
291 # PageSet(PageTest, tests, clocks, kernels)]
293 # for ps in pagesets:
294 # for p in ps.getPages():
295 # p.generate(pagesets)
298 # os.remove("index.html")
299 # except OSError: pass
301 # os.symlink("%s-%s.html"%(clocks.type, clocks[0]), "index.html")
303 # os.system("source-highlight -d --output-dir=. ../*.sh")
306 # for v in kernels.versions():
307 # os.system("cp /boot/config-%s ."%v)