1 # Copyright 2013 the V8 project authors. All rights reserved. 2 # Redistribution and use in source and binary forms, with or without 3 # modification, are permitted provided that the following conditions are 4 # met: 5 # 6 # * Redistributions of source code must retain the above copyright 7 # notice, this list of conditions and the following disclaimer. 8 # * Redistributions in binary form must reproduce the above 9 # copyright notice, this list of conditions and the following 10 # disclaimer in the documentation and/or other materials provided 11 # with the distribution. 12 # * Neither the name of Google Inc. nor the names of its 13 # contributors may be used to endorse or promote products derived 14 # from this software without specific prior written permission. 15 # 16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 29 import os 30 import shutil 31 import subprocess 32 import tarfile 33 34 from testrunner.local import testsuite 35 from testrunner.objects import testcase 36 37 38 class BenchmarksTestSuite(testsuite.TestSuite): 39 40 def __init__(self, name, root): 41 super(BenchmarksTestSuite, self).__init__(name, root) 42 self.testroot = root 43 44 def ListTests(self, context): 45 tests = [] 46 for test in [ 47 "kraken/ai-astar", 48 "kraken/audio-beat-detection", 49 "kraken/audio-dft", 50 "kraken/audio-fft", 51 "kraken/audio-oscillator", 52 "kraken/imaging-darkroom", 53 "kraken/imaging-desaturate", 54 "kraken/imaging-gaussian-blur", 55 "kraken/json-parse-financial", 56 "kraken/json-stringify-tinderbox", 57 "kraken/stanford-crypto-aes", 58 "kraken/stanford-crypto-ccm", 59 "kraken/stanford-crypto-pbkdf2", 60 "kraken/stanford-crypto-sha256-iterative", 61 62 "octane/box2d", 63 "octane/code-load", 64 "octane/crypto", 65 "octane/deltablue", 66 "octane/earley-boyer", 67 "octane/gbemu", 68 "octane/mandreel", 69 "octane/navier-stokes", 70 "octane/pdfjs", 71 "octane/raytrace", 72 "octane/regexp", 73 "octane/richards", 74 "octane/splay", 75 76 "sunspider/3d-cube", 77 "sunspider/3d-morph", 78 "sunspider/3d-raytrace", 79 "sunspider/access-binary-trees", 80 "sunspider/access-fannkuch", 81 "sunspider/access-nbody", 82 "sunspider/access-nsieve", 83 "sunspider/bitops-3bit-bits-in-byte", 84 "sunspider/bitops-bits-in-byte", 85 "sunspider/bitops-bitwise-and", 86 "sunspider/bitops-nsieve-bits", 87 "sunspider/controlflow-recursive", 88 "sunspider/crypto-aes", 89 "sunspider/crypto-md5", 90 "sunspider/crypto-sha1", 91 "sunspider/date-format-tofte", 92 "sunspider/date-format-xparb", 93 "sunspider/math-cordic", 94 "sunspider/math-partial-sums", 95 "sunspider/math-spectral-norm", 96 "sunspider/regexp-dna", 97 "sunspider/string-base64", 98 "sunspider/string-fasta", 99 "sunspider/string-tagcloud", 100 "sunspider/string-unpack-code", 101 "sunspider/string-validate-input"]: 102 tests.append(testcase.TestCase(self, test)) 103 return tests 104 105 def GetFlagsForTestCase(self, testcase, context): 106 result = [] 107 result += context.mode_flags 108 if testcase.path.startswith("kraken"): 109 result.append(os.path.join(self.testroot, "%s-data.js" % testcase.path)) 110 result.append(os.path.join(self.testroot, "%s.js" % testcase.path)) 111 elif testcase.path.startswith("octane"): 112 result.append(os.path.join(self.testroot, "octane/base.js")) 113 result.append(os.path.join(self.testroot, "%s.js" % testcase.path)) 114 result += ["-e", "BenchmarkSuite.RunSuites({});"] 115 elif testcase.path.startswith("sunspider"): 116 result.append(os.path.join(self.testroot, "%s.js" % testcase.path)) 117 return testcase.flags + result 118 119 def GetSourceForTest(self, testcase): 120 filename = os.path.join(self.testroot, testcase.path + ".js") 121 with open(filename) as f: 122 return f.read() 123 124 def _DownloadIfNecessary(self, url, revision, target_dir): 125 # Maybe we're still up to date? 126 revision_file = "CHECKED_OUT_%s" % target_dir 127 checked_out_revision = None 128 if os.path.exists(revision_file): 129 with open(revision_file) as f: 130 checked_out_revision = f.read() 131 if checked_out_revision == revision: 132 return 133 134 # If we have a local archive file with the test data, extract it. 135 if os.path.exists(target_dir): 136 shutil.rmtree(target_dir) 137 archive_file = "downloaded_%s_%s.tar.gz" % (target_dir, revision) 138 if os.path.exists(archive_file): 139 with tarfile.open(archive_file, "r:gz") as tar: 140 tar.extractall() 141 with open(revision_file, "w") as f: 142 f.write(revision) 143 return 144 145 # No cached copy. Check out via SVN, and pack as .tar.gz for later use. 146 command = "svn co %s -r %s %s" % (url, revision, target_dir) 147 code = subprocess.call(command, shell=True) 148 if code != 0: 149 raise Exception("Error checking out %s benchmark" % target_dir) 150 with tarfile.open(archive_file, "w:gz") as tar: 151 tar.add("%s" % target_dir) 152 with open(revision_file, "w") as f: 153 f.write(revision) 154 155 def DownloadData(self): 156 old_cwd = os.getcwd() 157 os.chdir(os.path.abspath(self.root)) 158 159 self._DownloadIfNecessary( 160 ("http://svn.webkit.org/repository/webkit/trunk/PerformanceTests/" 161 "SunSpider/tests/sunspider-1.0/"), 162 "153700", "sunspider") 163 164 self._DownloadIfNecessary( 165 ("http://kraken-mirror.googlecode.com/svn/trunk/kraken/tests/" 166 "kraken-1.1/"), 167 "8", "kraken") 168 169 self._DownloadIfNecessary( 170 "http://octane-benchmark.googlecode.com/svn/trunk/", 171 "22", "octane") 172 173 os.chdir(old_cwd) 174 175 def VariantFlags(self): 176 # Both --nocrankshaft and --stressopt are very slow. 177 return [[]] 178 179 180 def GetSuite(name, root): 181 return BenchmarksTestSuite(name, root) 182