19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org# Copyright 2008 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comimport os
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comimport re
3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import testsuite
3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.objects import testcase
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comFLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
352d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgFILES_PATTERN = re.compile(r"//\s+Files:(.*)")
36defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgSELF_SCRIPT_PATTERN = re.compile(r"//\s+Env: TEST_FILE_NAME")
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass MjsunitTestSuite(testsuite.TestSuite):
4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def __init__(self, name, root):
4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    super(MjsunitTestSuite, self).__init__(name, root)
4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def ListTests(self, context):
4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    tests = []
4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for dirname, dirs, files in os.walk(self.root):
4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      for dotted in [x for x in dirs if x.startswith('.')]:
4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        dirs.remove(dotted)
4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      dirs.sort()
5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      files.sort()
5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      for filename in files:
5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        if filename.endswith(".js") and filename != "mjsunit.js":
53b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org          testname = os.path.join(dirname[len(self.root) + 1:], filename[:-3])
5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          test = testcase.TestCase(self, testname)
5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          tests.append(test)
5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return tests
5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def GetFlagsForTestCase(self, testcase, context):
5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    source = self.GetSourceForTest(testcase)
6072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org    flags = [] + context.mode_flags
6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    flags_match = re.findall(FLAGS_PATTERN, source)
6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for match in flags_match:
6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      flags += match.strip().split()
6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    files_list = []  # List of file names to append to command arguments.
6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    files_match = FILES_PATTERN.search(source);
6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    # Accept several lines of 'Files:'.
6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    while True:
6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if files_match:
7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        files_list += files_match.group(1).strip().split()
7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        files_match = FILES_PATTERN.search(source, files_match.end())
7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      else:
7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        break
7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    files = [ os.path.normpath(os.path.join(self.root, '..', '..', f))
7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org              for f in files_list ]
7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    testfilename = os.path.join(self.root, testcase.path + self.suffix())
7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if SELF_SCRIPT_PATTERN.search(source):
7846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      env = ["-e", "TEST_FILE_NAME=\"%s\"" % testfilename.replace("\\", "\\\\")]
7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      files = env + files
8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    files.append(os.path.join(self.root, "mjsunit.js"))
8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    files.append(testfilename)
8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    flags += files
8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if context.isolates:
8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      flags.append("--isolate")
8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      flags += files
8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return testcase.flags + flags
8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  def GetSourceForTest(self, testcase):
9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    filename = os.path.join(self.root, testcase.path + self.suffix())
9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    with open(filename) as f:
9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return f.read()
9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef GetSuite(name, root):
9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return MjsunitTestSuite(name, root)
98