X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/1ed5a652b9a7a2379d2eee072eaa38a9db6f005d..0067509575642daf871e95388be79ae95ad33d70:/gw-tests/genhtml/genhtml.py diff --git a/gw-tests/genhtml/genhtml.py b/gw-tests/genhtml/genhtml.py old mode 100644 new mode 100755 index 3a90ab5..be1bb4e --- a/gw-tests/genhtml/genhtml.py +++ b/gw-tests/genhtml/genhtml.py @@ -1,307 +1,367 @@ #!/usr/bin/env python - +# -*- coding: utf-8 -*- import os; import dircache; import sys; import urllib +import traceback -if __name__ == "__main__": - os.chdir(sys.argv[1]) -else: - from wvtest import * - -class DimValue: +class DimValue(object): + def __new__(cls, dim, value): + if value in dim: + return dim[value] + else: + return super(DimValue, cls).__new__(cls, dim, value) def __init__(self, dim, value): - self.dim = dim - self.value = value + self.dim = dim + self.value = value + self.dim.addValue(self) + def __str__(self): + return self.dim.val2str(self.value) def __repr__(self): - return repr(self.value) - def htmlLabel(self): - return self.dim.htmlLabel(self.value) + return "DimValue(%s, %s)" % (repr(self.dim), repr(self.value)) + def htmlTableHeading(self): + return self.dim.htmlTableHeading(self.value) + +class DimValues(list): + def replace(self, val): + for i in xrange(len(self)): + if self[i].dim == val.dim: + self[i] = val + def __add__(self, val): + ret = DimValues(self) + ret.append(val) + return ret + def __sub__(self, dim): + result = DimValues(self) + for v in self: + if v.dim == dim: + result.remove(v) + return result + def key(self): + return tuple([v.value for v in self]) class Dimension(dict): def __init__(self, atype, name=None): - self.type = atype - if (name): - self.name = name - else: - self.name = atype + self.type = atype + if (name): + self.name = name + else: + self.name = atype + self.sortedKeys = [] def __iter__(self): - keys = self.keys() - keys.sort() - for k in keys: - yield self[k] - - def addValue(self, *values): - for value in values: - if value not in self: - self[value] = DimValue(self, value) - def htmlLabel(self, v): - return v - -@wvtest -def Dimension_and_DimValue(): - d = Dimension('kern', 'Kernel') - d.addValue('2.6.31') - d.addValue('2.6.30') - l=[] - for v in d: - WVPASSEQ(v.__class__, DimValue) - l.append(v.value) - lsorted = ['2.6.30', '2.6.31'] - WVPASSEQ(l, lsorted) - WVPASSEQ(v.htmlLabel(), '2.6.31') - WVPASSEQ(d['2.6.31'].value, '2.6.31') - + for i in xrange(len(self)): + yield self.getValue(i) + def getValue(self, index): + return self[self.sortedKeys[index]] + + def addValue(self, value): + if value not in self: + if isinstance(value, DimValue): + self[value.value] = value + else: + raise Exception("Unsupported usage of addValue") + #self[value] = DimValue(self, value) + self.sortedKeys = self.keys() + self.sortedKeys.sort() + def val2str(self, v): + return str(v) + def htmlTableHeading(self, v): + return self.val2str(v) + def __str__(self): + return self.name + def __repr__(self): + return "Dimension(%s)"%self.type class DimensionKern(Dimension): def __init__(self): - Dimension.__init__(self, 'kern', 'Kernel') - def htmlLabel(self, v): - i=v.find(":") - if i>0: kver=v[:i] - else: kver=v - return v+"
config"%(urllib.quote(kver)) + Dimension.__init__(self, 'gwkern', 'GW kernel') + def htmlTableHeading(self, v): + i=v.find(":") + if i>0: kver=v[:i] + else: kver=v + return v+"
config"%(urllib.quote(kver)) def versions(self): - for v in self.values: - i=v.find(":") - if i>0: kver=v[:i] - else: kver=v - yield kver - + for v in self.values: + i=v.find(":") + if i>0: kver=v[:i] + else: kver=v + yield kver + +class DimensionHostKern(Dimension): + def __init__(self): + Dimension.__init__(self, 'hostkern', 'Host kernel') + def val2str(self, v): + if v.find("host-") == 0: + v = v[5:] + return v + def htmlTableHeading(self, v): + v = self.val2str(v) + i = v.find(":") + if i>0: kver = v[:i] + else: kver = v + return v+"
config"%(urllib.quote(kver)) + def versions(self): + for v in self.values: + i=v.find(":") + if i>0: kver=v[:i] + else: kver=v + yield kver + class DimensionTest(Dimension): def __init__(self): - Dimension.__init__(self, 'test', 'Test') - def htmlLabel(self, v): - return v+"
source"%(urllib.quote(v)) + Dimension.__init__(self, 'test', 'Test') + def htmlTableHeading(self, v): + return v+"
source"%(urllib.quote(v)) -class Test: +class DimensionLoad(Dimension): + def __init__(self): + Dimension.__init__(self, 'load', 'Load') + +class DimensionTraffic(Dimension): + def __init__(self): + Dimension.__init__(self, 'traf', 'Traffic') + def val2str(self, v): + if v == "50": + return "50%" + elif v == "oneatatime": + return "one message at a time" + else: + return v + def htmlTableHeading(self, v): + return self.val2str(v) +class Test(object): @classmethod def isOnPath(cls, path): - f = os.path.join(path, 'plot.gp') - return os.path.isfile(f) - def __init__(self, path): - self.path = path + f = os.path.join(path, 'plot.sh') + return os.path.isfile(f) + def __init__(self, path, values, tests=None): + self.path = path + self.name = os.path.basename(path) + self.values = values + self.tests = tests + def printThumbLink(self, file): + thumb = self.path+'/thumb' + try: + imgs = [img for img in dircache.listdir(thumb)] + except OSError: + imgs = [ self.name + ".png" ] + for img in imgs: + print >>file, "" % \ + (urllib.quote(self.path), urllib.quote(self.path), img) + def generateHtml(self): + html = open(os.path.join(self.path, 'results.html'), "w") + title = "CAN gateway timing analysis" + cdup = "../"*len(self.values) + print >> html, """ + + + +%s + + + +

%s

""" % (title, cdup, title) + params = ["%s %s" % (v.dim, v) for v in self.values] + print >>html, "Results for:", ", ".join(params) + print >>html, "

Other results

" + for d in self.tests.space: + links = [] + for v in d: + if v in self.values: + links.append("%s"%str(v)) + else: + vv = DimValues(self.values) + vv.replace(v) + try: + href = cdup + urllib.quote(self.tests[vv.key()].path+"/results.html") + links.append("%s"%(href, str(v))) + except KeyError: + links.append("%s"%str(v)) + print >>html, "" + + print >>html, "
%s" % d, " ".join(links), "
" + print >>html, "
" % (self.name+".png") + print >>html, "Raw data
" + print >>html, "Script source
" % (cdup+self.name+".sh.html") + print >>html, "Back to top
" % cdup + + html.close() + +class Space(list): + """List of Dimensions()s (order matters)""" + def __init__(self, *dimensions): + self.extend(list(dimensions)) + def path2dimValues(self, path): + coordinates = path.split("/") + if len(coordinates) != len(self): + raise KeyError("The number coordinates do not match the number of dimensions: " + str(coordinates)) + + dv = DimValues([DimValue(self[i], coordinates[i]) \ + for i in xrange(len(coordinates))]) + return dv + + def iterValues(self): + idx = [0 for i in xrange(len(self))] + done=False + while not done: + values=DimValues() + for i in xrange(len(self)): + values.append(self[i].values()[idx[i]]) + yield values + done=True + for i in xrange(len(self)): + idx[i] += 1 + if idx[i] < len(self[i]): + done=False + break + idx[i] = 0 + def reorder(self, dimValues): + reordered = DimValues() + for d in self: + for v in dimValues: + if v.dim == d: + reordered.append(v) + return reordered + def iterDimensionPairs(self): + for i in xrange(len(self)): + for j in xrange(i+1, len(self)): + yield (self[i], self[j]) + yield (self[j], self[i]) + def iterRemainingDimensions(self, dimensionPair): + for d in self: + if d not in dimensionPair: + yield d -def iterDimValues(dimensions): - idx = [0 for i in xrange(len(dimensions))] - done=False - while not done: - values=[] - for i in xrange(len(dimensions)): - values.append(dimensions[i].values()[idx[i]]) - yield values - done=True - for i in xrange(len(dimensions)): - idx[i] += 1 - if idx[i] < len(dimensions[i]): - done=False - break - idx[i] = 0 class Tests(dict): """Represents all tests organized along several dimensions""" - def __init__(self, rootpath, *dimensions): - dict.__init__(self) - self.dimensions = dimensions - if (rootpath): - self.populate(rootpath) + def __init__(self, rootpath, space): + dict.__init__(self) + self.space = space + if (rootpath): + self.populate(rootpath) def getTest(self, key): - realkey=[] - for d in self.dimensions: - for i in key: - if i.dim == d: - realkey.append(i.value) - if len(realkey) != len(self.dimensions): - raise KeyError("The coordinates in key do not match dimensions") - return self[tuple(realkey)] - - def addTest(self, test, coordinates): - if len(coordinates) != len(self.dimensions): - raise KeyError("The number coordinates do not match the number of dimensions") - self[tuple(coordinates)] = test - for i in xrange(len(coordinates)): - self.dimensions[i].addValue(coordinates[i]) - + if len(key) != len(self.space): + raise KeyError("The coordinates in key do not match the dimension of the space") + realkey = self.space.reorder(key) + return self[realkey.key()] + + def addTest(self, test): + self[test.values.key()] = test + def populate(self, rootpath): - for root, dirs, files in os.walk(rootpath): - if (root.find(rootpath) == 0): - coordinates = root[len(rootpath):] - else: - coordinates = rootpath - if Test.isOnPath(root): - self.addTest(Test(root), coordinates.split("/")) - def iterDimensionPairs(self): - for i in xrange(len(self.dimensions)): - for j in xrange(i+1, len(self.dimensions)): - yield (self.dimensions[i], self.dimensions[j]) - yield (self.dimensions[j], self.dimensions[i]) - def iterRemainingDimensions(self, dimensionPair): - for d in self.dimensions: - if d not in dimensionPair: - yield d + for root, dirs, files in os.walk(rootpath): + if (root.find(rootpath) == 0): + path = root[len(rootpath):] + else: + path = rootpath + if Test.isOnPath(root): + dv = self.space.path2dimValues(path) + self.addTest(Test(root, dv, self)) def generateHtml(self): - for pair in self.iterDimensionPairs(): - remdims = self.iterRemainingDimensions(pair) - for vals in iterDimValues(remdims): - self.generatePage(pair, remdims, vals) - - def generatePage(self, dimpair, dimother, valsother): - dimy, dimx = dimpair - html = open("%s-vs-%s-%s.html"%(dimy.type, dimx.type, "-".join([v.value for v in valsother])), "w") - title = "CAN gateway benchmark for " + ", ".join([v.dim.name+" "+v.value for v in valsother]) - print >> html, """ - -%s - +h4 { margin: 0; } +.otherview { margin: 1ex 0} +.otherview .value { color: black; padding: 0ex 1ex; -moz-border-radius: 1ex; border-radius: 1ex;} +.otherview .value a { color: inherit; text-decoration: none; } +.otherview .other:hover { background: #eee; } +.otherview .missing { color: gray; } +.otherview .current { background: #ccc; } +""" + css.close() + for test in self.values(): + print test.path + test.generateHtml() + + os.system("source-highlight -d --output-dir=. ../*.sh > /dev/null") + +class Page(object): + def __init__(self, dimPair, valsOther, tests): + self.dimy, self.dimx = dimPair + self.dimOther = [v.dim for v in valsOther] + self.valsOther = tests.space.reorder(valsOther) + self.tests = tests + def getName(self): + return "%s-vs-%s-for-%s.html"%(self.dimy.type, self.dimx.type, + "-".join([v.value for v in self.valsOther])) + def generate(self): + html = open(self.getName(), "w") + title = "CAN gateway timing analysis" + print >> html, """ + + + +%s +

%s

""" % (title, title) - for d in dimother: - pass -# print >>html, "View for %s: " % str(ps.pageclass.name) -# for v in ps.values: -# print >>html, "%s | "%(ps.values.type, urllib.quote(v), v) -# print >>html, "
" -# try: -# print >>html, d.htmlPreamble() -# except Exception: -# pass - - print >>html, "" - for x in dimx.values(): - print >>html, "" % x.htmlLabel() - print >>html, "" - for y in dimy.values(): - print >>html, "" % y.htmlLabel() - - for x in dimx.values(): - print >>html, "
%s
%s" - idx = valsother - idx.extend([x,y]) - test = self.getTest(idx) - - d="by-%s/%s/%s/%s/" % (self.prefix, self.value, y, x) - dthumb = d+"thumb" + params = ["%s %s" % (v.dim, v) for v in self.valsOther] + print >>html, "

Results for ", ", ".join(params), "

" + print >>html, "

Other views

" + print >>html, "" + for d in self.dimOther: + print >>html, "" % d + print >>html, "" % \ + Page((d, self.dimx), self.valsOther - d + self.dimy.getValue(0), self.tests).getName() + links = [] + print >>html, "" + print >>html, "
%s " % \ + Page((self.dimy, d), self.valsOther - d + self.dimx.getValue(0), self.tests).getName() + print >>html, "" + for v in d: + if v in self.valsOther: + links.append("%s"%str(v)) + else: + vv = DimValues(self.valsOther) + vv.replace(v) + links.append("%s"%(urllib.quote(Page((self.dimy, self.dimx), vv, self.tests).getName()), str(v))) + print >>html, " ".join(links) + print >>html, "
" + + print >>html, "" % (self.dimx.name, self.dimy.name) + for x in self.dimx: + print >>html, "" % x.htmlTableHeading() + print >>html, "" + for y in self.dimy: + print >>html, "" % y.htmlTableHeading() + + for x in self.dimx: + print >>html, "" - print >>html, "" - print >> html, """ + print >>html, "" + print >> html, """
%s →
%s ↓
%s
%s" + idx = [x,y] + idx.extend(self.valsOther) try: - for img in dircache.listdir(dthumb): - print >>html, "" % (urllib.quote(d), img, urllib.quote(d), img) - except OSError: - print "warning: no images in %s?"%dthumb + test = tests.getTest(idx) + test.printThumbLink(html) + except KeyError: + print >>html, "N/A" print >>html, "
+
Authors: Michal Sojka, Pavel Píša, Copyright © 2010 Czech Technical University in Prague
""" -@wvtest -def Two_Dimensions_in_Tests(): - t = Tests(None, DimensionTest(), DimensionKern()) - WVPASSEQ([(a.__class__.__name__, b.__class__.__name__) for a, b in t.iterDimensionPairs()], - [('DimensionTest', 'DimensionKern'), ('DimensionKern', 'DimensionTest')]) -@wvtest -def Three_Dimensions_in_Tests(): - dt = DimensionTest() - dk = DimensionKern() - dd = Dimension('tmp', "Tmp") - t = Tests(None, dt, dk, dd) - pairs = [(a.__class__.__name__, b.__class__.__name__) for a, b in t.iterDimensionPairs()] - WVPASSEQ(pairs[0], ('DimensionTest', 'DimensionKern')) - WVPASSEQ(pairs[1], ('DimensionKern', 'DimensionTest')) - WVPASSEQ(pairs[2], ('DimensionTest', 'Dimension')) - WVPASSEQ(pairs[3], ('Dimension', 'DimensionTest')) - WVPASSEQ(pairs[4], ('DimensionKern', 'Dimension')) - WVPASSEQ(pairs[5], ('Dimension', 'DimensionKern')) - WVPASSEQ(len(pairs), 6) - WVEXCEPT(KeyError, t.addTest, None, [1, 2]) - WVEXCEPT(KeyError, t.addTest, None, [1, 2, 3, 4]) - - class MyTest(Test): - pass - - t.addTest(MyTest, [1, 'a', 'A']); - - WVPASSEQ(dt.keys(), [1]) - WVPASSEQ(dk.keys(), ['a']) - WVPASSEQ(dd.keys(), ['A']) - - v1 = dt[1] - v2 = dk['a'] - v3 = dd['A'] - - WVPASSEQ(t.getTest((v1, v2, v3)), MyTest) - WVPASSEQ(t.getTest((v1, v3, v2)), MyTest) - WVPASSEQ(t.getTest((v3, v2, v1)), MyTest) - WVEXCEPT(KeyError, t.getTest, (v1, v1, v1)) - WVEXCEPT(KeyError, t.getTest, (v1, v2)) - WVEXCEPT(TypeError, t.getTest, v1) - - WVPASSEQ([d.__class__.__name__ for d in t.iterRemainingDimensions([dt])], ['DimensionKern', 'Dimension']) - WVPASSEQ([d.__class__.__name__ for d in t.iterRemainingDimensions([dt, dd])], ['DimensionKern']) - - WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1,'a']])) - dt.addValue(2) - dk.addValue('b') - WVPASSEQ(str([v for v in iterDimValues([dt, dk])]), str([[1, 'a'], [2, 'a'], [1, 'b'], [2, 'b']])) - -# tests = Tests("by-kern/", DimensionKern(), DimensionTest()) - -# sys.exit(0) - - - -# class Page: -# def __init__(self, tests, yaxis, xaxis=None): - -# class PageKern(Page): -# prefix = 'kern' -# name = 'kernel' -# def __init__(self, value, xvals, yvals): -# Page.__init__(self, value, xvals, yvals) -# def getPreambule(self): -# i=self.value.find(":") -# if i>0: kver=self.value[:i] -# else: kver=self.value -# return "

Kernel config

"%kver - -# class PageClck(Page): -# prefix = 'clck' -# name = 'CPU clock' -# def __init__(self, value, xvals, yvals): -# Page.__init__(self, value, xvals, yvals) - -# class PageTest(Page): -# prefix = 'test' -# name = 'test' -# def __init__(self, value, xvals, yvals): -# Page.__init__(self, value, xvals, yvals) -# def getPreambule(self): -# return "

Test source

"%(urllib.quote(self.value)) - - - -# pagesets = [ PageSet(PageKern, kernels, clocks, tests), -# PageSet(PageTest, tests, clocks, kernels)] - -# for ps in pagesets: -# for p in ps.getPages(): -# p.generate(pagesets) - -# try: -# os.remove("index.html") -# except OSError: pass - -# os.symlink("%s-%s.html"%(clocks.type, clocks[0]), "index.html") - -# os.system("source-highlight -d --output-dir=. ../*.sh") - - -# for v in kernels.versions(): -# os.system("cp /boot/config-%s ."%v) +if __name__ == "__main__": + os.chdir(sys.argv[1]) + os.system("rm *.html") + tests = Tests("./", Space(DimensionHostKern(), DimensionKern(), DimensionTraffic(), DimensionLoad(), DimensionTest())) + tests.generateHtml() + sys.exit(0)