Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1338)

Unified Diff: build/test_packages.py

Issue 2095173002: Teach build.py to cross-compile go-based packages. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: prebuild stdlib Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/packages/luci_machine_tokend.yaml ('k') | go/bootstrap.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/test_packages.py
diff --git a/build/test_packages.py b/build/test_packages.py
index 8041a08171342152c767fff59a851e1c8f438a8f..a5ed2733abeff2f2e51eced34d5b6813c84a392d 100755
--- a/build/test_packages.py
+++ b/build/test_packages.py
@@ -8,11 +8,11 @@
Supposed to be invoked after build.py has run. Uses packages from out/*.cipd and
tests from tests/*.py.
-Assumes cipd client is built in ../go/bin/cipd (true after build.py has run).
+Assumes cipd client is built in out/.cipd_client/cipd_* (true after build.py has
+run).
"""
import argparse
-import glob
import os
import re
import shutil
@@ -52,14 +52,34 @@ def get_docstring(test_script):
return m.group(1).strip().splitlines()[0]
+def find_cipd_client(out_dir):
+ """Returns path to cipd client built by build.py.
+
+ See build_cipd_client in build.py. It puts cipd client into
+ '<out_dir>/.cipd_client/cipd_<digest>' and there's only one such file there.
+
+ Prints error message and returns None if the file cannot be found.
+ """
+ out_dir = os.path.join(out_dir, '.cipd_client')
+ files = [f for f in os.listdir(out_dir) if f.startswith('cipd_')]
+ if not files:
+ print >> sys.stderr, 'Cannot find CIPD client in %s' % out_dir
+ return None
+ if len(files) != 1:
+ print >> sys.stderr, (
+ 'There should be only one cipd client binary in %s, found %s' %
+ (out_dir, files))
+ return None
+ cipd_client = os.path.join(out_dir, files[0])
+ if not os.access(cipd_client, os.X_OK):
+ print >> sys.stderr, 'CIPD client at %s is not runnable'
+ return None
+ return cipd_client
+
+
def run_test(cipd_client, package, work_dir, test_script):
"""Extracts a package to a dir and runs test_script with cwd == work_dir."""
print_title('Deploying %s' % os.path.basename(package))
- if not os.access(cipd_client, os.X_OK):
- print >> sys.stderr, (
- 'CIPD client at %s doesn\'t exist or not runnable. Run build.py to '
- 'build it.' % cipd_client)
- return 1
cmd_line = ['cipd', 'pkg-deploy', '-root', work_dir, package]
print ' '.join(cmd_line)
if subprocess.call(args=cmd_line, executable=cipd_client):
@@ -77,7 +97,6 @@ def run_test(cipd_client, package, work_dir, test_script):
def run(
- cipd_client,
package_out_dir,
package_tests_dir,
work_dir,
@@ -88,7 +107,6 @@ def run(
important for infra_python package that has non-trivial structure.
Args:
- cipd_client: path to cipd client executable.
package_out_dir: where to search for built packages.
work_dir: where to install/update packages into.
packages: names of *.cipd files in package_out_dir or [] for all.
@@ -99,7 +117,17 @@ def run(
# Discover what to test.
paths = []
if not packages:
- paths = glob.glob(os.path.join(package_out_dir, '*.cipd'))
+ # Enumerate all known tests in tests/*.py and filter them based on
+ # availability of corresponding *.cipd package in package_out_dir. It will
+ # skip any cross-compiled packages, since they have additional '+<platform>'
+ # suffix in the package file name.
+ for test in os.listdir(package_tests_dir):
+ if not test.endswith('.py'):
+ continue
+ pkg_file = os.path.join(
+ package_out_dir, os.path.splitext(test)[0] + '.cipd')
+ if os.path.exists(pkg_file):
+ paths.append(pkg_file)
else:
for name in packages:
abs_path = os.path.join(package_out_dir, name)
@@ -111,7 +139,11 @@ def run(
print 'Nothing to test.'
return 0
- # Run all tests sequentially. There're like 2 of them tops.
+ cipd_client = find_cipd_client(package_out_dir)
+ if not cipd_client:
+ return 1
+
+ # Run all tests sequentially. Most of the are extra fast.
nuke_temp = False
if not work_dir:
work_dir = tempfile.mkdtemp(suffix='cipd_test')
@@ -149,19 +181,17 @@ def run(
def main(
args,
- go_workspace=os.path.join(ROOT, 'go'),
package_out_dir=os.path.join(ROOT, 'build', 'out'),
package_tests_dir=os.path.join(ROOT, 'build', 'tests')):
parser = argparse.ArgumentParser(description='Tests infra CIPD packages')
parser.add_argument(
'packages', metavar='NAME', type=str, nargs='*',
- help='name of a build package file in build/out/* to deploy and test')
+ help='name of a built package file in build/out/* to deploy and test')
parser.add_argument(
'--work-dir', metavar='DIR', dest='work_dir',
help='directory to deploy packages into (temporary dir by default)')
args = parser.parse_args(args)
return run(
- os.path.join(go_workspace, 'bin', 'cipd' + EXE_SUFFIX),
package_out_dir,
package_tests_dir,
args.work_dir,
« no previous file with comments | « build/packages/luci_machine_tokend.yaml ('k') | go/bootstrap.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698