Update testing tools (AppRTC, Go) to new versions

App engine is included in the AppRTC archive, so the separate archive is not needed anymore.
Mercurial is no longer necessary to include but it will be required during the vendoring step when the prebuilt archives are update.

The download/build scripts have been simplified accordingly.

The video quality test has been updated to work with the new appengine.

BUG=webrtc:7602

Review-Url: https://codereview.webrtc.org/2882073003
Cr-Commit-Position: refs/heads/master@{#18162}
This commit is contained in:
oprypin
2017-05-16 05:36:15 -07:00
committed by Commit bot
parent b3b2a8f424
commit 1d7392a45c
15 changed files with 192 additions and 302 deletions

View File

@ -19,7 +19,6 @@ It assumes you have a Android device plugged in.
"""
import argparse
import atexit
import logging
import os
import shutil
@ -32,13 +31,6 @@ import time
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
os.pardir))
WEBRTC_DEPS_INSTRUCTIONS = """Please add a solution to your .gclient file like
this and run gclient sync:
{
"name": "webrtc.DEPS",
"url": "https://chromium.googlesource.com/chromium/deps/webrtc/webrtc.DEPS",
},
"""
class Error(Exception):
@ -62,7 +54,6 @@ def _RunCommandWithOutput(argv, cwd=SRC_DIR, **kwargs):
def _RunBackgroundCommand(argv, cwd=SRC_DIR):
logging.info('Running %r', argv)
process = subprocess.Popen(argv, cwd=cwd)
atexit.register(process.terminate)
time.sleep(0.5)
status = process.poll()
if status: # is not None or 0
@ -108,8 +99,14 @@ def main():
toolchain_dir = os.path.join(tools_dir, 'video_quality_toolchain')
# Download ffmpeg and zxing.
download_script = os.path.join(tools_dir, 'download_tools.py')
_RunCommand([sys.executable, download_script, toolchain_dir])
download_tools_script = os.path.join(tools_dir, 'download_tools.py')
_RunCommand([sys.executable, download_tools_script, toolchain_dir])
testing_tools_dir = os.path.join(SRC_DIR, 'webrtc', 'tools', 'testing')
# Download, extract and build AppRTC.
setup_apprtc_script = os.path.join(testing_tools_dir, 'setup_apprtc.py')
_RunCommand([sys.executable, setup_apprtc_script, temp_dir])
# Select an Android device in case multiple are connected
for line in _RunCommandWithOutput([adb_path, 'devices']).splitlines():
@ -119,31 +116,29 @@ def main():
else:
raise VideoQualityTestError('Cannot find any connected Android device.')
processes = []
try:
# Start AppRTC Server
dev_appserver = os.path.join(SRC_DIR, 'out', 'apprtc', 'google_appengine',
'dev_appserver.py')
if not os.path.isfile(dev_appserver):
raise VideoQualityTestError('Cannot find %s.\n%s' %
(dev_appserver, WEBRTC_DEPS_INSTRUCTIONS))
appengine_dir = os.path.join(SRC_DIR, 'out', 'apprtc', 'out', 'app_engine')
_RunBackgroundCommand(['python', dev_appserver, appengine_dir,
dev_appserver = os.path.join(temp_dir, 'apprtc', 'temp', 'google-cloud-sdk',
'bin', 'dev_appserver.py')
appengine_dir = os.path.join(temp_dir, 'apprtc', 'out', 'app_engine')
processes.append(_RunBackgroundCommand([
'python', dev_appserver, appengine_dir,
'--port=9999', '--admin_port=9998',
'--skip_sdk_update_check', '--clear_datastore=yes'])
'--skip_sdk_update_check', '--clear_datastore=yes']))
# Start Collider
collider_path = os.path.join(SRC_DIR, 'out', 'go-workspace', 'bin',
'collidermain')
if not os.path.isfile(collider_path):
raise VideoQualityTestError('Cannot find %s.\n%s' %
(collider_path, WEBRTC_DEPS_INSTRUCTIONS))
_RunBackgroundCommand([collider_path, '-tls=false',
'-port=8089', '-room-server=http://localhost:9999'])
collider_path = os.path.join(temp_dir, 'collider', 'collidermain')
processes.append(_RunBackgroundCommand([
collider_path, '-tls=false', '-port=8089',
'-room-server=http://localhost:9999']))
# Start adb reverse forwarder
reverseforwarder_path = os.path.join(
SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py')
_RunBackgroundCommand([reverseforwarder_path, '--device', android_device,
'9999', '9999', '8089', '8089'])
processes.append(_RunBackgroundCommand([
reverseforwarder_path, '--device', android_device,
'9999', '9999', '8089', '8089']))
# Run the Espresso code.
test_script = os.path.join(build_dir_android,
@ -173,7 +168,8 @@ def main():
ConvertVideo(reference_video, reference_video_yuv)
# Run compare script.
compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools', 'compare_videos.py')
compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools',
'compare_videos.py')
zxing_path = os.path.join(toolchain_dir, 'linux', 'zxing')
# The frame_analyzer binary should be built for local computer and not for
@ -191,9 +187,16 @@ def main():
'--test_video', test_video_yuv, '--yuv_frame_width', str(frame_width),
'--yuv_frame_height', str(frame_height),
'--stats_file_ref', stats_file_ref,
'--stats_file_test', stats_file_test, '--frame_analyzer', frame_analyzer,
'--stats_file_test', stats_file_test,
'--frame_analyzer', frame_analyzer,
'--ffmpeg_path', ffmpeg_path, '--zxing_path', zxing_path])
finally:
for process in processes:
if process:
process.terminate()
process.wait()
shutil.rmtree(temp_dir)

View File

@ -0,0 +1,38 @@
This directory contains prebuilt tools used during end-to-end tests.
They will be downloaded by their SHA1 hash, and are not meant to be checked in.
Updating prebuilt_apprtc.zip:
- Follow AppRTC instructions:
- `git clone https://github.com/webrtc/apprtc`
- Install NodeJS:
- Download <https://nodejs.org/> and extract it
- `export PATH="$(pwd)/node-v6.10.3-linux-x64/bin:$PATH"`
- `cd apprtc`
- `npm install`
- `export PATH="$(pwd)/node_modules/.bin:$PATH"`
- `pip install --user --upgrade pip setuptools` - needed only on old systems
- `grunt`
- Vendor collider's dependencies:
- `ln -s "$(pwd)/src/collider" src/src`
- `GOPATH="$(pwd)/src" go get -d collidermain`
- `rm src/src`
- Remove unneeded files:
- `rm -rf .git node_modules browsers`
- `zip -r prebuilt_apprtc.zip apprtc/`
- `mv prebuilt_apprtc.zip webrtc/src/webrtc/tools/testing/prebuilt_apprtc.zip`
Updating golang/*:
- Go to <https://golang.org/dl/>
- Download these files:
- go*.linux-amd64.tar.gz -> golang/linux/go.tar.gz
- go*.darwin-amd64.tar.gz -> golang/mac/go.tar.gz
- go*.windows-amd64.zip -> golang/windows/go.zip
After updating the archives:
- `cd webrtc/src/webrtc/tools/testing`
- For each updated archive:
- `upload_to_google_storage.py file.zip --bucket=chromium-webrtc-resources`
- `git commit -a && git cl upload`

View File

@ -9,11 +9,11 @@
"""Builds the AppRTC collider using the golang toolchain.
The golang toolchain is downloaded by download_golang.py. We use that here
The golang toolchain is downloaded by download_apprtc.py. We use that here
to build the AppRTC collider server.
This script needs to know the path to the 'src' directory in apprtc, the
root directory of 'go', the root directory of 'hg' and the output_dir.
root directory of 'go' and the output_dir.
"""
import os
@ -24,35 +24,30 @@ import sys
import utils
USAGE_STR = "Usage: {} <apprtc_src_dir> <go_dir> <hg_dir> <output_dir>"
USAGE_STR = "Usage: {} <apprtc_src_dir> <go_dir> <output_dir>"
def main(argv):
if len(argv) != 5:
if len(argv) != 4:
return USAGE_STR.format(argv[0])
apprtc_dir = argv[1]
go_root_dir = argv[2]
mercurial_dir = argv[3]
golang_workspace = argv[4]
apprtc_dir = os.path.abspath(argv[1])
go_root_dir = os.path.abspath(argv[2])
golang_workspace = os.path.abspath(argv[3])
utils.RemoveDirectory(golang_workspace)
golang_workspace_src = os.path.join(golang_workspace, 'src')
collider_dir = os.path.join(apprtc_dir, 'collider')
shutil.copytree(collider_dir, golang_workspace_src,
ignore=shutil.ignore_patterns('.svn', '.git'))
shutil.copytree(collider_dir, golang_workspace_src)
golang_binary = 'go%s' % ('.exe' if utils.GetPlatform() == 'win' else '')
golang_path = os.path.join(go_root_dir, 'bin', golang_binary)
golang_env = os.environ.copy()
golang_env['GOROOT'] = go_root_dir
golang_env['GOPATH'] = os.path.abspath(golang_workspace)
golang_env['PATH'] += os.pathsep + mercurial_dir
subprocess.check_call([golang_path, 'get', 'collidermain'],
env=golang_env)
golang_env['GOPATH'] = golang_workspace
collider_exec = os.path.join(golang_workspace, 'collidermain')
subprocess.check_call([golang_path, 'build', '-o', collider_exec,
'collidermain'], env=golang_env)

View File

@ -1,47 +0,0 @@
#!/usr/bin/env python
# Copyright (c) 2017 The WebRTC 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 in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Builds a local mercurial (hg) copy.
This is used by the go toolchain.
"""
import os
import subprocess
import sys
import utils
def main(argv):
if len(argv) != 2:
return 'Usage: %s <mercurial_dir>' % argv[0]
mercurial_dir = argv[1]
if not os.path.exists(mercurial_dir):
return 'Expected mercurial at {}.'.format(mercurial_dir)
os.chdir(mercurial_dir)
if utils.GetPlatform() == 'win':
subprocess.check_call(['python', 'setup.py', '--pure', 'build_py', '-c',
'-d', '.', 'build_ext',
'-i', 'build_mo', '--force'])
with open('hg.bat', 'w') as put_hg_in_path:
# Write a hg.bat since the go toolchain expects to find something called
# 'hg' in the path, but Windows only recognizes executables ending with
# an extension in PATHEXT. Writing hg.bat effectively makes 'hg' callable
# if the mercurial folder is in PATH.
mercurial_path = os.path.abspath('hg')
put_hg_in_path.write('python %s %%*' % mercurial_path)
else:
subprocess.check_call(['make', 'local'])
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -0,0 +1,58 @@
#!/usr/bin/env python
# Copyright (c) 2017 The WebRTC 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 in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Downloads prebuilt AppRTC and Go from WebRTC storage and unpacks it.
Requires that depot_tools is installed and in the PATH.
It downloads compressed files in the directory where the script lives.
This is because the precondition is that the script lives in the same
directory of the .sha1 files.
"""
import os
import sys
import utils
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def _GetGoArchivePathForPlatform():
archive_extension = 'zip' if utils.GetPlatform() == 'win' else 'tar.gz'
return os.path.join(utils.GetPlatform(), 'go.%s' % archive_extension)
def main(argv):
if len(argv) > 2:
return 'Usage: %s [output_dir]' % argv[0]
output_dir = os.path.abspath(argv[1]) if len(argv) > 1 else None
apprtc_zip_path = os.path.join(SCRIPT_DIR, 'prebuilt_apprtc.zip')
if os.path.isfile(apprtc_zip_path + '.sha1'):
utils.DownloadFilesFromGoogleStorage(SCRIPT_DIR, auto_platform=False)
if output_dir is not None:
utils.RemoveDirectory(os.path.join(output_dir, 'apprtc'))
utils.UnpackArchiveTo(apprtc_zip_path, output_dir)
golang_path = os.path.join(SCRIPT_DIR, 'golang')
golang_zip_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
if os.path.isfile(golang_zip_path + '.sha1'):
utils.DownloadFilesFromGoogleStorage(golang_path)
if output_dir is not None:
utils.RemoveDirectory(os.path.join(output_dir, 'go'))
utils.UnpackArchiveTo(golang_zip_path, output_dir)
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -1,75 +0,0 @@
#!/usr/bin/env python
# Copyright (c) 2017 The WebRTC 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 in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Downloads the appengine SDK from WebRTC storage and unpacks it.
Requires that depot_tools is installed and in the PATH.
It downloads compressed files in the directory where the script lives.
This is because the precondition is that the script lives in the same
directory of the .sha1 files.
"""
import glob
import os
import sys
import subprocess
import utils
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def _DownloadResources(dir_to_scan_for_sha1):
print 'Downloading files in %s...' % dir_to_scan_for_sha1
extension = 'bat' if 'win32' in sys.platform else 'py'
cmd = ['download_from_google_storage.%s' % extension,
'--bucket=chromium-webrtc-resources',
'--directory', dir_to_scan_for_sha1]
subprocess.check_call(cmd)
def _StripVersionNumberFromMercurialFolder(output_dir):
unpacked_name = glob.glob(os.path.join(output_dir, 'mercurial*'))
assert len(unpacked_name) == 1, 'Should have precisely one mercurial!'
os.rename(unpacked_name[0], os.path.join(output_dir, 'mercurial'))
def main(argv):
if len(argv) == 1:
return 'Usage: %s <output_dir>' % argv[0]
output_dir = argv[1]
appengine_zip_path = os.path.join(SCRIPT_DIR, 'google-appengine.zip')
old_appengine_sha1 = utils.ComputeSHA1(appengine_zip_path)
mercurial_tar_path = os.path.join(SCRIPT_DIR, 'mercurial-src.tar.gz')
old_mercurial_sha1 = utils.ComputeSHA1(mercurial_tar_path)
apprtc_zip_path = os.path.join(SCRIPT_DIR, 'prebuilt_apprtc.zip')
old_apprtc_sha1 = utils.ComputeSHA1(apprtc_zip_path)
_DownloadResources(SCRIPT_DIR)
if old_appengine_sha1 != utils.ComputeSHA1(appengine_zip_path):
utils.RemoveDirectory(os.path.join(output_dir, 'google_appengine'))
utils.UnpackArchiveTo(appengine_zip_path, output_dir)
if old_mercurial_sha1 != utils.ComputeSHA1(mercurial_tar_path):
utils.RemoveDirectory(os.path.join(output_dir, 'mercurial'))
utils.UnpackArchiveTo(mercurial_tar_path, output_dir)
_StripVersionNumberFromMercurialFolder(output_dir)
if old_apprtc_sha1 != utils.ComputeSHA1(apprtc_zip_path):
utils.RemoveDirectory(os.path.join(output_dir, 'apprtc'))
utils.UnpackArchiveTo(apprtc_zip_path, output_dir)
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -1,57 +0,0 @@
#!/usr/bin/env python
# Copyright (c) 2017 The WebRTC 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 in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Downloads the golang SDK from WebRTC storage and unpacks it.
Requires that depot_tools is installed and in the PATH.
The precondition is that a directory 'golang' lives in the same directory
as the script.
This 'golang' directory has the following structure:
/golang
|
|-----/linux/go.tar.gz.sha1
|-----/win/go.zip.sha1
|-----/mac/go.tar.gz.sha1
"""
import os
import sys
import utils
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def _GetGoArchivePathForPlatform():
archive_extension = 'zip' if utils.GetPlatform() == 'win' else 'tar.gz'
return os.path.join(utils.GetPlatform(), 'go.%s' % archive_extension)
def main(argv):
if len(argv) == 1:
return 'Usage: %s <output_dir>' % argv[0]
output_dir = os.path.join(argv[1])
golang_path = os.path.join(SCRIPT_DIR, 'golang')
archive_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
old_archive_sha1 = utils.ComputeSHA1(archive_path)
utils.DownloadFilesFromGoogleStorage(golang_path)
if (old_archive_sha1 != utils.ComputeSHA1(archive_path)
or not os.path.exists('go')):
utils.RemoveDirectory(os.path.join(output_dir, 'go'))
utils.UnpackArchiveTo(archive_path, output_dir)
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -1 +1 @@
14068fbe349db34b838853a7878621bbd2b24646
a433f76c569055ff8536d796995518dd91a9fa5b

View File

@ -1 +1 @@
be686ec7ba68d588735cc2094ccab8bdd651de9e
aecf5ec9360a004fdbff181269554892743f4bf6

View File

@ -1 +1 @@
ba99083b22e0b22b560bb2d28b9b99b405d01b6b
26bf854fb81f12e9c80a146d8f0081cd22ae9d02

View File

@ -1 +0,0 @@
827468f89c78f292c28ceac50e6109c8d649fa61

View File

@ -1 +0,0 @@
a8a51aa412abd5155c7de29fd39c9774decb4d3f

View File

@ -1 +1 @@
6a96fc234cfa92ffaa79b0aeb5f4bdc1f31c6340
d8d95f55129e0c1a4e0f5d0d3acbf7163395354c

22
webrtc/tools/testing/setup_apprtc.py Normal file → Executable file
View File

@ -22,30 +22,22 @@ import utils
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def main(argv):
if len(argv) == 1:
return 'Usage %s <output_dir>' % argv[0]
output_dir = argv[1]
apprtc_appengine_mercurial_path = os.path.join(
SCRIPT_DIR, 'download_apprtc_appengine_and_mercurial.py')
utils.RunSubprocessWithRetry([apprtc_appengine_mercurial_path,
output_dir])
output_dir = os.path.abspath(argv[1])
download_golang_path = os.path.join(SCRIPT_DIR, 'download_golang.py')
utils.RunSubprocessWithRetry([download_golang_path, output_dir])
download_apprtc_path = os.path.join(SCRIPT_DIR, 'download_apprtc.py')
utils.RunSubprocessWithRetry([download_apprtc_path, output_dir])
build_mercurial_path = os.path.join(SCRIPT_DIR, 'build_mercurial_local.py')
hg_dir = os.path.join(output_dir, 'mercurial')
utils.RunSubprocessWithRetry([build_mercurial_path, hg_dir])
build_apprtc_collider_path = os.path.join(SCRIPT_DIR,
'build_apprtc_collider.py')
build_apprtc_path = os.path.join(SCRIPT_DIR, 'build_apprtc.py')
apprtc_src_dir = os.path.join(output_dir, 'apprtc', 'src')
go_dir = os.path.join(output_dir, 'go')
collider_dir = os.path.join(output_dir, 'collider')
utils.RunSubprocessWithRetry([build_apprtc_collider_path, apprtc_src_dir,
go_dir, hg_dir, collider_dir])
utils.RunSubprocessWithRetry([build_apprtc_path, apprtc_src_dir,
go_dir, collider_dir])
if __name__ == '__main__':

View File

@ -9,7 +9,6 @@
"""Utilities for all our deps-management stuff."""
import hashlib
import os
import shutil
import sys
@ -34,32 +33,18 @@ def RunSubprocessWithRetry(cmd):
raise exception
def DownloadFilesFromGoogleStorage(path):
def DownloadFilesFromGoogleStorage(path, auto_platform=True):
print 'Downloading files in %s...' % path
extension = 'bat' if 'win32' in sys.platform else 'py'
cmd = ['download_from_google_storage.%s' % extension,
'--bucket=chromium-webrtc-resources',
'--auto_platform',
'--recursive',
'--directory', path]
if auto_platform:
cmd += ['--auto_platform', '--recursive']
subprocess.check_call(cmd)
def ComputeSHA1(path):
if not os.path.exists(path):
return 0
sha1 = hashlib.sha1()
file_to_hash = open(path, 'rb')
try:
sha1.update(file_to_hash.read())
finally:
file_to_hash.close()
return sha1.hexdigest()
# Code partially copied from
# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
def RemoveDirectory(*path):