Implement --download-data for test harness.

This allows the test harness to download missing test suite data if
necessary. We use the bzip2 archive for test262 because it is faster
than cloning the repository and also works without any Mercurial
installation.

R=yangguo@chromium.org

Review URL: https://chromiumcodereview.appspot.com/9619002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10955 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 886a1c64
...@@ -29,8 +29,14 @@ ...@@ -29,8 +29,14 @@
import test import test
import os import os
from os.path import join, exists from os.path import join, exists
import urllib
import hashlib
import tarfile
TEST_262_ARCHIVE_REVISION = '3a890174343c' # This is the r309 revision.
TEST_262_ARCHIVE_MD5 = 'be5d4cfbe69cef70430907b8f3a92b50'
TEST_262_URL = 'http://hg.ecmascript.org/tests/test262/archive/%s.tar.bz2'
TEST_262_HARNESS = ['sta.js'] TEST_262_HARNESS = ['sta.js']
...@@ -93,6 +99,28 @@ class Test262TestConfiguration(test.TestConfiguration): ...@@ -93,6 +99,28 @@ class Test262TestConfiguration(test.TestConfiguration):
tests.append(test) tests.append(test)
return tests return tests
def DownloadData(self):
revision = TEST_262_ARCHIVE_REVISION
archive_url = TEST_262_URL % revision
archive_name = join(self.root, 'test262-%s.tar.bz2' % revision)
directory_name = join(self.root, "test262-%s" % revision)
if not exists(directory_name) or not exists(archive_name):
if not exists(archive_name):
print "Downloading test data from %s ..." % archive_url
urllib.urlretrieve(archive_url, archive_name)
if not exists(directory_name):
print "Extracting test262-%s.tar.bz2 ..." % revision
md5 = hashlib.md5()
with open(archive_name,'rb') as f:
for chunk in iter(lambda: f.read(8192), ''):
md5.update(chunk)
if md5.hexdigest() != TEST_262_ARCHIVE_MD5:
raise Exception("Hash mismatch of test data file")
archive = tarfile.open(archive_name, 'r:bz2')
archive.extractall(join(self.root))
if not exists(join(self.root, 'data')):
os.symlink(directory_name, join(self.root, 'data'))
def GetBuildRequirements(self): def GetBuildRequirements(self):
return ['d8'] return ['d8']
......
...@@ -73,6 +73,8 @@ def BuildOptions(): ...@@ -73,6 +73,8 @@ def BuildOptions():
choices=PROGRESS_INDICATORS, default="mono") choices=PROGRESS_INDICATORS, default="mono")
result.add_option("--report", help="Print a summary of the tests to be run", result.add_option("--report", help="Print a summary of the tests to be run",
default=False, action="store_true") default=False, action="store_true")
result.add_option("--download-data", help="Download missing test suite data",
default=False, action="store_true")
result.add_option("-s", "--suite", help="A test suite", result.add_option("-s", "--suite", help="A test suite",
default=[], action="append") default=[], action="append")
result.add_option("-t", "--timeout", help="Timeout in seconds", result.add_option("-t", "--timeout", help="Timeout in seconds",
...@@ -161,6 +163,8 @@ def PassOnOptions(options): ...@@ -161,6 +163,8 @@ def PassOnOptions(options):
result += ['--progress=' + options.progress] result += ['--progress=' + options.progress]
if options.report: if options.report:
result += ['--report'] result += ['--report']
if options.download_data:
result += ['--download-data']
if options.suite != []: if options.suite != []:
for suite in options.suite: for suite in options.suite:
result += ['--suite=../../test/' + suite] result += ['--suite=../../test/' + suite]
......
...@@ -631,9 +631,15 @@ class TestRepository(TestSuite): ...@@ -631,9 +631,15 @@ class TestRepository(TestSuite):
def GetBuildRequirements(self, path, context): def GetBuildRequirements(self, path, context):
return self.GetConfiguration(context).GetBuildRequirements() return self.GetConfiguration(context).GetBuildRequirements()
def DownloadData(self, context):
config = self.GetConfiguration(context)
if 'DownloadData' in dir(config):
config.DownloadData()
def AddTestsToList(self, result, current_path, path, context, mode): def AddTestsToList(self, result, current_path, path, context, mode):
for v in self.GetConfiguration(context).VariantFlags(): config = self.GetConfiguration(context)
tests = self.GetConfiguration(context).ListTests(current_path, path, mode, v) for v in config.VariantFlags():
tests = config.ListTests(current_path, path, mode, v)
for t in tests: t.variant_flags = v for t in tests: t.variant_flags = v
result += tests result += tests
...@@ -655,6 +661,12 @@ class LiteralTestSuite(TestSuite): ...@@ -655,6 +661,12 @@ class LiteralTestSuite(TestSuite):
result += test.GetBuildRequirements(rest, context) result += test.GetBuildRequirements(rest, context)
return result return result
def DownloadData(self, path, context):
(name, rest) = CarCdr(path)
for test in self.tests:
if not name or name.match(test.GetName()):
test.DownloadData(context)
def ListTests(self, current_path, path, context, mode, variant_flags): def ListTests(self, current_path, path, context, mode, variant_flags):
(name, rest) = CarCdr(path) (name, rest) = CarCdr(path)
result = [ ] result = [ ]
...@@ -1192,6 +1204,8 @@ def BuildOptions(): ...@@ -1192,6 +1204,8 @@ def BuildOptions():
default='scons') default='scons')
result.add_option("--report", help="Print a summary of the tests to be run", result.add_option("--report", help="Print a summary of the tests to be run",
default=False, action="store_true") default=False, action="store_true")
result.add_option("--download-data", help="Download missing test suite data",
default=False, action="store_true")
result.add_option("-s", "--suite", help="A test suite", result.add_option("-s", "--suite", help="A test suite",
default=[], action="append") default=[], action="append")
result.add_option("-t", "--timeout", help="Timeout in seconds", result.add_option("-t", "--timeout", help="Timeout in seconds",
...@@ -1462,6 +1476,11 @@ def Main(): ...@@ -1462,6 +1476,11 @@ def Main():
root.GetTestStatus(context, sections, defs) root.GetTestStatus(context, sections, defs)
config = Configuration(sections, defs) config = Configuration(sections, defs)
# Download missing test suite data if requested.
if options.download_data:
for path in paths:
root.DownloadData(path, context)
# List the tests # List the tests
all_cases = [ ] all_cases = [ ]
all_unused = [ ] all_unused = [ ]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment