# Copyright 2014 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import hashlib import os import shutil import sys import tarfile import imp from testrunner.local import testsuite from testrunner.local import utils from testrunner.objects import testcase SIMDJS_ARCHIVE_REVISION = "07e2713e0c9ea19feb0732d5bd84770c87310d79" SIMDJS_ARCHIVE_MD5 = "cf6bddf99f18800b68e782054268ee3c" SIMDJS_URL = ( "https://github.com/johnmccutchan/ecmascript_simd/archive/%s.tar.gz") SIMDJS_SUITE_PATH = ["data", "src"] class SimdJsTestSuite(testsuite.TestSuite): def __init__(self, name, root): super(SimdJsTestSuite, self).__init__(name, root) self.testroot = os.path.join(self.root, *SIMDJS_SUITE_PATH) self.ParseTestRecord = None def ListTests(self, context): tests = [ testcase.TestCase(self, 'shell_test_runner'), ] for filename in os.listdir(os.path.join(self.testroot, 'benchmarks')): if (not filename.endswith('.js') or filename in ['run.js', 'run_browser.js', 'base.js']): continue name = filename.rsplit('.')[0] tests.append( testcase.TestCase(self, 'benchmarks/' + name)) return tests def GetFlagsForTestCase(self, testcase, context): return (testcase.flags + context.mode_flags + [os.path.join(self.root, "harness-adapt.js"), "--harmony", os.path.join(self.testroot, testcase.path + ".js"), os.path.join(self.root, "harness-finish.js")]) def GetSourceForTest(self, testcase): filename = os.path.join(self.testroot, testcase.path + ".js") with open(filename) as f: return f.read() def IsNegativeTest(self, testcase): return False def IsFailureOutput(self, output, testpath): if output.exit_code != 0: return True return "FAILED!" in output.stdout def DownloadData(self): revision = SIMDJS_ARCHIVE_REVISION archive_url = SIMDJS_URL % revision archive_name = os.path.join( self.root, "ecmascript_simd-%s.tar.gz" % revision) directory_name = os.path.join(self.root, "data") directory_old_name = os.path.join(self.root, "data.old") if not os.path.exists(archive_name): print "Downloading test data from %s ..." % archive_url utils.URLRetrieve(archive_url, archive_name) if os.path.exists(directory_name): if os.path.exists(directory_old_name): shutil.rmtree(directory_old_name) os.rename(directory_name, directory_old_name) if not os.path.exists(directory_name): print "Extracting ecmascript_simd-%s.tar.gz ..." % revision md5 = hashlib.md5() with open(archive_name, "rb") as f: for chunk in iter(lambda: f.read(8192), ""): md5.update(chunk) print "MD5 hash is %s" % md5.hexdigest() if md5.hexdigest() != SIMDJS_ARCHIVE_MD5: os.remove(archive_name) print "MD5 expected %s" % SIMDJS_ARCHIVE_MD5 raise Exception("MD5 hash mismatch of test data file") archive = tarfile.open(archive_name, "r:gz") if sys.platform in ("win32", "cygwin"): # Magic incantation to allow longer path names on Windows. archive.extractall(u"\\\\?\\%s" % self.root) else: archive.extractall(self.root) os.rename(os.path.join(self.root, "ecmascript_simd-%s" % revision), directory_name) def GetSuite(name, root): return SimdJsTestSuite(name, root)