Add support for build category in BuildEvent

R=dsansome@chromium.org, sergeyberezin@chromium.org
BUG=596226

Review-Url: https://codereview.chromium.org/2108803004
Cr-Mirrored-From: https://chromium.googlesource.com/infra/infra
Cr-Mirrored-Commit: c454ffb119edc355e22430622213ff95dd4012d5
diff --git a/event_mon/monitoring.py b/event_mon/monitoring.py
index b896d58..d5e5547 100644
--- a/event_mon/monitoring.py
+++ b/event_mon/monitoring.py
@@ -272,7 +272,8 @@
                     goma_error=None,
                     goma_crash_report_id=None,
                     patch_url=None,
-                    bbucket_id=None):
+                    bbucket_id=None,
+                    category=None):
   """Compute a ChromeInfraEvent filled with a BuildEvent.
 
   Arguments are identical to those in send_build_event(), please refer
@@ -345,6 +346,14 @@
     except (ValueError, TypeError):
       pass
 
+  if category:
+    event.build_event.category = {
+      'cq': BuildEvent.CATEGORY_CQ,
+      'cq_experimental': BuildEvent.CATEGORY_CQ_EXPERIMENTAL,
+      'git_cl_try': BuildEvent.CATEGORY_GIT_CL_TRY,
+    }.get(category.lower(), BuildEvent.CATEGORY_UNKNOWN)
+    
+
   if event.build_event.step_name:
     if event_type != 'STEP':
       logging.error('step_name should be provided only for type "STEP", '
@@ -439,7 +448,8 @@
                      goma_error=None,
                      goma_crash_report_id=None,
                      patch_url=None,
-                     bbucket_id=None):
+                     bbucket_id=None,
+                     category=None):
   """Send a ChromeInfraEvent filled with a BuildEvent
 
   Args:
@@ -468,6 +478,7 @@
     goma_crash_report_id (string): id of goma crash report.
     patch_url (string): URL of the patch that triggered build
     bbucket_id (long): Buildbucket ID of the build.
+    category (string): Build category, e.g. cq or git_cl_try.
 
   Returns:
     success (bool): False if some error happened.
@@ -488,7 +499,8 @@
                          goma_error=goma_error,
                          goma_crash_report_id=goma_crash_report_id,
                          patch_url=patch_url,
-                         bbucket_id=bbucket_id).send()
+                         bbucket_id=bbucket_id,
+                         category=category).send()
 
 
 def send_events(events):
diff --git a/event_mon/test/monitoring_test.py b/event_mon/test/monitoring_test.py
index 055122b..51316be 100644
--- a/event_mon/test/monitoring_test.py
+++ b/event_mon/test/monitoring_test.py
@@ -328,6 +328,35 @@
         'BUILD', 'bot.host.name', 'build_name', bbucket_id='foo').log_event()
     self.assertIsInstance(log_event, LogRequestLite.LogEventLite)
 
+  def test_get_build_event_with_category(self):
+    log_event = monitoring.get_build_event(
+        'BUILD', 'bot.host.name', 'build_name',
+        category='git_cl_try').log_event()
+    self.assertIsInstance(log_event, LogRequestLite.LogEventLite)
+
+    # Check that source_extension deserializes to the right thing.
+    event = ChromeInfraEvent.FromString(log_event.source_extension)
+    self.assertTrue(event.HasField('build_event'))
+    self.assertEquals(
+        event.build_event.category, BuildEvent.CATEGORY_GIT_CL_TRY)
+
+    # Try unknown value. Should produce CATEGORY_UNKNOWN.
+    log_event = monitoring.get_build_event(
+        'BUILD', 'bot.host.name', 'build_name', category='foobar').log_event()
+    self.assertIsInstance(log_event, LogRequestLite.LogEventLite)
+    event = ChromeInfraEvent.FromString(log_event.source_extension)
+    self.assertTrue(event.HasField('build_event'))
+    self.assertEquals(
+        event.build_event.category, BuildEvent.CATEGORY_UNKNOWN)
+
+    # Try empty value. Should not set category.
+    log_event = monitoring.get_build_event(
+        'BUILD', 'bot.host.name', 'build_name', category='').log_event()
+    self.assertIsInstance(log_event, LogRequestLite.LogEventLite)
+    event = ChromeInfraEvent.FromString(log_event.source_extension)
+    self.assertTrue(event.HasField('build_event'))
+    self.assertFalse(event.build_event.HasField('category'))
+
   def test_get_build_event_invalid_type(self):
     # An invalid type is a critical error.
     log_event = monitoring.get_build_event('INVALID_TYPE',