blob: e6c7fae418320cd1d904472365881c3e3c2327ae [file] [log] [blame]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Creates a zip file that can be used by manual testers.
python chrome/test/mini_installer/create_zip.py
This will drop <OUTPUT_DIR>\mini_installer_tests.zip onto the disk.
To generate an easy-to-distribute package for manual testers add the current
and previous installers as mini_installer.exe and
previous_version_mini_installer.exe, as well as chromedriver.exe.
This can be passed out and extracted into c:\mini_installer_tests and go through
the README.
chromedriver.exe can be obtained one of two ways. Either download it from
http://chromedriver.chromium.org/downloads. It can also be built locally, but
if you do this make sure you are not building as components else you will
have to copy some dlls to the chromedriver.exe dir.
Note: This does not zip the executables by default. However paths to the
current, previous, and chromedriver binaries can be passed to be zipped.
The easiest way to package everything is to run:
python chrome\test\mini_installer\create_zip.py ^
-o <ZIP_FILE_OUTPUT_PATH> ^
-i <CURRENT_INSTALLER_PATH> ^
-p <PREVIOUS_INSTALLER_PATH> ^
-c <CHROMEDRIVER_PATH>
This will drop a zip file making the distribution of the test needs simple.
When the runner batch script is run it will install the python packages
required by the tests to further reduce the overhead of running the tests.
The directory structure is also preserved, so running the tests from
run_tests.bat all of the import paths are correct. __init__.py files
are dropped in any empty folders to make them importable.
"""
import argparse
import logging
import os
import re
import sys
import zipfile
THIS_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
SRC_DIR = os.path.join(THIS_DIR, '..', '..', '..')
SELENIUM_PATH = os.path.abspath(os.path.join(
SRC_DIR, r'third_party', 'webdriver', 'pylib'))
BLACKLIST = ['', '.pyc', '.gn', '.gni', '.txt', '.bat']
def ArchiveDirectory(path, zipf):
"""Archive an entire directory and subdirectories.
This will skip files that have an extension in BLACKLIST.
Args:
path: The path to the current directory.
zipf: A handle to a ZipFile instance.
"""
logging.debug('Archiving %s', path)
for c_path in [os.path.join(path, name) for name in os.listdir(path)]:
if os.path.isfile(c_path):
if os.path.splitext(c_path)[-1] in BLACKLIST:
continue
logging.debug('Adding %s', os.path.relpath(c_path, SRC_DIR))
zipf.write(c_path, os.path.relpath(c_path, SRC_DIR))
elif os.path.isdir(c_path):
ArchiveDirectory(c_path, zipf)
def main():
logging.basicConfig(
format='[%(asctime)s:%(filename)s(%(lineno)d)] %(message)s',
datefmt='%m%d/%H%M%S', level=logging.INFO)
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('--output-path', default='installer_tests.zip',
help='The path to write the zip file to')
parser.add_argument('--installer-path', default='',
help='The path to the current installer. This is '
'optional. If passed it will be zipped as '
'mini_installer.exe')
parser.add_argument('--previous-version-installer-path', default='',
help='The path to the previous installer. This is '
'optional. If passed it will be zipped as '
'previous_version_mini_installer.exe')
parser.add_argument('--chromedriver-path', default='',
help='The path to chromedriver.exe. This is '
'optional.')
args = parser.parse_args()
with zipfile.ZipFile(args.output_path, 'w') as zipf:
# Setup chrome\test\mini_installer as importable in Python
zipf.writestr(os.path.join('chrome', '__init__.py'), '')
zipf.writestr(os.path.join('chrome', 'test', '__init__.py'), '')
zipf.writestr(
os.path.join('chrome', 'test', 'mini_installer', '__init__.py'), '')
run_args = []
# Add any of the executables
if args.installer_path:
installer_name = os.path.split(args.installer_path)[-1]
run_args.append('--installer-path=' + installer_name)
logging.debug('Archiving: %s', installer_name)
zipf.write(args.installer_path, installer_name)
if args.previous_version_installer_path:
previous_version_installer_name = os.path.split(
args.previous_version_installer_path)[-1]
run_args.append(
'--previous-version-installer-path=' + previous_version_installer_name)
logging.debug('Archiving: %s', previous_version_installer_name)
zipf.write(
args.previous_version_installer_path, previous_version_installer_name)
if args.chromedriver_path:
chromedriver_name = os.path.split(args.chromedriver_path)[-1]
run_args.append('--chromedriver-path=' + chromedriver_name)
logging.debug('Archiving: %s', chromedriver_name)
zipf.write(
args.chromedriver_path, chromedriver_name)
# Add the top level files
with open(os.path.join(THIS_DIR, 'zip_test_runner.bat')) as rh:
text = rh.read().format(run_args=' '.join(run_args))
text = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", text)
zipf.writestr('zip_test_runner.bat', text)
zipf.write(os.path.join(THIS_DIR, 'ZIP_README.txt'),
os.path.split('README.txt')[-1])
# Archive this and the chromedriver code directories
logging.debug('Zipping chrome/test/mini_installer')
ArchiveDirectory(THIS_DIR, zipf)
logging.debug('Zipping third_party/webdriver/pylib')
ArchiveDirectory(SELENIUM_PATH, zipf)
logging.debug('Wrote zip to %s', args.output_path)
return 0
if __name__ == '__main__':
sys.exit(main())