1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport hashlib
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport shutil
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport sys
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport tarfile
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import testsuite
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import utils
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.objects import testcase
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSINON_TAG = '1.7.3'
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSINON_NAME = 'sinon'
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSINON_FILENAME = 'sinon.js'
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSINON_URL = 'http://sinonjs.org/releases/sinon-' + SINON_TAG + '.js'
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSINON_HASH = 'b7ab4dd9a1a2cf0460784af3728ad15caf4bbea923f680c5abde5c8332f35984'
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_TAG = '2.0.3'
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_ARCHIVE_TOP = 'promises-tests-' + TEST_TAG
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_NAME = 'promises-tests'
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_ARCHIVE = TEST_NAME + '.tar.gz'
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_URL = 'https://github.com/promises-aplus/promises-tests/archive/' + \
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_TAG + '.tar.gz'
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_ARCHIVE_HASH = \
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    'e446ca557ac5836dd439fecd19689c243a28b1d5a6644dd7fed4274d0fa67270'
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseAplusTestSuite(testsuite.TestSuite):
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def __init__(self, name, root):
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.root = root
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.test_files_root = os.path.join(self.root, TEST_NAME, 'lib', 'tests')
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.name = name
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.helper_files_pre = [
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      os.path.join(root, 'lib', name) for name in
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ['global.js', 'require.js', 'mocha.js', 'adapter.js']
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.helper_files_post = [
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      os.path.join(root, 'lib', name) for name in
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ['run-tests.js']
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def CommonTestName(self, testcase):
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return testcase.path.split(os.path.sep)[-1]
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def ListTests(self, context):
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return [testcase.TestCase(self, fname[:-len('.js')]) for fname in
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            os.listdir(os.path.join(self.root, TEST_NAME, 'lib', 'tests'))
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            if fname.endswith('.js')]
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetFlagsForTestCase(self, testcase, context):
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (testcase.flags + context.mode_flags + ['--harmony'] +
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            self.helper_files_pre +
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            [os.path.join(self.test_files_root, testcase.path + '.js')] +
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            self.helper_files_post)
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetSourceForTest(self, testcase):
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    filename = os.path.join(self.root, TEST_NAME,
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            'lib', 'tests', testcase.path + '.js')
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    with open(filename) as f:
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return f.read()
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def IsNegativeTest(self, testcase):
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return '@negative' in self.GetSourceForTest(testcase)
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def IsFailureOutput(self, output, testpath):
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if output.exit_code != 0:
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return True
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return not 'All tests have run.' in output.stdout or \
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           'FAIL:' in output.stdout
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def DownloadTestData(self):
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    archive = os.path.join(self.root, TEST_ARCHIVE)
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    directory = os.path.join(self.root, TEST_NAME)
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(archive):
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print('Downloading {0} from {1} ...'.format(TEST_NAME, TEST_URL))
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      utils.URLRetrieve(TEST_URL, archive)
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if os.path.exists(directory):
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        shutil.rmtree(directory)
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(directory):
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      print('Extracting {0} ...'.format(TEST_ARCHIVE))
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      hash = hashlib.sha256()
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      with open(archive, 'rb') as f:
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        for chunk in iter(lambda: f.read(8192), ''):
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          hash.update(chunk)
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if hash.hexdigest() != TEST_ARCHIVE_HASH:
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          os.remove(archive)
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          raise Exception('Hash mismatch of test data file')
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      archive = tarfile.open(archive, 'r:gz')
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if sys.platform in ('win32', 'cygwin'):
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        # Magic incantation to allow longer path names on Windows.
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        archive.extractall(u'\\\\?\\%s' % self.root)
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      else:
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        archive.extractall(self.root)
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      shutil.move(os.path.join(self.root, TEST_ARCHIVE_TOP), directory)
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def DownloadSinon(self):
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    directory = os.path.join(self.root, SINON_NAME)
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(directory):
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      os.mkdir(directory)
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    path = os.path.join(directory, SINON_FILENAME)
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(path):
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      utils.URLRetrieve(SINON_URL, path)
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    hash = hashlib.sha256()
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    with open(path, 'rb') as f:
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for chunk in iter(lambda: f.read(8192), ''):
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        hash.update(chunk)
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if hash.hexdigest() != SINON_HASH:
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      os.remove(path)
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise Exception('Hash mismatch of test data file')
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def DownloadData(self):
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.DownloadTestData()
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.DownloadSinon()
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef GetSuite(name, root):
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return PromiseAplusTestSuite(name, root)
148