144f0eee88ff00398ff7f715fab053374d808c90dSteve Block# Copyright 2011 the V8 project authors. All rights reserved. 244f0eee88ff00398ff7f715fab053374d808c90dSteve Block# Redistribution and use in source and binary forms, with or without 344f0eee88ff00398ff7f715fab053374d808c90dSteve Block# modification, are permitted provided that the following conditions are 444f0eee88ff00398ff7f715fab053374d808c90dSteve Block# met: 544f0eee88ff00398ff7f715fab053374d808c90dSteve Block# 644f0eee88ff00398ff7f715fab053374d808c90dSteve Block# * Redistributions of source code must retain the above copyright 744f0eee88ff00398ff7f715fab053374d808c90dSteve Block# notice, this list of conditions and the following disclaimer. 844f0eee88ff00398ff7f715fab053374d808c90dSteve Block# * Redistributions in binary form must reproduce the above 944f0eee88ff00398ff7f715fab053374d808c90dSteve Block# copyright notice, this list of conditions and the following 1044f0eee88ff00398ff7f715fab053374d808c90dSteve Block# disclaimer in the documentation and/or other materials provided 1144f0eee88ff00398ff7f715fab053374d808c90dSteve Block# with the distribution. 1244f0eee88ff00398ff7f715fab053374d808c90dSteve Block# * Neither the name of Google Inc. nor the names of its 1344f0eee88ff00398ff7f715fab053374d808c90dSteve Block# contributors may be used to endorse or promote products derived 1444f0eee88ff00398ff7f715fab053374d808c90dSteve Block# from this software without specific prior written permission. 1544f0eee88ff00398ff7f715fab053374d808c90dSteve Block# 1644f0eee88ff00398ff7f715fab053374d808c90dSteve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1744f0eee88ff00398ff7f715fab053374d808c90dSteve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1844f0eee88ff00398ff7f715fab053374d808c90dSteve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1944f0eee88ff00398ff7f715fab053374d808c90dSteve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2044f0eee88ff00398ff7f715fab053374d808c90dSteve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2144f0eee88ff00398ff7f715fab053374d808c90dSteve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2244f0eee88ff00398ff7f715fab053374d808c90dSteve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2344f0eee88ff00398ff7f715fab053374d808c90dSteve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2444f0eee88ff00398ff7f715fab053374d808c90dSteve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2544f0eee88ff00398ff7f715fab053374d808c90dSteve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2644f0eee88ff00398ff7f715fab053374d808c90dSteve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockimport test 3044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockimport os 3144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockfrom os.path import join, exists 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport urllib 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport hashlib 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport tarfile 3544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTEST_262_ARCHIVE_REVISION = '3a890174343c' # This is the r309 revision. 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTEST_262_ARCHIVE_MD5 = 'be5d4cfbe69cef70430907b8f3a92b50' 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTEST_262_URL = 'http://hg.ecmascript.org/tests/test262/archive/%s.tar.bz2' 4044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockTEST_262_HARNESS = ['sta.js'] 4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Test262TestCase(test.TestCase): 4444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4544f0eee88ff00398ff7f715fab053374d808c90dSteve Block def __init__(self, filename, path, context, root, mode, framework): 4644f0eee88ff00398ff7f715fab053374d808c90dSteve Block super(Test262TestCase, self).__init__(context, path, mode) 4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block self.filename = filename 4844f0eee88ff00398ff7f715fab053374d808c90dSteve Block self.framework = framework 4944f0eee88ff00398ff7f715fab053374d808c90dSteve Block self.root = root 5044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5144f0eee88ff00398ff7f715fab053374d808c90dSteve Block def IsNegative(self): 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return '@negative' in self.GetSource() 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetLabel(self): 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return "%s test262 %s" % (self.mode, self.GetName()) 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5744f0eee88ff00398ff7f715fab053374d808c90dSteve Block def IsFailureOutput(self, output): 5844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if output.exit_code != 0: 5944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return True 6044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return 'FAILED!' in output.stdout 6144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6244f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetCommand(self): 6344f0eee88ff00398ff7f715fab053374d808c90dSteve Block result = self.context.GetVmCommand(self, self.mode) 6444f0eee88ff00398ff7f715fab053374d808c90dSteve Block result += self.framework 6544f0eee88ff00398ff7f715fab053374d808c90dSteve Block result.append(self.filename) 6644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return result 6744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6844f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetName(self): 6944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return self.path[-1] 7044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7144f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetSource(self): 7244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return open(self.filename).read() 7344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Test262TestConfiguration(test.TestConfiguration): 7644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7744f0eee88ff00398ff7f715fab053374d808c90dSteve Block def __init__(self, context, root): 7844f0eee88ff00398ff7f715fab053374d808c90dSteve Block super(Test262TestConfiguration, self).__init__(context, root) 7944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch def ListTests(self, current_path, path, mode, variant_flags): 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch testroot = join(self.root, 'data', 'test', 'suite') 8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block harness = [join(self.root, 'data', 'test', 'harness', f) 8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block for f in TEST_262_HARNESS] 8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block harness += [join(self.root, 'harness-adapt.js')] 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch tests = [] 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for root, dirs, files in os.walk(testroot): 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for dotted in [x for x in dirs if x.startswith('.')]: 8844f0eee88ff00398ff7f715fab053374d808c90dSteve Block dirs.remove(dotted) 8944f0eee88ff00398ff7f715fab053374d808c90dSteve Block dirs.sort() 9044f0eee88ff00398ff7f715fab053374d808c90dSteve Block root_path = root[len(self.root):].split(os.path.sep) 9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block root_path = current_path + [x for x in root_path if x] 9244f0eee88ff00398ff7f715fab053374d808c90dSteve Block files.sort() 9344f0eee88ff00398ff7f715fab053374d808c90dSteve Block for file in files: 9444f0eee88ff00398ff7f715fab053374d808c90dSteve Block if file.endswith('.js'): 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch test_path = ['test262', file[:-3]] 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if self.Contains(path, test_path): 9744f0eee88ff00398ff7f715fab053374d808c90dSteve Block test = Test262TestCase(join(root, file), test_path, self.context, 9844f0eee88ff00398ff7f715fab053374d808c90dSteve Block self.root, mode, harness) 9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block tests.append(test) 10085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return tests 1015d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch def DownloadData(self): 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch revision = TEST_262_ARCHIVE_REVISION 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch archive_url = TEST_262_URL % revision 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch archive_name = join(self.root, 'test262-%s.tar.bz2' % revision) 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch directory_name = join(self.root, "test262-%s" % revision) 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if not exists(directory_name) or not exists(archive_name): 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if not exists(archive_name): 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print "Downloading test data from %s ..." % archive_url 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch urllib.urlretrieve(archive_url, archive_name) 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if not exists(directory_name): 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print "Extracting test262-%s.tar.bz2 ..." % revision 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch md5 = hashlib.md5() 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch with open(archive_name,'rb') as f: 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for chunk in iter(lambda: f.read(8192), ''): 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch md5.update(chunk) 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if md5.hexdigest() != TEST_262_ARCHIVE_MD5: 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch raise Exception("Hash mismatch of test data file") 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch archive = tarfile.open(archive_name, 'r:bz2') 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch archive.extractall(join(self.root)) 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if not exists(join(self.root, 'data')): 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.symlink(directory_name, join(self.root, 'data')) 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12444f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetBuildRequirements(self): 12569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return ['d8'] 12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block def GetTestStatus(self, sections, defs): 12844f0eee88ff00398ff7f715fab053374d808c90dSteve Block status_file = join(self.root, 'test262.status') 12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block if exists(status_file): 13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block test.ReadConfigurationInto(status_file, sections, defs) 13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockdef GetConfiguration(context, root): 13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Test262TestConfiguration(context, root) 135