#!/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 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


SVN_LOCATION = "http://webrtc.googlecode.com/svn/trunk"

class WebRTCFactory(factory.BuildFactory):
  """A Build Factory affected by properties."""

  def __init__(self, build_factory_properties=None, steps=None,
               enable_coverage=False, account=None):
    factory.BuildFactory.__init__(self, steps)
    self.properties = properties.Properties()
    self.enable_build = False
    self.force_sync = False
    self.headless_tests = []
    self.enable_coverage = enable_coverage
    self.gyp_params = []
    self.account = account
    self.coverage_dir = ""
    self.coverage_url = ""
    self.release = False
    if self.account is None:
      self.coverage_url = "http://www.corp.google.com/~webrtc-cb"
      self.coverage_dir = "/home/webrtc-cb/www"
    else:
      self.coverage_url = "http://www.corp.google.com/~%s" % self.account
      self.coverage_dir = "/home/%s/www" % self.account

  def EnableBuild(self, force_sync):
    """Build the binary [must be overridden]."""
    pass

  def AddCommonTestSteps(self, test):
    """Add common steps for test.

       test: test to be run.
    """
    self.AddCommonMakeStep(test)
    self.AddCommonTestRunStep(test)

  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]."""
    pass

  def AddCommonMakeStep(self):
    """Define common make 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

  def EnableTests(self, tests):
    """Enable Test to be run.

       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:
      self.EnableCoverage()

  def EnableHeadLess(self, tests):
    """Add headless (build only) tests.

       tests: list of headless test.
    """
    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


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:
      raise TypeError("coverage location required")
    print coverage_url, coverage_dir
    ShellCommand.__init__(self, **kwargs)
    self.addFactoryArguments(coverage_url=coverage_url,
                             coverage_dir=coverage_dir)
    self.setDefaultWorkdir("build/trunk")
    self.coverage_url = coverage_url
    self.coverage_dir = coverage_dir
    self.setCommand(["genhtml", "final.info", "--output-directory",
      WithProperties(coverage_dir + "/%(buildername)s_%(buildnumber)s")])

  def createSummary(self, log):
    coverage_url = "%s/%s_%s" % (self.coverage_url,
        self.getProperty("buildername"), self.getProperty("buildnumber"))
    coverage_dir = "%s/%s_%s" % (self.coverage_dir,
        self.getProperty("buildername"), self.getProperty("buildnumber"))
    os.chmod(coverage_dir,0777)
    for root, dirs, files in os.walk(coverage_dir):
      for d in dirs:
        os.chmod(os.path.join(root, d), 0777)
      for f in files:
        os.chmod(os.path.join(root, f), 0777)
    self.addURL("coverage", coverage_url)

  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."""

  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, force_sync=False, release=False, build32=False,
                  chrome_os=False, clang=False):
    if build32:
      self.gyp_params.append("-Dtarget_arch=ia32")

    self.enable_build = True
    self.force_sync = force_sync
    """Linux specific Build"""
    self.release = release
    self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup")
    self.AddCommonStep(["gclient", "config", SVN_LOCATION],
                       descriptor="gclient_config")

    cmd = ["gclient", "sync"]
    if force_sync:
      cmd.append("--force")
    self.AddCommonStep(cmd, descriptor="Sync")
    if chrome_os:
      self.gyp_params.append("-Dchromeos=1")

    if clang:
      self.gyp_params.append("-Dclang=1")

    if self.enable_coverage:
      self.gyp_params.append("-Dcoverage=1")
    self.AddCommonGYPStep("webrtc.gyp", descriptor="CommonGYP")

    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 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]
    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="_".join(test_descriptor)))

  def AddCommonMakeStep(self, make, descriptor="", make_extra=None):
    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="_".join(make_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."""
    self.AddCommonStep(["lcov", "--directory", ".", "--capture", "-b",
                        ".", "--output-file", "webrtc.info"],
                       warnOnFailure=True,
                       workdir="build/trunk", descriptor=["LCOV", "Capture"])
    self.AddCommonStep(['lcov', '--extract', 'webrtc.info', '*/src/*',
                        '--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 EnableTest(self, test):
    """Enable Test to be run.

       test: test to be run.
    """
    if test == "audioproc_unittest":
      self.AddCommonTestRunStep(test)
      self.AddCommonGYPStep("webrtc.gyp", gyp_params=["-Dprefer_fixed_point=1"],
                            descriptor="fixed_point")
      self.AddCommonMakeStep(test, descriptor="make_fixed_point")
      self.AddCommonTestRunStep(test, descriptor="fixed_point")
    elif test == "signal_processing_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "resampler_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vad_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "rtp_rtcp_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "video_coding_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "test_bwe":
      self.AddCommonTestRunStep(test)
    elif test == "audio_device_test_api":
      self.AddCommonTestRunStep(test)
    elif test == "audio_device_test_func":
      self.AddCommonTestRunStep(test)
    elif test == "audio_coding_module_test":
      self.AddCommonTestRunStep(test)
    elif test == "video_processing_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "test_fec":
      self.AddCommonTestRunStep(test)
    elif test == "system_wrappers_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "cng_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "g711_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "g722_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "pcm16b_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "audio_conference_mixer_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "media_file_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "udp_transport_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "webrtc_utility_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "neteq_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vp8_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "libyuv_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "voice_engine_unittests":
      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 '
        '--gtest_filter="ViEStandardIntegrationTest.*:ViEApiIntegrationTest.*" '
        '--capture_test_ensure_resolution_alignment_in_capture_device=false'),
        workdir="build/trunk", description=[test, "running..."],
        descriptionDone=[test, "done..."], name="%s" % test))
    elif test == "voe_auto_test":
      self.addStep(shell.Compile(command=('out/Debug/voe_auto_test --automated '
                                          '--gtest_filter="-*Manual*"'),
        workdir="build/trunk", description=[test, "running..."],
        descriptionDone=[test, "done..."], name="%s" % test))
    else:
      print "[Linux]: No supported tests are found for [%s]" % test


################################################################################
class WebRTCMacFactory(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)
    self.build_type = "both"
    self.allowed_build_types = ["both", "xcode", "make"]

  def EnableBuild(self, force_sync=True, build_type="both", release=False):
    self.enable_build = True
    self.force_sync = force_sync
    self.release = release
    """Mac specific Build"""
    if build_type not in self.allowed_build_types:
      print "*** INCORRECT BUILD TYPE (%s)!!! ***" % build_type
      sys.exit(0)
    else:
      self.build_type = build_type
    self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup")
    self.AddCommonStep(["gclient", "config", SVN_LOCATION],
                       descriptor="gclient_config")
    cmd = ["gclient", "sync"]
    if force_sync:
      cmd.append("--force")
    self.AddCommonStep(cmd, descriptor="Sync")
    if self.build_type == "make" or self.build_type == "both":
      self.AddCommonGYPStep("webrtc.gyp", gyp_params=["-f", "make"],
                            descriptor="EnableMake")
    self.AddCommonMakeStep("all")

  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]
    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)"],
                           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)"],
                           workdir="build/trunk")

  def AddCommonMakeStep(self, make, descriptor="", make_extra=None):
    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)"],
                         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)"],
                         workdir="build/trunk")

  def EnableTest(self, test):
    """Enable Test to be run.

       test: test to be run.
    """
    if test == "audioproc_unittest":
      self.AddCommonTestRunStep(test)
    elif test == "signal_processing_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "resampler_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vad_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "rtp_rtcp_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "video_coding_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "test_bwe":
      self.AddCommonTestRunStep(test)
    elif test == "audio_device_test_api":
      self.AddCommonTestRunStep(test)
    elif test == "audio_device_test_func":
      self.AddCommonTestRunStep(test)
    elif test == "audio_coding_module_test":
      self.AddCommonTestRunStep(test)
    elif test == "video_processing_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "test_fec":
      self.AddCommonTestRunStep(test)
    elif test == "system_wrappers_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "audio_conference_mixer_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "media_file_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "udp_transport_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "webrtc_utility_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "neteq_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vp8_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "libyuv_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "voice_engine_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "video_engine_core_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "audio_coding_unittests":
      self.AddCommonTestRunStep(test)
    else:
      print "[Mac]: No supported tests are found for [%s]" % test

################################################################################
class WebRTCWinFactory(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)
    self.configuration = "Debug"
    self.platform = "x64"
    self.allowed_platforms = ["x64", "Win32"]
    self.allowed_configurations = ["Debug", "Release", "both"]

  def EnableBuild(self, force_sync=True, platform="Win32",
                  configuration="Debug", build_only=False):
    self.enable_build = True
    self.force_sync = force_sync
    """Win specific Build"""
    if platform not in self.allowed_platforms:
      print "*** INCORRECT PLATFORM (%s)!!! ***" % platform
      sys.exit(0)
    else:
      self.platform = platform
    if configuration not in self.allowed_configurations:
      print "*** INCORRECT CONFIGURATION (%s)!!! ***" % configuration
      sys.exit(0)
    else:
      self.configuration = configuration
    if not build_only:
      self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup")
      self.AddCommonStep(["gclient", "config", SVN_LOCATION],
                         descriptor="gclient_config")
      cmd = ["gclient", "sync"]
      if force_sync:
        cmd.append("--force")
      self.AddCommonStep(cmd, descriptor="Sync")

    if self.configuration == "Debug" or self.configuration == "both":
      cmd = ["msbuild", "webrtc.sln", "/t:Clean",
             "/p:Configuration=Debug;Platform=%s" % (self.platform)]
      self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk")
      cmd = ["msbuild", "webrtc.sln", 
             "/p:Configuration=Debug;Platform=%s" % (self.platform)]
      self.AddCommonStep(cmd, descriptor="Build_Debug", workdir="build/trunk")
    if self.configuration == "Release" or self.configuration == "both":
      cmd = ["msbuild", "webrtc.sln", "/t:Clean",
             "/p:Configuration=Release;Platform=%s" % (self.platform)]
      self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk")
      cmd = ["msbuild", "webrtc.sln", 
             "/p:Configuration=Release;Platform=%s" % (self.platform)]
      self.AddCommonStep(cmd, descriptor="Build_Release", workdir="build/trunk")

  def AddCommonTestRunStep(self, test, descriptor="", cmd=None,
                           workdir="build/trunk"):
    if test in self.headless_tests:
      return
    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"],
                           workdir=workdir)
      if self.configuration == "Release" or self.configuration == "both":
        cmd = ["build\Release\%s.exe" % test]
        self.AddCommonStep(cmd, descriptor=test_descriptor+["Release"],
                           workdir=workdir)


  def EnableTest(self, test):
    """Enable Test to be run.

       test: test to be run.
    """
    if test == "audioproc_unittest":
      self.AddCommonTestRunStep(test)
    elif test == "resampler_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vad_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "system_wrappers_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "neteq_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "vp8_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "libyuv_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "voice_engine_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "video_engine_core_unittests":
      self.AddCommonTestRunStep(test)
    elif test == "audio_coding_unittests":
      self.AddCommonTestRunStep(test)
    else:
      print "[Win]: No supported tests are found for [%s]" % test


