[autotest] Add test in lxc_functional_test to check ts_mon

BUG=chromium:676696
TEST=local run lxc_functional_test

Change-Id: I531cca24f4f8caf5eaa1e3bf21a76ff6bf243f46
Reviewed-on: https://chromium-review.googlesource.com/533815
Commit-Ready: Dan Shi <dshi@google.com>
Tested-by: Dan Shi <dshi@google.com>
Reviewed-by: Paul Hobbs <phobbs@google.com>
diff --git a/site_utils/lxc_functional_test.py b/site_utils/lxc_functional_test.py
index 8c38c0c..7184a76 100644
--- a/site_utils/lxc_functional_test.py
+++ b/site_utils/lxc_functional_test.py
@@ -64,6 +64,87 @@
 lxc.install_packages(['atop'], ['acora'])
 
 """
+
+TEST_SCRIPT_CONTENT_TS_MON = """
+# Test ts_mon metrics can be set up.
+from chromite.lib import ts_mon_config
+ts_mon_config.SetupTsMonGlobalState('some_test', suppress_exception=False)
+"""
+
+CREATE_FAKE_TS_MON_CONFIG_SCRIPT = 'create_fake_key.py'
+
+CREATE_FAKE_TS_MON_CONFIG_SCRIPT_CONTENT = """
+import os
+import rsa
+
+EXPECTED_TS_MON_CONFIG_NAME = '/etc/chrome-infra/ts-mon.json'
+
+FAKE_TS_MON_CONFIG_CONTENT = '''
+    {
+        "credentials":"/tmp/service_account_prodx_mon.json",
+        "endpoint":"https://xxx.googleapis.com/v1:insert",
+        "use_new_proto": true
+    }'''
+
+FAKE_SERVICE_ACCOUNT_CRED_JSON = '''
+    {
+        "type": "service_account",
+        "project_id": "test_project",
+        "private_key_id": "aaa",
+        "private_key": "%s",
+        "client_email": "xxx",
+        "client_id": "111",
+        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+        "token_uri": "https://accounts.google.com/o/oauth2/token",
+        "auth_provider_x509_cert_url":
+                "https://www.googleapis.com/oauth2/v1/certs",
+        "client_x509_cert_url":
+                "https://www.googleapis.com/robot/v1/metadata/x509/xxx"
+    }'''
+
+
+TEST_KEY = '''------BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzg4K2SXqf9LAM
+52a/t2HfpY5y49sbrgRb1llP6c8RVWhUX/pGdjbcIM97+1CJEWBN8Vmraoe4+71o
+1idTPehJfHRNeyXQUnro8CmnSxE9tLHtdKj0pzvO+yqT66O6Iw1aUAIX+dG4Us9Q
+Z22ypFHaJ74lKw9JFwAFTJ/TF1rXUXqgufYTNNqP3Ra7wCHF8BmtjwRYAlvsR9CO
+c4eVC1+qhq/8/EOMCgF/rsbZW93r/nz5xgsSX0k6WkAz5WX2mniHfmBFpmr039jZ
+0eI1mEMGDAYuUn05++dNveo/ZOZj3wBlFzyfNSeeWJB5SdKPTvN3H/Iu0Aw+Rtb6
+szwNClaFAgMBAAECggEAHZ8cjVRUJ/tiJorzlTyfKZ6hwhsPv4JIRVg6LhnceZWA
+jPW2cHSWyl2epyx55lhH7iyeeY7vXOqrX1aBMDb1stSWw2dH/tdxYSkqEmksa+R6
+fL6kl5RV5epjpPt77Z3VmPq9UbP/M310qKWcgB8lw4wN0AfKMqsZLYauk9BVhNRu
+Bgah9O7BmcXS+mp49w0Xyfo1UBvzW8R6UnBhHbf9aOY8ObMD0Jj/wDjlYMqSSIKR
+9/8GZWQEKe6q0PyRRdNNtdzbpBrR0fIw6/T9pfDR2fBAcpNvD50eJk2jRiRDTWFJ
+rVSc0bvZFb74Rc3LbMSXW/6Kb7I2IG1XsWw7nxp92QKBgQDgzdIxZrkNZ3Tbuzng
+SG4atjnaCXoekOHK7VZVYd30S0AAizeGu1sjpUVQgsf+qkFskXAQp2/2f+Wiuq2G
++nJYvXwZ/r9IcUs/oD3Fa2ezCVz1N/HOSPFAZK9XZuZbL8sXEYIPGJWH5F8Sanmb
+xNp9IUynlpwgM2JlZNeTCkv4PQKBgQDMbL/AF3LSpKvwi+QvYVkX/gChQmNMr4pP
+TM/GI4D03tNrzsut3oerKMUw0c5MxonkAJpuACN6baRyBOBxRYQSt8wWkORg9iqy
+a7aHnQqIGRafydW1/Snhr2DJSSaViHfO0oaA1r61zgMUTnSGb3UjyxJQp65dvPac
+BhpR9wpz6QKBgQDR2S/CL8rEqXObfi1roREu3DYqw7f8enBb1qtFrsLbPbd0CoD9
+wz0zjB6lJj/9CP9jkmwTD8njR8ab3jkIDBfboJ4NQhFbVW7R6QpglH9L0Iy2189g
+KhUScCqBoyubqYSidxR6dQ94uATLkxsL/nmaXxBITL5XDMBoN/dIak86XQKBgDqa
+oo4LKtvAYZpgQFZk7gm2w693PMhrOpdpSddfrkSE7M9nRXTe6r3ivkU0oJPaBwXa
+Nmt6lrEuZYpaY42VhDtpfZSqjQ5PBAaKYpWWK8LAjn/YeO/nV+5fPLv3wJv1t4MP
+T4f4CExOdwuHQliX81kDioicyZwN5BTumvUMgW6hAoGAF29kI1KthKaHN9P1DchI
+qqoHb9FPdZ5I6HDQpn6fr9ut7+9kVqexUrQ2AMvcVei6gDWW6P3yDCdTKcV9qtts
+1JOP2aSmXvibflx/bNfnhu988qJDhJ3CCjfc79fjwntUIXNPsFmwC9W5lnlSMKHM
+rH4RdmnjeCIG1PZ35m/yUSU=
+-----END PRIVATE KEY-----'''
+
+if not os.path.exists(EXPECTED_TS_MON_CONFIG_NAME):
+    try:
+        os.makedirs(os.path.dirname(EXPECTED_TS_MON_CONFIG_NAME))
+    except OSError:
+        # Directory already exists.
+        pass
+
+    with open(EXPECTED_TS_MON_CONFIG_NAME, 'w') as f:
+        f.write(FAKE_TS_MON_CONFIG_CONTENT)
+    with open ('/tmp/service_account_prodx_mon.json', 'w') as f:
+        f.write(FAKE_SERVICE_ACCOUNT_CRED_JSON % repr(TEST_KEY)[2:-1])
+"""
+
 # Name of the test control file.
 TEST_CONTROL_FILE = 'attach.1'
 TEST_DUT = '172.27.213.193'
@@ -134,6 +215,18 @@
     # Inject "AUTOSERV/testing_mode: True" in shadow config to test autoserv.
     container.attach_run('echo $\'[AUTOSERV]\ntesting_mode: True\' >>'
                          ' /usr/local/autotest/shadow_config.ini')
+
+    if not utils.is_moblab():
+        # Create fake '/etc/chrome-infra/ts-mon.json' if it doesn't exist.
+        create_key_script = os.path.join(
+                RESULT_PATH, CREATE_FAKE_TS_MON_CONFIG_SCRIPT)
+        with open(create_key_script, 'w') as script:
+            script.write(CREATE_FAKE_TS_MON_CONFIG_SCRIPT_CONTENT)
+        container_result_path = lxc.RESULT_DIR_FMT % TEST_JOB_FOLDER
+        container_create_key_script = os.path.join(
+                container_result_path, CREATE_FAKE_TS_MON_CONFIG_SCRIPT)
+        container.attach_run('python %s' % container_create_key_script)
+
     return container
 
 
@@ -146,7 +239,10 @@
                  'from the host running the container..')
     host_test_script = os.path.join(RESULT_PATH, TEST_SCRIPT)
     with open(host_test_script, 'w') as script:
-        script.write(TEST_SCRIPT_CONTENT)
+        if utils.is_moblab():
+            script.write(TEST_SCRIPT_CONTENT)
+        else:
+            script.write(TEST_SCRIPT_CONTENT + TEST_SCRIPT_CONTENT_TS_MON)
 
     container_result_path = lxc.RESULT_DIR_FMT % TEST_JOB_FOLDER
     container_test_script = os.path.join(container_result_path, TEST_SCRIPT)