1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockimport test
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockimport os
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfrom os.path import join, exists
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEXCLUDED = ['CVS']
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFRAMEWORK = """
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  browser.js
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  shell.js
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  jsref.js
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  template.js
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block""".split()
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST_DIRS = """
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ecma
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ecma_2
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ecma_3
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  js1_1
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  js1_2
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  js1_3
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  js1_4
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  js1_5
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block""".split()
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass MozillaTestCase(test.TestCase):
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def __init__(self, filename, path, context, root, mode, framework):
6080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    super(MozillaTestCase, self).__init__(context, path, mode)
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    self.filename = filename
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    self.framework = framework
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    self.root = root
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def IsNegative(self):
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return self.filename.endswith('-n.js')
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetLabel(self):
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return "%s mozilla %s" % (self.mode, self.GetName())
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def IsFailureOutput(self, output):
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if output.exit_code != 0:
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return True
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return 'FAILED!' in output.stdout
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetCommand(self):
7780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    result = self.context.GetVmCommand(self, self.mode) + \
7880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen       [ '--expose-gc', join(self.root, 'mozilla-shell-emulation.js') ]
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result += self.framework
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result.append(self.filename)
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return result
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetName(self):
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return self.path[-1]
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetSource(self):
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return open(self.filename).read()
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass MozillaTestConfiguration(test.TestConfiguration):
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def __init__(self, context, root):
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    super(MozillaTestConfiguration, self).__init__(context, root)
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  def ListTests(self, current_path, path, mode, variant_flags):
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    tests = []
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for test_dir in TEST_DIRS:
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      current_root = join(self.root, 'data', test_dir)
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for root, dirs, files in os.walk(current_root):
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for dotted in [x  for x in dirs if x.startswith('.')]:
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          dirs.remove(dotted)
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for excluded in EXCLUDED:
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if excluded in dirs:
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            dirs.remove(excluded)
105d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block        dirs.sort()
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        root_path = root[len(self.root):].split(os.path.sep)
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        root_path = current_path + [x for x in root_path if x]
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        framework = []
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for i in xrange(len(root_path)):
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if i == 0: dir = root_path[1:]
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          else: dir = root_path[1:-i]
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          script = join(self.root, reduce(join, dir, ''), 'shell.js')
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if exists(script):
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            framework.append(script)
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        framework.reverse()
116d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block        files.sort()
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for file in files:
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (not file in FRAMEWORK) and file.endswith('.js'):
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            full_path = root_path + [file[:-3]]
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            full_path = [x for x in full_path if x != 'data']
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if self.Contains(path, full_path):
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              test = MozillaTestCase(join(root, file), full_path, self.context,
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                     self.root, mode, framework)
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              tests.append(test)
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return tests
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetBuildRequirements(self):
12869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return ['d8']
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  def GetTestStatus(self, sections, defs):
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    status_file = join(self.root, 'mozilla.status')
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if exists(status_file):
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      test.ReadConfigurationInto(status_file, sections, defs)
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdef GetConfiguration(context, root):
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MozillaTestConfiguration(context, root)
138