Added simple wrapping for waterfall display.
This is done by adding a whitespace before the last underscore on strings above length 25, which should only affect the _unittest and _integrationtest suffixes for our tests, that are the widest unwrappable strings in our waterfall display. I also removed all reduntant use of ShellCommand in favour for the AddCommonStep function (that wraps the description text). Also fixed so Mac tests are not halting the build. Cleaned up some code style formatting. BUG= TEST= Review URL: https://webrtc-codereview.appspot.com/400005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1735 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
7cb0c240cb
commit
b9432cef96
18
tools/continuous_build/public_html/README
Normal file
18
tools/continuous_build/public_html/README
Normal file
@ -0,0 +1,18 @@
|
||||
Modify the look of the buildbot master's waterfall page
|
||||
-------------------------------------------------------
|
||||
|
||||
To deploy these changes, follow these instructions:
|
||||
|
||||
* Copy the favicon.ico file to master/public_html/ on the buildbot master
|
||||
machine.
|
||||
|
||||
* Edit the master/public_html/index.html and add the following to the <head>
|
||||
element:
|
||||
<link rel="shortcut icon" href="/favicon.ico" type="image/png" />
|
||||
<link rel="icon" href="/favicon.ico" type="image/png" />
|
||||
|
||||
* Edit the master/public_html/buildbot.css and change the section with
|
||||
.LastBuild, .Activity {
|
||||
width: 230px;
|
||||
|
||||
to be 160px instead. Save the file and exit.
|
BIN
tools/continuous_build/public_html/favicon.ico
Normal file
BIN
tools/continuous_build/public_html/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
@ -9,14 +9,14 @@
|
||||
|
||||
__author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)'
|
||||
|
||||
from buildbot.process import factory
|
||||
from buildbot.steps import shell
|
||||
from buildbot.steps.shell import ShellCommand
|
||||
from buildbot.process import properties
|
||||
from buildbot.process.properties import WithProperties
|
||||
import os
|
||||
import sys
|
||||
import urlparse
|
||||
from buildbot.process import factory
|
||||
from buildbot.process import properties
|
||||
from buildbot.process.properties import WithProperties
|
||||
from buildbot.steps import shell
|
||||
from buildbot.steps.shell import ShellCommand
|
||||
|
||||
# Defines the order of the booleans of the supported platforms in the test
|
||||
# dictionaries in master.cfg.
|
||||
@ -35,28 +35,29 @@ DEFAULT_COVERAGE_DIR = '/var/www/coverage/'
|
||||
# much and make the stacks harder to figure out. Use the same settings
|
||||
# on all buildbot masters to make it easier to move bots.
|
||||
MEMORY_TOOLS_GYP_DEFINES = [
|
||||
# GCC flags
|
||||
'mac_debug_optimization=1 ',
|
||||
'mac_release_optimization=1 ',
|
||||
'release_optimize=1 ',
|
||||
'no_gc_sections=1 ',
|
||||
'debug_extra_cflags="-g -fno-inline -fno-omit-frame-pointer '
|
||||
'-fno-builtin -fno-optimize-sibling-calls" ',
|
||||
'release_extra_cflags="-g -fno-inline -fno-omit-frame-pointer '
|
||||
'-fno-builtin -fno-optimize-sibling-calls" ',
|
||||
# MSVS flags
|
||||
'win_debug_RuntimeChecks=0 ',
|
||||
'win_debug_disable_iterator_debugging=1 ',
|
||||
'win_debug_Optimization=1 ',
|
||||
'win_debug_InlineFunctionExpansion=0 ',
|
||||
'win_release_InlineFunctionExpansion=0 ',
|
||||
'win_release_OmitFramePointers=0 ',
|
||||
# GCC flags
|
||||
'mac_debug_optimization=1 ',
|
||||
'mac_release_optimization=1 ',
|
||||
'release_optimize=1 ',
|
||||
'no_gc_sections=1 ',
|
||||
'debug_extra_cflags="-g -fno-inline -fno-omit-frame-pointer '
|
||||
'-fno-builtin -fno-optimize-sibling-calls" ',
|
||||
'release_extra_cflags="-g -fno-inline -fno-omit-frame-pointer '
|
||||
'-fno-builtin -fno-optimize-sibling-calls" ',
|
||||
# MSVS flags
|
||||
'win_debug_RuntimeChecks=0 ',
|
||||
'win_debug_disable_iterator_debugging=1 ',
|
||||
'win_debug_Optimization=1 ',
|
||||
'win_debug_InlineFunctionExpansion=0 ',
|
||||
'win_release_InlineFunctionExpansion=0 ',
|
||||
'win_release_OmitFramePointers=0 ',
|
||||
|
||||
'linux_use_tcmalloc=1 ',
|
||||
'release_valgrind_build=1 ',
|
||||
'werror= ',
|
||||
'linux_use_tcmalloc=1 ',
|
||||
'release_valgrind_build=1 ',
|
||||
'werror= ',
|
||||
]
|
||||
|
||||
|
||||
class WebRTCFactory(factory.BuildFactory):
|
||||
"""Abstract superclass for all build factories.
|
||||
|
||||
@ -116,12 +117,16 @@ class WebRTCFactory(factory.BuildFactory):
|
||||
warn_on_failure: If true, this step isn't that important and will not
|
||||
cause a failed build on failure.
|
||||
"""
|
||||
flunk_on_failure = not warn_on_failure
|
||||
|
||||
if type(descriptor) is str:
|
||||
descriptor = [descriptor]
|
||||
flunk_on_failure = not warn_on_failure
|
||||
# Add spaces to wrap long test names to make waterfall output more compact.
|
||||
wrapped_text = self._WrapLongLines(descriptor)
|
||||
|
||||
self.addStep(shell.ShellCommand(command=cmd, workdir=workdir,
|
||||
description=descriptor + ['running...'],
|
||||
descriptionDone=descriptor,
|
||||
description=wrapped_text + ['running...'],
|
||||
descriptionDone=wrapped_text,
|
||||
warnOnFailure=warn_on_failure,
|
||||
flunkOnFailure=flunk_on_failure,
|
||||
haltOnFailure=halt_build_on_failure,
|
||||
@ -177,11 +182,38 @@ class WebRTCFactory(factory.BuildFactory):
|
||||
"""
|
||||
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],
|
||||
haltOnFailure=True,
|
||||
name='gyp_%s' % descriptor))
|
||||
self.AddCommonStep(cmd=cmd, workdir='build/trunk', descriptor=descriptor)
|
||||
|
||||
def _WrapLongLines(self, string_list, max_line_length=25, wrap_character='_'):
|
||||
""" Creates a list with wrapped strings for lines that are too long.
|
||||
|
||||
This is done by inserting spaces to long lines with the wrap character
|
||||
in. It's a simple way to make long test targets wrap nicer in the
|
||||
waterfall display.
|
||||
|
||||
This method should only be used for lists that are displayed in the web
|
||||
interface!
|
||||
|
||||
Args:
|
||||
string_list: List of strings where each string represents one line.
|
||||
max_line_length: Number of characters a line may have to avoid
|
||||
getting wrapped.
|
||||
wrap_character: The character we're looking for when inserting a
|
||||
space if a string is larger than max_line_length. If no such
|
||||
character is found, no space will be inserted.
|
||||
Returns:
|
||||
A new list of the same length as the input list, but with strings
|
||||
that may contain extra spaces in them, if longer than the max
|
||||
length.
|
||||
"""
|
||||
result = []
|
||||
for line in string_list:
|
||||
if len(line) > max_line_length:
|
||||
index = line.rfind(wrap_character)
|
||||
if index != -1:
|
||||
line = line[:index] + ' ' + line[index:]
|
||||
result.append(line)
|
||||
return result
|
||||
|
||||
class GenerateCodeCoverage(ShellCommand):
|
||||
"""This custom shell command generates coverage HTML using genhtml.
|
||||
@ -239,11 +271,11 @@ class WebRTCAndroidFactory(WebRTCFactory):
|
||||
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_*'
|
||||
]
|
||||
'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...'],
|
||||
@ -276,11 +308,7 @@ class WebRTCChromeFactory(WebRTCFactory):
|
||||
cmd = ['make', target, '-j100']
|
||||
if make_extra is not None:
|
||||
cmd.append(make_extra)
|
||||
self.addStep(shell.ShellCommand(command=cmd,
|
||||
workdir='build/src', description=descriptor + ['running...'],
|
||||
descriptionDone=descriptor,
|
||||
haltOnFailure=True,
|
||||
name='_'.join(descriptor)))
|
||||
self.AddCommonStep(cmd=cmd, descriptor=descriptor, workdir='build/src')
|
||||
|
||||
|
||||
class WebRTCLinuxFactory(WebRTCFactory):
|
||||
@ -365,10 +393,8 @@ class WebRTCLinuxFactory(WebRTCFactory):
|
||||
cmd = ['out/%s/%s' % (test_folder, test)]
|
||||
if self.valgrind_enabled:
|
||||
cmd = VALGRIND_CMD + cmd
|
||||
self.addStep(shell.ShellCommand(command=cmd,
|
||||
workdir=workdir, description=['Running'] + descriptor,
|
||||
descriptionDone=descriptor,
|
||||
name='_'.join(descriptor)))
|
||||
self.AddCommonStep(cmd, descriptor=descriptor, workdir=workdir,
|
||||
halt_build_on_failure=False)
|
||||
|
||||
def AddXvfbTestRunStep(self, test_name, test_binary, test_arguments=''):
|
||||
""" Adds a test to be run inside a XVFB window manager."""
|
||||
@ -383,11 +409,7 @@ class WebRTCLinuxFactory(WebRTCFactory):
|
||||
cmd = ['make', target, '-j100']
|
||||
if make_extra:
|
||||
cmd.append(make_extra)
|
||||
self.addStep(shell.ShellCommand(command=cmd,
|
||||
workdir='build/trunk', description=descriptor + ['running...'],
|
||||
haltOnFailure=True,
|
||||
descriptionDone=descriptor,
|
||||
name='_'.join(descriptor)))
|
||||
self.AddCommonStep(cmd=cmd, descriptor=descriptor, workdir='build/trunk')
|
||||
|
||||
def AddStepsToEstablishCoverageBaseline(self):
|
||||
self.AddCommonStep(['lcov', '--directory', '.', '--capture', '-b',
|
||||
@ -494,11 +516,8 @@ class WebRTCLinuxFactory(WebRTCFactory):
|
||||
elif test == 'voe_auto_test':
|
||||
# TODO(phoglund): Remove this notice and take appropriate action when
|
||||
# http://code.google.com/p/webrtc/issues/detail?id=266 is concluded.
|
||||
self.addStep(shell.ShellCommand(
|
||||
command=('out/Debug/voe_auto_test --automated '
|
||||
'--gtest_filter="-VolumeTest.*"'),
|
||||
workdir='build/trunk', description=[test, 'running...'],
|
||||
descriptionDone=[test], name=test))
|
||||
cmd = 'out/Debug/voe_auto_test --automated --gtest_filter="-VolumeTest.*"'
|
||||
self.AddCommonTestRunStep(test=test, cmd=cmd)
|
||||
else:
|
||||
self.AddCommonTestRunStep(test)
|
||||
|
||||
@ -541,11 +560,13 @@ class WebRTCMacFactory(WebRTCFactory):
|
||||
if self.build_type == 'xcode' or self.build_type == 'both':
|
||||
cmd = ['xcodebuild/%s/%s' % (test_folder, test)]
|
||||
self.AddCommonStep(cmd, descriptor=descriptor + ['(xcode)'],
|
||||
workdir='build/trunk')
|
||||
halt_build_on_failure=False,
|
||||
workdir=workdir)
|
||||
if self.build_type == 'make' or self.build_type == 'both':
|
||||
cmd = ['out/%s/%s' % (test_folder, test)]
|
||||
self.AddCommonStep(cmd, descriptor=descriptor + ['(make)'],
|
||||
workdir='build/trunk')
|
||||
halt_build_on_failure=False,
|
||||
workdir=workdir)
|
||||
|
||||
def AddCommonMakeStep(self, target, extra_text=None, make_extra=None):
|
||||
descriptor = [target, extra_text] if extra_text else [target]
|
||||
@ -567,7 +588,8 @@ class WebRTCMacFactory(WebRTCFactory):
|
||||
class WebRTCWinFactory(WebRTCFactory):
|
||||
"""Sets up the Windows build.
|
||||
|
||||
Allows building with Debug, Release or both in sequence."""
|
||||
Allows building with Debug, Release or both in sequence.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
WebRTCFactory.__init__(self)
|
||||
@ -580,7 +602,6 @@ class WebRTCWinFactory(WebRTCFactory):
|
||||
configuration='Debug', build_only=False):
|
||||
self.build_enabled = True
|
||||
self.force_sync = force_sync
|
||||
"""Win specific Build"""
|
||||
if platform not in self.allowed_platforms:
|
||||
print '*** INCORRECT PLATFORM (%s)!!! ***' % platform
|
||||
sys.exit(0)
|
||||
|
@ -7,34 +7,70 @@
|
||||
# in the file PATENTS. All contributing project authors may
|
||||
# be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
"""Unit tests for helper functions in utils.py."""
|
||||
|
||||
__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
|
||||
|
||||
import unittest
|
||||
|
||||
from webrtc_buildbot import utils
|
||||
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
|
||||
def testGetEnabledTests(self):
|
||||
tests = {
|
||||
# Test name Linux Mac Windows
|
||||
"test_1": (True, True, False),
|
||||
"test_2": (True, False, False),
|
||||
# Name Linux Mac Windows
|
||||
'test_1': (True, True, False),
|
||||
'test_2': (True, False, False),
|
||||
}
|
||||
result = utils.GetEnabledTests(tests, "Linux")
|
||||
result = utils.GetEnabledTests(tests, 'Linux')
|
||||
self.assertEqual(2, len(result))
|
||||
self.assertEqual('test_1', result[0])
|
||||
self.assertEqual('test_2', result[1])
|
||||
|
||||
result = utils.GetEnabledTests(tests, "Mac")
|
||||
result = utils.GetEnabledTests(tests, 'Mac')
|
||||
self.assertEqual(1, len(result))
|
||||
self.assertEqual('test_1', result[0])
|
||||
|
||||
result = utils.GetEnabledTests(tests, "Windows")
|
||||
result = utils.GetEnabledTests(tests, 'Windows')
|
||||
self.assertEqual(0, len(result))
|
||||
|
||||
self.assertRaises(utils.UnsupportedPlatformError,
|
||||
utils.GetEnabledTests, tests, "BeOS")
|
||||
utils.GetEnabledTests, tests, 'BeOS')
|
||||
|
||||
if __name__ == "__main__":
|
||||
def testEmptyListExitQuietly(self):
|
||||
factory = utils.WebRTCFactory()
|
||||
self.assertEqual([], factory._WrapLongLines([]))
|
||||
|
||||
def testShortLinesShallNotWrap(self):
|
||||
factory = utils.WebRTCFactory()
|
||||
self.assertEqual(['a'], factory._WrapLongLines(['a']))
|
||||
|
||||
string_25_len = '12345678901234567890123_5'
|
||||
result = factory._WrapLongLines([string_25_len, string_25_len])
|
||||
self.assertEqual(string_25_len, result[0])
|
||||
self.assertEqual(string_25_len, result[1])
|
||||
|
||||
def testLinesWithMoreThan25CharactersWithNoWrapCharacterIsUnchanged(self):
|
||||
factory = utils.WebRTCFactory()
|
||||
string_26_len = '12345678901234567890123456'
|
||||
result = factory._WrapLongLines([string_26_len, string_26_len])
|
||||
self.assertEqual(string_26_len, result[0])
|
||||
self.assertEqual(string_26_len, result[1])
|
||||
|
||||
def testLinesWithMoreThan25CharactersShallWrapOnWrapCharacter(self):
|
||||
factory = utils.WebRTCFactory()
|
||||
string_26_len = '123456789012345678901234_6'
|
||||
test_list = [string_26_len, string_26_len]
|
||||
result = factory._WrapLongLines(test_list)
|
||||
expected_result = '123456789012345678901234 _6'
|
||||
self.assertEqual(expected_result, result[0])
|
||||
self.assertEqual(expected_result, result[1])
|
||||
# Verify the original test_list was not modified too.
|
||||
self.assertEqual(string_26_len, test_list[0])
|
||||
self.assertEqual(string_26_len, test_list[1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
x
Reference in New Issue
Block a user