1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import commands
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import testsuite
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import utils
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.objects import testcase
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FuzzNativesTestSuite(testsuite.TestSuite):
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def __init__(self, name, root):
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    super(FuzzNativesTestSuite, self).__init__(name, root)
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def ListTests(self, context):
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    shell = os.path.abspath(os.path.join(context.shell_dir, self.shell()))
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if utils.IsWindows():
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      shell += ".exe"
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    output = commands.Execute(
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        context.command_prefix +
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        [shell, "--allow-natives-syntax", "-e",
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         "try { var natives = %ListNatives();"
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         "  for (var n in natives) { print(natives[n]); }"
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         "} catch(e) {}"] +
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        context.extra_flags)
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if output.exit_code != 0:
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print output.stdout
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print output.stderr
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assert False, "Failed to get natives list."
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tests = []
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for line in output.stdout.strip().split():
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      try:
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (name, argc) = line.split(",")
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags = ["--allow-natives-syntax",
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 "-e", "var NAME = '%s', ARGC = %s;" % (name, argc)]
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        test = testcase.TestCase(self, name, flags)
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        tests.append(test)
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      except:
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        # Work-around: If parsing didn't work, it might have been due to output
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        # caused by other d8 flags.
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pass
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return tests
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetFlagsForTestCase(self, testcase, context):
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    name = testcase.path
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    basefile = os.path.join(self.root, "base.js")
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return testcase.flags + [basefile] + context.mode_flags
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef GetSuite(name, root):
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return FuzzNativesTestSuite(name, root)
53