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