[autotest] Fix test name parsing logic for Launch Control builds

BUG=chromium:609956
TEST=unittest

Change-Id: I2707715c2d1c4e34846c713e018527410d28b5b0
Reviewed-on: https://chromium-review.googlesource.com/344752
Commit-Ready: Dan Shi <dshi@google.com>
Tested-by: Dan Shi <dshi@google.com>
Reviewed-by: Kevin Cheng <kevcheng@chromium.org>
diff --git a/server/site_utils.py b/server/site_utils.py
index 330c6f9..a040edf 100644
--- a/server/site_utils.py
+++ b/server/site_utils.py
@@ -14,7 +14,7 @@
 import urllib2
 
 import common
-from autotest_lib.client.common_lib import base_utils
+from autotest_lib.client.common_lib import utils
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.common_lib import host_queue_entry_states
@@ -176,7 +176,7 @@
 
     for sheriff_js in sheriff_js_list:
         try:
-            url_content = base_utils.urlopen('%s%s'% (
+            url_content = utils.urlopen('%s%s'% (
                 _CHROMIUM_BUILD_URL, sheriff_js)).read()
         except (ValueError, IOError) as e:
             logging.warning('could not parse sheriff from url %s%s: %s',
@@ -205,7 +205,7 @@
     """
     wget_cmd = ("wget -O - %s | %s 'cat >%s'" %
                 (source_url, ssh_cmd, dest_path))
-    base_utils.run(wget_cmd)
+    utils.run(wget_cmd)
 
 
 _MAX_LAB_STATUS_ATTEMPTS = 5
@@ -589,6 +589,8 @@
 
     Note that pgo and chrome-perf builds will fail the method. Since lab does
     not run test for these builds, they can be ignored.
+    Also, tests for Launch Control builds have different naming convention.
+    The build ID will be used as build_version.
 
     @param name: Name of the job.
 
@@ -600,8 +602,8 @@
 
     """
     info = {}
-    suite_job_regex = '([^/]*/[^/]*)-test_suites/control\.(.*)'
-    test_job_regex = '([^/]*/[^/]*)/([^/]+)/.*'
+    suite_job_regex = '([^/]*/[^/]*(?:/\d+)?)-test_suites/control\.(.*)'
+    test_job_regex = '([^/]*/[^/]*(?:/\d+)?)/([^/]+)/.*'
     match = re.match(suite_job_regex, name)
     if not match:
         match = re.match(test_job_regex, name)
@@ -612,7 +614,18 @@
         try:
             info['board'], _, _, _ = ParseBuildName(info['build'])
         except ParseBuildNameException:
-            pass
+            # Try to parse it as Launch Control build
+            # Launch Control builds have name format:
+            # branch/build_target-build_type/build_id.
+            try:
+                _, target, build_id = utils.parse_launch_control_build(
+                        info['build'])
+                build_target, _ = utils.parse_launch_control_target(target)
+                if build_target:
+                    info['board'] = build_target
+                    info['build_version'] = build_id
+            except ValueError:
+                pass
     return info
 
 
diff --git a/server/site_utils_unittest.py b/server/site_utils_unittest.py
index 80901c1..57cc534 100644
--- a/server/site_utils_unittest.py
+++ b/server/site_utils_unittest.py
@@ -22,17 +22,22 @@
         trybot_release_build = 'trybot-lumpy-release/R27-3837.0.0-b456'
         release_build = 'lumpy-release/R27-3837.0.0'
         paladin_build = 'lumpy-paladin/R27-3878.0.0-rc7'
+        brillo_build = 'git_mnc-brillo-dev/lumpy-eng/1234'
 
         builds = [trybot_paladin_build, trybot_release_build, release_build,
-                  paladin_build]
+                  paladin_build, brillo_build]
         test_name = 'login_LoginSuccess'
         board = 'lumpy'
         suite = 'bvt'
         for build in builds:
             expected_info = {'board': board,
                              'suite': suite,
-                             'build': build,
-                             'build_version': build.split('/')[1]}
+                             'build': build}
+            build_parts = build.split('/')
+            if len(build_parts) == 2:
+                expected_info['build_version'] = build_parts[1]
+            else:
+                expected_info['build_version'] = build_parts[2]
             suite_job_name = ('%s-%s' %
                     (build, site_rpc_interface.canonicalize_suite_name(suite)))
             info = site_utils.parse_job_name(suite_job_name)