#!/usr/bin/env python
#  Copyright (c) 2011 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)'

# This is a buildmaster config file for WebRTC project. 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("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),
               BuildSlave("linux-slave-4", "pass", max_builds=1),
               BuildSlave("linux-slave-5", "pass", max_builds=1),
               BuildSlave("linux_video", "pass", max_builds=1),
               BuildSlave("mac-slave-1", "pass", max_builds=1),
               BuildSlave("win-slave", "pass", max_builds=1),
               BuildSlave("win-slave32", "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

source_code_svn_url = 'http://webrtc.googlecode.com/svn/trunk'
svn_poller = SVNPoller(svnurl=source_code_svn_url, pollinterval=5*60,
                       histmax=10, svnbin='/usr/bin/svn')
c['change_source'] = svn_poller

####### SCHEDULERS

## configure the Schedulers

from buildbot.scheduler import Scheduler
webrtc_scheduler = Scheduler(name="all", branch=None, treeStableTimer=5*60,
                              builderNames=["Win32Debug",
                                            "Win32Release",
                                            "MacOS",
                                            "ChromeOS",
                                            "LinuxCLANG",
                                            "Linux64bitDBG",
                                            "Linux32bitRelease",
                                            "Linux64bitRelease",
                                            "Linux32bitDBG",
                                            "Android",
                                            "LinuxVideoTest"])
c['schedulers'] = [webrtc_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

DEFAULT_LINUX_TESTS = ["audio_coding_module_test",
                       "audio_coding_unittests",
                       "audio_conference_mixer_unittests",
                       "audio_device_test_api",
                       "audio_device_test_func",
                       "audioproc_unittest",
                       "cng_unittests",
                       "g711_unittests",
                       "g722_unittests",
                       "libyuv_unittests",
                       "media_file_unittests",
                       "neteq_unittests",
                       "pcm16b_unittests"
                       "resampler_unittests",
                       "rtp_rtcp_unittests",
                       "signal_processing_unittests",
                       "system_wrappers_unittests",
                       "test_bwe",
                       # TODO(andrew): enable test_fec (and below) when its
                       # running time is reduced.
                       #"test_fec",
                       "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",
                       "audioproc_unittest",
                       "cng_unittests",
                       "g711_unittests",
                       "g722_unittests",
                       "libyuv_unittests",
                       "media_file_unittests",
                       "neteq_unittests",
                       "pcm16b_unittests"
                       "resampler_unittests",
                       "rtp_rtcp_unittests",
                       "signal_processing_unittests",
                       "system_wrappers_unittests",
                       "test_bwe",
                       #"test_fec",
                       "udp_transport_unittests",
                       "vad_unittests",
                       "video_coding_unittests",
                       "video_engine_core_unittests",
                       "video_processing_unittests",
                       "voice_engine_unittests",
                       "vp8_unittests",
                       "webrtc_utility_unittests"]

# TODO(andrew): most tests should now run properly on Windows.
DEFAULT_WIN_TESTS = ["audio_coding_unittests",
                     #"audioproc_unittest",
                     "libyuv_unittests",
                     "neteq_unittests",
                     "resampler_unittests",
                     "system_wrappers_unittests",
                     #"test_fec"
                     "vad_unittests",
                     "video_engine_core_unittests",
                     #"video_processing_unittests",
                     "voice_engine_unittests",
                     "vp8_unittests"]

HEADLESS_LINUX = ["audio_device_test_api",
                  "audio_device_test_func"]
HEADLESS_MACOS = ["audio_device_test_api",
                  "audio_device_test_func"]
HEADLESS_WIN = ["audio_device_test_api",
                "audio_device_test_func"]

############# Linux Builders #######################################
linux_factory_64_dbg = utils.WebRTCLinuxFactory(enable_coverage=True)
linux_factory_64_dbg.EnableBuild()
linux_factory_64_dbg.EnableHeadLess(HEADLESS_LINUX)
linux_factory_64_dbg.EnableTests(DEFAULT_LINUX_TESTS)

linux_factory_32_release = utils.WebRTCLinuxFactory(enable_coverage=True)
linux_factory_32_release.EnableBuild(release=True, build32=True)
linux_factory_32_release.EnableHeadLess(HEADLESS_LINUX)
linux_factory_32_release.EnableTests(DEFAULT_LINUX_TESTS)

linux_factory_64_release = utils.WebRTCLinuxFactory(enable_coverage=True)
linux_factory_64_release.EnableBuild(release=True)
linux_factory_64_release.EnableHeadLess(HEADLESS_LINUX)
linux_factory_64_release.EnableTests(DEFAULT_LINUX_TESTS)

linux_factory_32_dbg = utils.WebRTCLinuxFactory(enable_coverage=True)
linux_factory_32_dbg.EnableBuild(build32=True)
linux_factory_32_dbg.EnableHeadLess(HEADLESS_LINUX)
linux_factory_32_dbg.EnableTests(DEFAULT_LINUX_TESTS)

linux_factory_video = utils.WebRTCLinuxFactory()
linux_factory_video.EnableBuild()
linux_factory_video.EnableTests(["vie_auto_test", "voe_auto_test"])

chromeos_factory = utils.WebRTCLinuxFactory()
chromeos_factory.EnableBuild(chrome_os=True)
chromeos_factory.EnableHeadLess(HEADLESS_LINUX)
chromeos_factory.EnableTests(DEFAULT_LINUX_TESTS)

linux_clang = utils.WebRTCLinuxFactory()
linux_clang.EnableBuild(clang=True)
linux_clang.EnableHeadLess(HEADLESS_LINUX)
linux_clang.EnableTests(DEFAULT_LINUX_TESTS)

############# Mac Builders #######################################
mac_factory = utils.WebRTCMacFactory()
mac_factory.EnableBuild(build_type="both")
mac_factory.EnableHeadLess(HEADLESS_MACOS)
mac_factory.EnableTests(DEFAULT_MACOS_TESTS)

############# Windows Builders #######################################
win_factory_32_Debug = utils.WebRTCWinFactory()
win_factory_32_Debug.EnableBuild(configuration="Debug")
win_factory_32_Debug.EnableHeadLess(HEADLESS_WIN)
win_factory_32_Debug.EnableTests(DEFAULT_WIN_TESTS)

win_factory_32_Release = utils.WebRTCWinFactory()
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",
      'builddir': "linux-slave-1",
      'factory': linux_factory_64_dbg,
      }
linux_builder_2 = {
      'name': "Linux32bitRelease",
      'slavename': "linux-slave-2",
      'builddir': "linux-slave-2",
      'factory': linux_factory_32_release,
      }
linux_builder_3 = {
      'name': "Linux64bitRelease",
      'slavename': "linux-slave-5",
      'builddir': "linux-slave-5",
      'factory': linux_factory_64_release,
      }
linux_builder_4 = {
      'name': "Linux32bitDBG",
      'slavename': "linux-slave-4",
      'builddir': "linux-slave-4",
      'factory': linux_factory_32_dbg,
      }
mac_builder_1 = {
      'name': "MacOS",
      'slavename': "mac-slave-1",
      'builddir': "mac-slave-1",
      'factory': mac_factory,
      }
chromeos_builder = {
      'name': "ChromeOS",
      'slavename': "chromeos",
      'builddir': "chromeos",
      'factory': chromeos_factory,
      }
win_builder_1 = {
      'name': "Win32Debug",
      'slavename': "win-slave",
      'builddir': "win-32-dbg",
      'factory': win_factory_32_Debug,
      }
win_builder_2 = {
      'name': "Win32Release",
      'slavename': "win-slave32",
      'builddir': "win-32-release",
      'factory': win_factory_32_Release,
      }
linux_video_builder = {
      'name': "LinuxVideoTest",
      'slavename': "linux_video",
      'builddir': "video",
      'factory': linux_factory_video,
      }
linux_clang_builder = {
      'name': "LinuxCLANG",
      'slavename': "linux-clang",
      '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, android_builder_1,
                 linux_video_builder]


####### 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]

####### 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-cb-linux-master.cbf.corp.google.com:8010/"