11456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org# Copyright 2012 the V8 project authors. All rights reserved.
27979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# Redistribution and use in source and binary forms, with or without
37979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# modification, are permitted provided that the following conditions are
47979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# met:
57979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#
67979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#     * Redistributions of source code must retain the above copyright
77979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       notice, this list of conditions and the following disclaimer.
87979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#     * Redistributions in binary form must reproduce the above
97979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       copyright notice, this list of conditions and the following
107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       disclaimer in the documentation and/or other materials provided
117979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       with the distribution.
127979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#     * Neither the name of Google Inc. nor the names of its
137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       contributors may be used to endorse or promote products derived
147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#       from this software without specific prior written permission.
157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org#
167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
292ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.orgimport hashlib
3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport os
31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgimport shutil
32212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgimport sys
33bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comimport tarfile
3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import testsuite
3679d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgfrom testrunner.local import utils
3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.objects import testcase
3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST_262_ARCHIVE_REVISION = "fbba29f"  # This is the r365 revision.
41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST_262_ARCHIVE_MD5 = "e1ff0db438cc12de8fb6da80621b4ef6"
42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST_262_URL = "https://github.com/tc39/test262/tarball/%s"
43528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgTEST_262_HARNESS = ["sta.js", "testBuiltInObject.js", "testIntl.js"]
4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass Test262TestSuite(testsuite.TestSuite):
4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def __init__(self, name, root):
4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    super(Test262TestSuite, self).__init__(name, root)
5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    self.testroot = os.path.join(root, "data", "test", "suite")
5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    self.harness = [os.path.join(self.root, "data", "test", "harness", f)
5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    for f in TEST_262_HARNESS]
5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    self.harness += [os.path.join(self.root, "harness-adapt.js")]
5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def CommonTestName(self, testcase):
5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return testcase.path.split(os.path.sep)[-1]
577979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def ListTests(self, context):
5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    tests = []
6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for dirname, dirs, files in os.walk(self.testroot):
6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      for dotted in [x for x in dirs if x.startswith(".")]:
6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        dirs.remove(dotted)
63528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if context.noi18n and "intl402" in dirs:
64528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        dirs.remove("intl402")
6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      dirs.sort()
6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      files.sort()
6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      for filename in files:
6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        if filename.endswith(".js"):
6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          testname = os.path.join(dirname[len(self.testroot) + 1:],
7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                                  filename[:-3])
7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          case = testcase.TestCase(self, testname)
7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          tests.append(case)
7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return tests
747979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def GetFlagsForTestCase(self, testcase, context):
7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return (testcase.flags + context.mode_flags + self.harness +
7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org            [os.path.join(self.testroot, testcase.path + ".js")])
7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def GetSourceForTest(self, testcase):
8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    filename = os.path.join(self.testroot, testcase.path + ".js")
8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    with open(filename) as f:
8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return f.read()
8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def IsNegativeTest(self, testcase):
8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return "@negative" in self.GetSourceForTest(testcase)
8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def IsFailureOutput(self, output, testpath):
8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if output.exit_code != 0:
8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return True
9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return "FAILED!" in output.stdout
9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def DownloadData(self):
9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    revision = TEST_262_ARCHIVE_REVISION
9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    archive_url = TEST_262_URL % revision
95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    archive_name = os.path.join(self.root, "tc39-test262-%s.tar.gz" % revision)
9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    directory_name = os.path.join(self.root, "data")
9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    directory_old_name = os.path.join(self.root, "data.old")
9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if not os.path.exists(archive_name):
9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "Downloading test data from %s ..." % archive_url
10079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org      utils.URLRetrieve(archive_url, archive_name)
10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if os.path.exists(directory_name):
102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        if os.path.exists(directory_old_name):
103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          shutil.rmtree(directory_old_name)
10433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        os.rename(directory_name, directory_old_name)
10533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if not os.path.exists(directory_name):
106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      print "Extracting test262-%s.tar.gz ..." % revision
10733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      md5 = hashlib.md5()
10833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      with open(archive_name, "rb") as f:
10933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        for chunk in iter(lambda: f.read(8192), ""):
11033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          md5.update(chunk)
11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if md5.hexdigest() != TEST_262_ARCHIVE_MD5:
11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        os.remove(archive_name)
11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        raise Exception("Hash mismatch of test data file")
114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      archive = tarfile.open(archive_name, "r:gz")
11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if sys.platform in ("win32", "cygwin"):
11633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        # Magic incantation to allow longer path names on Windows.
11733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        archive.extractall(u"\\\\?\\%s" % self.root)
11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      else:
11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        archive.extractall(self.root)
120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      os.rename(os.path.join(self.root, "tc39-test262-%s" % revision),
12133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                directory_name)
12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
12333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
12433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef GetSuite(name, root):
12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return Test262TestSuite(name, root)
126