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