From 52c9d47b097a016fb562a18f34c6bcf9a00c7634 Mon Sep 17 00:00:00 2001 From: "ivinnichenko@webrtc.org" Date: Tue, 24 Jan 2012 13:38:42 +0000 Subject: [PATCH] Android, Chrome, cleanup, etc. BUG= TEST= Review URL: http://webrtc-codereview.appspot.com/369006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1526 4adac7df-926f-26a2-2b94-8c16560cd09d --- tools/continuous_build/chrome/.gclient | 9 + tools/continuous_build/chrome/master.cfg | 166 ++++++++ tools/continuous_build/cleanup.py | 78 ++++ tools/continuous_build/master.cfg | 38 +- .../continuous_build/webrtc_buildbot/utils.py | 361 +++++++++++------- 5 files changed, 497 insertions(+), 155 deletions(-) create mode 100644 tools/continuous_build/chrome/.gclient create mode 100755 tools/continuous_build/chrome/master.cfg create mode 100755 tools/continuous_build/cleanup.py diff --git a/tools/continuous_build/chrome/.gclient b/tools/continuous_build/chrome/.gclient new file mode 100644 index 0000000000..635c7a14bb --- /dev/null +++ b/tools/continuous_build/chrome/.gclient @@ -0,0 +1,9 @@ +solutions = [ + { "name" : "internal.DEPS", + "url" : "svn://chrome-svn.corp.google.com/chrome-internal/trunk/tools/build/internal.DEPS", + "deps_file" : "DEPS", + "custom_deps" : { + }, + "safesync_url": "", + }, +] diff --git a/tools/continuous_build/chrome/master.cfg b/tools/continuous_build/chrome/master.cfg new file mode 100755 index 0000000000..57599cccdd --- /dev/null +++ b/tools/continuous_build/chrome/master.cfg @@ -0,0 +1,166 @@ +# -*- python -*- +# ex: set syntax=python: + +# This is a sample buildmaster config file. It must be installed as +# 'master.cfg' in your buildmaster's base directory (although the filename +# can be changed with the --basedir option to 'mktap buildbot master'). + +# It has one job: define a dictionary named BuildmasterConfig. This +# dictionary has a variety of keys to control different aspects of the +# buildmaster. They are documented in docs/config.xhtml . + + +# This is the dictionary that the buildmaster pays attention to. We also use +# a shorter alias to save typing. +c = BuildmasterConfig = {} + +####### BUILDSLAVES + +# the 'slaves' list defines the set of allowable buildslaves. Each element is +# a BuildSlave object, which is created with bot-name, bot-password. These +# correspond to values given to the buildslave's mktap invocation. + +from buildbot.buildslave import BuildSlave + +c['slaves'] = [BuildSlave("linux-chrome", "pass", max_builds=1)] + +# 'slavePortnum' defines the TCP port to listen on. This must match the value +# configured into the buildslaves (with their --master option) + +c['slavePortnum'] = 9989 + +####### CHANGESOURCES + +# the 'change_source' setting tells the buildmaster how it should find out +# about source code changes. Any class which implements IChangeSource can be +# put here: there are several in buildbot/changes/*.py to choose from. + +from buildbot.changes.pb import PBChangeSource +from buildbot.changes.svnpoller import SVNPoller + +#c['change_source'] = PBChangeSource() +source_code_svn_url='http://webrtc.googlecode.com/svn/trunk' +svn_poller = SVNPoller(svnurl=source_code_svn_url, pollinterval=5*60*60, + histmax=10, svnbin='/usr/bin/svn', +) +c['change_source'] = svn_poller +#c['sources'] = [ svn_poller ] + +####### SCHEDULERS + +## configure the Schedulers + +from buildbot.scheduler import Scheduler +web_rtc_scheduler = Scheduler(name="all", branch=None, treeStableTimer=60*60, + builderNames=["ChromeWebRTC"]) +c['schedulers'] = [web_rtc_scheduler] + + +####### BUILDERS + +# the 'builders' list defines the Builders. Each one is configured with a +# dictionary, using the following keys: +# name (required): the name used to describe this builder +# slavename (required): which slave to use (must appear in c['bots']) +# builddir (required): which subdirectory to run the builder in +# factory (required): a BuildFactory to define how the build is run +# periodicBuildTime (optional): if set, force a build every N seconds + +# buildbot/process/factory.py provides several BuildFactory classes you can +# start with, which implement build processes for common targets (GNU +# autoconf projects, CPAN perl modules, etc). The factory.BuildFactory is the +# base class, and is configured with a series of BuildSteps. When the build +# is run, the appropriate buildslave is told to execute each Step in turn. + +# the first BuildStep is typically responsible for obtaining a copy of the +# sources. There are source-obtaining Steps in buildbot/steps/source.py for +# CVS, SVN, and others. + +from buildbot.process import factory +from buildbot.steps import shell +from webrtc_buildbot import utils + +linux_factory = utils.WebRTCChromeFactory() +linux_factory.EnableBuild() + + +linux_builder_1 = { + 'name': "ChromeWebRTC", + 'slavename': "linux-chrome", + 'builddir': "linux-chrome", + 'factory': linux_factory, + } + +c['builders'] = [linux_builder_1] + + +####### STATUS TARGETS + +# 'status' is a list of Status Targets. The results of each build will be +# pushed to these targets. buildbot/status/*.py has a variety to choose from, +# including web pages, email senders, and IRC bots. + +from buildbot.status import html +from buildbot.status import mail + +web_page = html.WebStatus(http_port=8010, allowForce=True) +email_notification = mail.MailNotifier( + fromaddr="webrtc-cb-watchlist@google.com", + extraRecipients=["webrtc-cb-watchlist@google.com"], + sendToInterestedUsers=True, + mode='failing') +c['status'] = [web_page, email_notification] + +# Use allowForce=True (boolean, not a string. ie: not 'True') to allow +# Forcing Builds in the Web User Interface. The default is False. +# from buildbot.status import html +# c['status'].append(html.WebStatus(http_port=8010,allowForce=True)) + +# from buildbot.status.web.auth import BasicAuth +# users = [('bob', 'secret-pass'), ('jill', 'super-pass') +# from buildbot.status import words +# c['status'].append(words.IRC(host="irc.example.com", nick="bb", +# channels=["#example"])) +# +# from buildbot.status import client +# c['status'].append(client.PBListener(9988)) + + +####### DEBUGGING OPTIONS + +# if you set 'debugPassword', then you can connect to the buildmaster with +# the diagnostic tool in contrib/debugclient.py . From this tool, you can +# manually force builds and inject changes, which may be useful for testing +# your buildmaster without actually committing changes to your repository (or +# before you have a functioning 'sources' set up). The debug tool uses the +# same port number as the slaves do: 'slavePortnum'. + +#c['debugPassword'] = "debugpassword" + +# if you set 'manhole', you can ssh into the buildmaster and get an +# interactive python shell, which may be useful for debugging buildbot +# internals. It is probably only useful for buildbot developers. You can also +# use an authorized_keys file, or plain telnet. +#from buildbot import manhole +#c['manhole'] = manhole.PasswordManhole("tcp:9999:interface=127.0.0.1", +# "admin", "password") + + +####### PROJECT IDENTITY + +# the 'projectName' string will be used to describe the project that this +# buildbot is working on. For example, it is used as the title of the +# waterfall HTML page. The 'projectURL' string will be used to provide a link +# from buildbot HTML pages to your project's home page. + +c['projectName'] = "WebRTC" +c['projectURL'] = "http://www.webrtc.org" + +# the 'buildbotURL' string should point to the location where the buildbot's +# internal web server (usually the html.Waterfall page) is visible. This +# typically uses the port number set in the Waterfall 'status' entry, but +# with an externally-visible host name which the buildbot cannot figure out +# without some help. + +#c['buildbotURL'] = "http://localhost:8010/" +c['buildbotURL'] = "http://webrtc-chrome.lul.corp.google.com:8010/" diff --git a/tools/continuous_build/cleanup.py b/tools/continuous_build/cleanup.py new file mode 100755 index 0000000000..37517f259d --- /dev/null +++ b/tools/continuous_build/cleanup.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# Copyright (c) 2012 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. + +__author__ = "ivinnichenko@webrtc.org (Illya Vinnichenko)" + +from optparse import OptionParser +import os +import sys +import time + +# The path is considered whitelisted if any of these entries appear +# at some point in the path +WHITELIST = ["buildbot.tac", "master.cfg", "public_html", "changes.pck", + "webrtc_buildbot"] + + +def is_whitelisted(path): + """Check if file is whitelisted. + + path: file path. + """ + for entry in WHITELIST: + if entry in path: + return True + return False + + +def remove_old_filenames(path, num_days, verbose): + """Remove old files. + + path: base directory for removal. + num_days: days limit for removal. + verbose: print every cmd? + """ + print "Cleaning up everything in %s older than %s days" % (path, num_days) + current_time = time.time() + limit = 60*60*24*num_days + for root, unused_dirs, files in os.walk(path): + for filename in files: + current_file = os.path.join(root, filename) + if is_whitelisted(current_file): + continue + time_stamp = os.stat(current_file).st_mtime + if (current_time - time_stamp) > limit: + str_stamp = time.strftime("%a, %d %b %Y %H:%M:%S +0000", + time.gmtime(time_stamp)) + if verbose: + print "Removing [%s], stamped on %s" % (current_file, str_stamp) + os.remove(current_file) + + +def main(): + usage = "usage: %prog [options] arg" + parser = OptionParser(usage) + parser.add_option("-p", "--path", dest="cleanup_path", help="base directory") + parser.add_option("-n", "--num_days", dest="num_days", help="number of days") + parser.add_option("-q", "--quiet", + action="store_false", dest="verbose", default=True, + help="don't print status messages to stdout") + + options, args = parser.parse_args() + if not options.cleanup_path: + print "You must specify base directory" + sys.exit(2) + if not options.num_days: + print "You must specify number of days old" + sys.exit(2) + remove_old_filenames(options.cleanup_path, int(options.num_days), + options.verbose) + +if __name__ == "__main__": + main() diff --git a/tools/continuous_build/master.cfg b/tools/continuous_build/master.cfg index 545b52bb07..4e16718971 100755 --- a/tools/continuous_build/master.cfg +++ b/tools/continuous_build/master.cfg @@ -29,7 +29,8 @@ c = BuildmasterConfig = {} from buildbot.buildslave import BuildSlave -c['slaves'] = [BuildSlave("chromeos", "pass", max_builds=1), +c['slaves'] = [BuildSlave("android", "pass", max_builds=1), + BuildSlave("chromeos", "pass", max_builds=1), BuildSlave("linux-clang", "pass", max_builds=1), BuildSlave("linux-slave-1", "pass", max_builds=1), BuildSlave("linux-slave-2", "pass", max_builds=1), @@ -55,7 +56,7 @@ from buildbot.changes.pb import PBChangeSource from buildbot.changes.svnpoller import SVNPoller source_code_svn_url = 'http://webrtc.googlecode.com/svn/trunk' -svn_poller = SVNPoller(svnurl=source_code_svn_url, pollinterval=15*60, +svn_poller = SVNPoller(svnurl=source_code_svn_url, pollinterval=5*60, histmax=10, svnbin='/usr/bin/svn') c['change_source'] = svn_poller @@ -64,7 +65,7 @@ c['change_source'] = svn_poller ## configure the Schedulers from buildbot.scheduler import Scheduler -webrtc_scheduler = Scheduler(name="all", branch=None, treeStableTimer=2*60, +webrtc_scheduler = Scheduler(name="all", branch=None, treeStableTimer=5*60, builderNames=["Win32Debug", "Win32Release", "MacOS", @@ -74,6 +75,7 @@ webrtc_scheduler = Scheduler(name="all", branch=None, treeStableTimer=2*60, "Linux32bitRelease", "Linux64bitRelease", "Linux32bitDBG", + "Android", "LinuxVideoTest"]) c['schedulers'] = [webrtc_scheduler] @@ -103,6 +105,7 @@ from buildbot.steps import shell from webrtc_buildbot import utils DEFAULT_LINUX_TESTS = ["audio_coding_module_test", + "audio_coding_unittests", "audio_conference_mixer_unittests", "audio_device_test_api", "audio_device_test_func", @@ -120,14 +123,16 @@ DEFAULT_LINUX_TESTS = ["audio_coding_module_test", "system_wrappers_unittests", "test_bwe", "test_fec", - "udp_transport_unittests", + "udp_transport_unittests", "vad_unittests", "video_coding_unittests", + "video_engine_core_unittests", "video_processing_unittests", "voice_engine_unittests", "vp8_unittests", "webrtc_utility_unittests"] DEFAULT_MACOS_TESTS = ["audio_coding_module_test", + "audio_coding_unittests", "audio_conference_mixer_unittests", "audio_device_test_api", "audio_device_test_func", @@ -148,27 +153,30 @@ DEFAULT_MACOS_TESTS = ["audio_coding_module_test", "udp_transport_unittests", "vad_unittests", "video_coding_unittests", + "video_engine_core_unittests", "video_processing_unittests", "voice_engine_unittests", "vp8_unittests", "webrtc_utility_unittests"] -DEFAULT_WIN_TESTS = ["audioproc_unittest", +DEFAULT_WIN_TESTS = ["audio_coding_unittests", + "audioproc_unittest", "libyuv_unittests", "neteq_unittests", "resampler_unittests", "system_wrappers_unittests", "vad_unittests", + "video_engine_core_unittests", "voice_engine_unittests", "vp8_unittests"] -HEADLESS_LINUX = ["audio_device_test_api", +HEADLESS_LINUX = ["audio_device_test_api" "audio_device_test_func", "test_fec", "video_processing_unittests"] -HEADLESS_MACOS = ["audio_device_test_api", +HEADLESS_MACOS = ["audio_device_test_api" "audio_device_test_func", "video_processing_unittests"] -HEADLESS_WIN = ["audio_device_test_api", +HEADLESS_WIN = ["audio_device_test_api" "audio_device_test_func"] ############# Linux Builders ####################################### @@ -223,6 +231,9 @@ win_factory_32_Release.EnableBuild(configuration="Release") win_factory_32_Release.EnableHeadLess(HEADLESS_WIN) win_factory_32_Release.EnableTests(DEFAULT_WIN_TESTS) +android_factory = utils.WebRTCAndroidFactory() +android_factory.EnableBuild(product="toro") + linux_builder_1 = { 'name': "Linux64bitDBG", 'slavename': "linux-slave-1", @@ -283,9 +294,16 @@ linux_clang_builder = { 'builddir': "linux-clang", 'factory': linux_clang, } +android_builder_1 = { + 'name': "Android", + 'slavename': "android", + 'builddir': "android", + 'factory': android_factory, + } c['builders'] = [win_builder_1, win_builder_2, mac_builder_1, chromeos_builder, - linux_builder_1, linux_clang_builder, linux_builder_2, linux_builder_3, - linux_builder_4, linux_video_builder] + linux_builder_1, linux_clang_builder, linux_builder_2, + linux_builder_3, linux_builder_4, android_builder_1, + linux_video_builder] ####### STATUS TARGETS diff --git a/tools/continuous_build/webrtc_buildbot/utils.py b/tools/continuous_build/webrtc_buildbot/utils.py index 397e2ff94a..42e3606d90 100755 --- a/tools/continuous_build/webrtc_buildbot/utils.py +++ b/tools/continuous_build/webrtc_buildbot/utils.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. +# Copyright (c) 2012 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 @@ -49,15 +49,26 @@ class WebRTCFactory(factory.BuildFactory): pass def AddCommonTestSteps(self, test): - """Add common steps for test.[must be overridden] - + """Add common steps for test. + test: test to be run. """ - pass + self.AddCommonMakeStep(test) + self.AddCommonTestRunStep(test) - def AddCommonStep(self): - """Define common step [must be overridden].""" - pass + def AddCommonStep(self, cmd, descriptor="", workdir="build", + warnOnFailure=False,): + """Define common step.""" + if type(descriptor) is str: + descriptor = [descriptor] + warn = warnOnFailure + flunkOnFailure = not warn + self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, + description=descriptor+["running..."], + descriptionDone=descriptor+["done..."], + warnOnFailure=warn, + flunkOnFailure=flunkOnFailure, + name="".join(descriptor))) def AddCommonTestRunStep(self): """Define common test run step [must be overridden].""" @@ -67,13 +78,17 @@ class WebRTCFactory(factory.BuildFactory): """Define common make step [must be overridden].""" pass - def AddCommonGYPStep(self): - """Define common gyp step [must be overridden].""" - pass + def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor="gyp"): + cmd = ["./build/gyp_chromium", "--depth=.", gyp_file] + cmd += gyp_params + self.gyp_params + self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", + description=[descriptor, "running..."], + descriptionDone=[descriptor, "done..."], + name="gyp_%s" % descriptor)) def EnableTest(self, test): """Enable Test to be run. [must be overridden] - + test: test to be run. """ pass @@ -84,6 +99,8 @@ class WebRTCFactory(factory.BuildFactory): tests: list of test to be run. """ print "Headless tests:%s" % self.headless_tests + if self.enable_coverage: + self.EnableBaseCoverage() for test in tests: self.EnableTest(test) if self.enable_coverage: @@ -96,6 +113,10 @@ class WebRTCFactory(factory.BuildFactory): """ self.headless_tests += tests + def EnableBaseCoverage(self): + """Enable base coverage data [must be overridden].""" + pass + def EnableCoverage(self): """Enable coverage data [must be overridden].""" pass @@ -105,6 +126,7 @@ class GenerateCodeCoverage(ShellCommand): command = ["genhtml", "final.info", "--output-directory", WithProperties("/home/webrtc-cb/www/%(buildername)s_%(buildnumber)s")] name = "LCOV_GenHTML" + warnOnFailure = True def __init__(self, coverage_url=None, coverage_dir=None, **kwargs): if coverage_url is None or coverage_dir is None: @@ -135,6 +157,66 @@ class GenerateCodeCoverage(ShellCommand): def start(self): ShellCommand.start(self) +################################################################################ +class WebRTCAndroidFactory(WebRTCFactory): + """A Build Factory affected by properties.""" + + def __init__(self, build_factory_properties=None, steps=None, + enable_coverage=False, account=None): + WebRTCFactory.__init__(self, build_factory_properties, steps, + enable_coverage, account) + + def EnableBuild(self, product="toro"): + prefix = "rm -rf out/target/product/%s/obj/" % product + cleanup_list = [ + "rm -rf external/webrtc", + prefix + "STATIC_LIBRARIES/libwebrtc_*", + prefix + "SHARE_LIBRARIES/libwebrtc_*", + prefix + "EXECUTABLES/webrtc_*" + ] + cmd = " ; ".join(cleanup_list) + self.addStep(shell.Compile(command=(cmd), workdir="build/trunk", + description=["cleanup", "running..."], haltOnFailure=False, + warnOnFailure=True, flunkOnFailure =False, + descriptionDone=["cleanup", "done..."], name="cleanup")) + cmd = "svn checkout http://webrtc.googlecode.com/svn/trunk/ external/webrtc" + self.addStep(shell.Compile(command=(cmd), + workdir="build/trunk", description=["svn", "running..."], + haltOnFailure=False, descriptionDone=["svn", "done..."], name="svn")) + cmd = ("source build/envsetup.sh && lunch full_%s-eng " + "&& mmm external/webrtc showcommands" % product) + self.addStep(shell.Compile(command=(cmd), + workdir="build/trunk", description=["build", "running..."], + haltOnFailure=False, + descriptionDone=["build", "done..."], name="build")) + +################################################################################ + +################################################################################ +class WebRTCChromeFactory(WebRTCFactory): + """A Build Factory affected by properties.""" + + def __init__(self, build_factory_properties=None, steps=None, + enable_coverage=False, account=None): + WebRTCFactory.__init__(self, build_factory_properties, steps, + enable_coverage, account) + + def EnableBuild(self): + self.AddCommonStep(["rm", "-rf", "src"], descriptor="Cleanup") + cmd = ["gclient", "sync", "--force"] + self.AddCommonStep(cmd, descriptor="Sync") + self.AddCommonMakeStep("chrome") + + def AddCommonMakeStep(self, make, descriptor="", make_extra=None): + make_descriptor = [make, descriptor] + cmd = ["make", make, "-j100"] + if make_extra is not None: + cmd.append(make_extra) + self.addStep(shell.ShellCommand(command=cmd, + workdir="build/src", description=["Making"]+make_descriptor, + descriptionDone=make_descriptor+["built"], + name="_".join(make_descriptor))) + ################################################################################ class WebRTCLinuxFactory(WebRTCFactory): """A Build Factory affected by properties.""" @@ -174,134 +256,142 @@ class WebRTCLinuxFactory(WebRTCFactory): if clang: self.AddCommonStep(["trunk/tools/clang/scripts/update.sh"], descriptor="Update_Clang") + if self.release: self.AddCommonMakeStep("all", make_extra="BUILDTYPE=Release") else: self.AddCommonMakeStep("all") - def AddCommonStep(self, cmd, descriptor="", workdir="build"): - self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, - description=[descriptor, "running..."], - descriptionDone=[descriptor, "done..."], - name="%s" % descriptor)) - def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return test_folder = "Release" if self.release else "Debug" - test_descriptor = test + descriptor + test_descriptor = [test, descriptor] if cmd is None: cmd = ["out/%s/%s" % (test_folder, test)] self.addStep(shell.ShellCommand(command=cmd, - workdir=workdir, description=["Running", test_descriptor], - descriptionDone=[test_descriptor, "finished"], - name="run_test_%s" % test_descriptor)) + workdir=workdir, description=["Running"]+test_descriptor, + descriptionDone=test_descriptor+["finished"], + name="_".join(test_descriptor))) def AddCommonMakeStep(self, make, descriptor="", make_extra=None): - make_descriptor = make + descriptor + make_descriptor = [make, descriptor] #cpu = `grep -i \"processor\" /proc/cpuinfo | sort -u | wc -l` cmd = ["make", make, "-j100"] if make_extra is not None: cmd.append(make_extra) self.addStep(shell.ShellCommand(command=cmd, - workdir="build/trunk", description=["Making", make_descriptor], - descriptionDone=[make_descriptor, "built"], - name="make_%s" % make_descriptor)) + workdir="build/trunk", description=["Making"]+make_descriptor, + descriptionDone=make_descriptor+["built"], + name="_".join(make_descriptor))) - def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor="gyp"): - cmd = ["./build/gyp_chromium", "--depth=.", gyp_file] - cmd += gyp_params + self.gyp_params - self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", - description=[descriptor, "running..."], - descriptionDone=[descriptor, "done..."], - name="gyp_%s" % descriptor)) + def EnableBaseCoverage(self): + self.AddCommonStep(["lcov", "--directory", ".", "--zerocounters"], + workdir="build/trunk", + warnOnFailure=True, + descriptor=["LCOV", "Zero"]) + self.AddCommonStep(["lcov", "--directory", ".", "--capture", "-b", + ".", "--initial", + "--output-file", "webrtc_base.info"], + workdir="build/trunk", + warnOnFailure=True, + descriptor=["LCOV", "Base", "Capture"]) + self.AddCommonStep(['lcov', '--extract', 'webrtc_base.info', '*/src/*', + '--output', 'filtered.info'], + workdir="build/trunk", + warnOnFailure=True, + descriptor=["LCOV", "Base", "Extract"]) + self.AddCommonStep(["lcov", "--remove", "filtered.info", "*/usr/include/*", + "/third*", "/testing/*", "*/test/*", "*_unittest.*", + "*/mock/*", "--output", + "webrtc_base_filtered_final.info"], + workdir="build/trunk", + warnOnFailure=True, + descriptor=["LCOV", "Base", "Filter"]) def EnableCoverage(self): - """Enable coverage data [must be overridden].""" + """Enable coverage data.""" self.AddCommonStep(["lcov", "--directory", ".", "--capture", "-b", ".", "--output-file", "webrtc.info"], - workdir="build/trunk", descriptor="LCOV_Capture") + warnOnFailure=True, + workdir="build/trunk", descriptor=["LCOV", "Capture"]) self.AddCommonStep(['lcov', '--extract', 'webrtc.info', '*/src/*', - '--output', 'test.info'], - workdir="build/trunk", descriptor="LCOV_Extract") - self.AddCommonStep(["lcov", "--remove", "test.info", "*/usr/include/*", - "/third*", "/testing/*", "--output", - "final.info"], - workdir="build/trunk", descriptor="LCOV_Filter") + '--output', 'test.info'], warnOnFailure=True, + workdir="build/trunk", descriptor=["LCOV", "Extract"]) + self.AddCommonStep(["lcov", "--remove", "test.info", "*/usr/include/*", + "/third*", "/testing/*", "*/test/*", "*_unittest.*", + "*/mock/*", "--output", + "final.info"], warnOnFailure=True, + workdir="build/trunk", descriptor=["LCOV", "Filter"]) + self.AddCommonStep(['lcov', '-a', 'webrtc_base_filtered_final.info', '-a', + 'final.info', '-o', 'final.info'], warnOnFailure=True, + workdir="build/trunk", descriptor=["LCOV", "Merge"]) self.addStep(GenerateCodeCoverage(coverage_url=self.coverage_url, coverage_dir=self.coverage_dir)) - - def AddCommonTestSteps(self, test): - """Add common steps for test. - - test: test to be run. - """ - self.AddCommonMakeStep(test, descriptor="_test") - self.AddCommonTestRunStep(test, descriptor="_test") - def EnableTest(self, test): """Enable Test to be run. test: test to be run. """ if test == "audioproc_unittest": - self.AddCommonTestRunStep(test) - # Fixed point run: - self.AddCommonGYPStep("webrtc.gyp", - gyp_params=["-Dprefer_fixed_point=1"], - descriptor="fixed_point") + self.AddCommonGYPStep("webrtc.gyp", gyp_params=["-Dprefer_fixed_point=1"], + descriptor="gyp_tests_fp") self.AddCommonMakeStep(test, descriptor="_fixed_point") self.AddCommonTestRunStep(test, descriptor="_fixed_point") elif test == "signal_processing_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "resampler_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vad_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "rtp_rtcp_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "video_coding_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "test_bwe": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_device_test_api": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_device_test_func": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_coding_module_test": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "video_processing_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "test_fec": - self.AddCommonTestSteps(test) + self.AddCommonTestRunStep(test) elif test == "system_wrappers_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "cng_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "g711_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "g722_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "pcm16b_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_conference_mixer_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "media_file_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "udp_transport_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "webrtc_utility_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "neteq_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vp8_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "libyuv_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "voice_engine_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) + elif test == "video_engine_core_unittests": + self.AddCommonTestRunStep(test) + elif test == "audio_coding_unittests": + self.AddCommonTestRunStep(test) elif test == "vie_auto_test": self.addStep(shell.Compile(command=('xvfb-run --server-args="-screen 0 ' '800x600x24 -extension Composite" out/Debug/vie_auto_test --automated ' @@ -315,7 +405,7 @@ class WebRTCLinuxFactory(WebRTCFactory): workdir="build/trunk", description=[test, "running..."], descriptionDone=[test, "done..."], name="%s" % test)) else: - print "No supported tests are found..." + print "[Linux]: No supported tests are found for [%s]" % test ################################################################################ @@ -351,58 +441,37 @@ class WebRTCMacFactory(WebRTCFactory): descriptor="EnableMake") self.AddCommonMakeStep("all") - def AddCommonStep(self, cmd, descriptor="", workdir="build"): - self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, - description=[descriptor, "running..."], - descriptionDone=[descriptor, "done..."], - name="%s" % descriptor)) - def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return test_folder = "Release" if self.release else "Debug" - test_descriptor = test + descriptor + test_descriptor = [test, descriptor] if cmd is None: if self.build_type == "xcode" or self.build_type == "both": cmd = ["xcodebuild/%s/%s" % (test_folder, test)] - self.AddCommonStep(cmd, descriptor=test_descriptor+"(xcode)", + self.AddCommonStep(cmd, descriptor=test_descriptor+["(xcode)"], workdir="build/trunk") if self.build_type == "make" or self.build_type == "both": cmd = ["out/%s/%s" % (test_folder, test)] - self.AddCommonStep(cmd, descriptor=test_descriptor+"(make)", + self.AddCommonStep(cmd, descriptor=test_descriptor+["(make)"], workdir="build/trunk") def AddCommonMakeStep(self, make, descriptor="", make_extra=None): - make_descriptor = make + descriptor + make_descriptor = [make, descriptor] cpu = "`sysctl -n hw.logicalcpu`" if self.build_type == "make" or self.build_type == "both": cmd = ["make", make, "-j100"] if make_extra is not None: cmd.append(make_extra) - self.AddCommonStep(cmd, descriptor=make_descriptor+"(make)", + self.AddCommonStep(cmd, descriptor=make_descriptor+["(make)"], workdir="build/trunk") if self.build_type == "xcode" or self.build_type == "both": cmd = ["xcodebuild", "-project", "webrtc.xcodeproj", "-configuration", "Debug", "-target", "All"] - self.AddCommonStep(cmd, descriptor=make_descriptor+"(xcode)", + self.AddCommonStep(cmd, descriptor=make_descriptor+["(xcode)"], workdir="build/trunk") - def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor="gyp"): - cmd = ["./build/gyp_chromium", "--depth=.", gyp_file] - cmd += gyp_params + self.gyp_params - self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", - description=[descriptor, "running..."], - descriptionDone=[descriptor, "done..."], - name="gyp_%s" % descriptor)) - - def AddCommonTestSteps(self, test): - """Add common steps for test. - - test: test to be run. - """ - self.AddCommonTestRunStep(test, descriptor="_test") - def EnableTest(self, test): """Enable Test to be run. @@ -411,47 +480,51 @@ class WebRTCMacFactory(WebRTCFactory): if test == "audioproc_unittest": print "Does not run on Mac now" elif test == "signal_processing_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "resampler_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vad_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "rtp_rtcp_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "video_coding_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "test_bwe": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_device_test_api": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_device_test_func": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_coding_module_test": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "video_processing_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "test_fec": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "system_wrappers_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "audio_conference_mixer_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "media_file_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "udp_transport_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "webrtc_utility_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "neteq_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vp8_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "libyuv_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "voice_engine_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) + elif test == "video_engine_core_unittests": + self.AddCommonTestRunStep(test) + elif test == "audio_coding_unittests": + self.AddCommonTestRunStep(test) else: - print "No supported tests are found..." + print "[Mac]: No supported tests are found for [%s]" % test ################################################################################ class WebRTCWinFactory(WebRTCFactory): @@ -505,25 +578,19 @@ class WebRTCWinFactory(WebRTCFactory): "/p:Configuration=Release;Platform=%s" % (self.platform)] self.AddCommonStep(cmd, descriptor="Build_Release", workdir="build/trunk") - def AddCommonStep(self, cmd, descriptor="", workdir="build"): - self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, - description=[descriptor, "running..."], - descriptionDone=[descriptor, "done..."], - name="%s" % descriptor)) - def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return - test_descriptor = test + descriptor + test_descriptor = [test, descriptor] if cmd is None: if self.configuration == "Debug" or self.configuration == "both": cmd = ["build\Debug\%s.exe" % test] - self.AddCommonStep(cmd, descriptor=test_descriptor+"_Debug", + self.AddCommonStep(cmd, descriptor=test_descriptor+["Debug"], workdir=workdir) if self.configuration == "Release" or self.configuration == "both": cmd = ["build\Release\%s.exe" % test] - self.AddCommonStep(cmd, descriptor=test_descriptor+"_Release", + self.AddCommonStep(cmd, descriptor=test_descriptor+["Release"], workdir=workdir) @@ -533,22 +600,26 @@ class WebRTCWinFactory(WebRTCFactory): test: test to be run. """ if test == "audioproc_unittest": - print "Does not run on Mac now" + print "Does not run on Windows now" elif test == "resampler_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vad_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "system_wrappers_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "neteq_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "vp8_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "libyuv_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) elif test == "voice_engine_unittests": - self.AddCommonTestRunStep(test, descriptor="_test") + self.AddCommonTestRunStep(test) + elif test == "video_engine_core_unittests": + self.AddCommonTestRunStep(test) + elif test == "audio_coding_unittests": + self.AddCommonTestRunStep(test) else: - print "No supported tests are found..." + print "[Win]: No supported tests are found for [%s]" % test