blob: b293abdeab451b922ae6e841575512d7eacf1b3f [file] [log] [blame]
# Copyright 2017 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for upload_goma_info.py"""
import collections
import datetime
import getpass
import json
import os
import time
from chromite.cbuildbot import goma_util
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import gs
from chromite.lib import osutils
class TestGomaLogUploader(cros_test_lib.MockTempDirTestCase):
"""Tests for upload_goma_info."""
def setUp(self):
# cros_build_lib.CreateTarball() function is unit tested. Safe to patch.
# pylint: disable=unused-argument
def _createTarball(tarball_path, *args, **kwargs):
osutils.Touch(tarball_path, makedirs=True)
self.tarball_mock = self.PatchObject(
cros_build_lib, "CreateTarball", side_effect=_createTarball
)
def _CreateLogFile(self, name, timestamp):
path = os.path.join(
self.tempdir,
"%s.host.log.INFO.%s"
% (name, timestamp.strftime("%Y%m%d-%H%M%S.%f")),
)
osutils.WriteFile(
path, timestamp.strftime("Log file created at: %Y/%m/%d %H:%M:%S")
)
def testUpload(self):
self._CreateLogFile(
"compiler_proxy", datetime.datetime(2017, 4, 26, 12, 0, 0)
)
self._CreateLogFile(
"compiler_proxy-subproc", datetime.datetime(2017, 4, 26, 12, 0, 0)
)
self._CreateLogFile("gomacc", datetime.datetime(2017, 4, 26, 12, 1, 0))
self._CreateLogFile("gomacc", datetime.datetime(2017, 4, 26, 12, 2, 0))
# Set env vars.
os.environ.update(
{
"GLOG_log_dir": str(self.tempdir),
"BUILDBOT_BUILDERNAME": "builder-name",
"BUILDBOT_MASTERNAME": "master-name",
"BUILDBOT_SLAVENAME": "slave-name",
"BUILDBOT_CLOBBER": "1",
}
)
self.PatchObject(
cros_build_lib, "GetHostName", lambda: "stub-host-name"
)
copy_log = []
self.PatchObject(
gs.GSContext,
"CopyInto",
lambda _, __, remote_dir, filename=None, **kwargs: copy_log.append(
(remote_dir, filename, kwargs.get("headers"))
),
)
goma_util.GomaLogUploader(
self.tempdir,
today=datetime.date(2017, 4, 26),
dry_run=True,
cbb_config_name="test_config",
).Upload()
expect_builderinfo = json.dumps(
collections.OrderedDict(
[
("builder", "builder-name"),
("master", "master-name"),
("slave", "slave-name"),
("clobber", True),
("os", "chromeos"),
("is_luci", False),
("cbb_config_name", "test_config"),
]
)
)
self.assertEqual(
copy_log,
[
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"compiler_proxy-subproc.host.log.INFO.20170426-120000.000000.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"compiler_proxy.host.log.INFO.20170426-120000.000000.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"gomacc.host.log.INFO.20170426-120100.000000.tar.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
],
)
self.tarball_mock.assert_called_once()
def testUploadLuci(self):
self._CreateLogFile(
"compiler_proxy", datetime.datetime(2017, 4, 26, 12, 0, 0)
)
self._CreateLogFile(
"compiler_proxy-subproc", datetime.datetime(2017, 4, 26, 12, 0, 0)
)
self._CreateLogFile("gomacc", datetime.datetime(2017, 4, 26, 12, 1, 0))
self._CreateLogFile("gomacc", datetime.datetime(2017, 4, 26, 12, 2, 0))
# Set env vars.
envs = (
"BUILDBOT_BUILDERNAME",
"BUILDBOT_MASTERNAME",
"BUILDBOT_SLAVENAME",
"BUILDBOT_CLOBBER",
)
for env in envs:
if env in os.environ:
del os.environ[env]
os.environ.update(
{
"GLOG_log_dir": str(self.tempdir),
}
)
self.PatchObject(
cros_build_lib, "GetHostName", lambda: "stub-host-name"
)
copy_log = []
self.PatchObject(
gs.GSContext,
"CopyInto",
lambda _, __, remote_dir, filename=None, **kwargs: copy_log.append(
(remote_dir, filename, kwargs.get("headers"))
),
)
goma_util.GomaLogUploader(
self.tempdir,
today=datetime.date(2017, 4, 26),
dry_run=True,
cbb_config_name="test_config",
).Upload()
builderinfo = collections.OrderedDict(
[
("builder", ""),
("master", ""),
("slave", ""),
("clobber", False),
("os", "chromeos"),
("is_luci", True),
("cbb_config_name", "test_config"),
]
)
builderinfo["builder_id"] = collections.OrderedDict(
[
("project", "chromeos"),
("builder", "Prod"),
("bucket", "general"),
]
)
expect_builderinfo = json.dumps(builderinfo)
self.assertEqual(
copy_log,
[
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"compiler_proxy-subproc.host.log.INFO.20170426-120000.000000.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"compiler_proxy.host.log.INFO.20170426-120000.000000.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
(
"gs://chrome-goma-log/2017/04/26/stub-host-name",
"gomacc.host.log.INFO.20170426-120100.000000.tar.gz",
["x-goog-meta-builderinfo:" + expect_builderinfo],
),
],
)
self.tarball_mock.assert_called_once()
def testNinjaLogUpload(self):
self._CreateLogFile(
"compiler_proxy", datetime.datetime(2017, 8, 21, 12, 0, 0)
)
self._CreateLogFile(
"compiler_proxy-subproc", datetime.datetime(2017, 8, 21, 12, 0, 0)
)
ninja_log_path = os.path.join(self.tempdir, "ninja_log")
osutils.WriteFile(ninja_log_path, "Ninja Log Content\n")
timestamp = datetime.datetime(2017, 8, 21, 12, 0, 0)
mtime = time.mktime(timestamp.timetuple())
os.utime(ninja_log_path, ((time.time(), mtime)))
osutils.WriteFile(
os.path.join(self.tempdir, "ninja_command"), "ninja_command"
)
osutils.WriteFile(os.path.join(self.tempdir, "ninja_cwd"), "ninja_cwd")
osutils.WriteFile(
os.path.join(self.tempdir, "ninja_env"),
"key1=value1\0key2=value2\0",
)
osutils.WriteFile(os.path.join(self.tempdir, "ninja_exit"), "0")
self.PatchObject(
cros_build_lib, "GetHostName", lambda: "stub-host-name"
)
copy_log = []
self.PatchObject(
gs.GSContext,
"CopyInto",
lambda _, __, remote_dir, filename=None, **kwargs: copy_log.append(
(remote_dir, filename)
),
)
goma_util.GomaLogUploader(
self.tempdir, today=datetime.date(2017, 8, 21), dry_run=True
).Upload()
username = getpass.getuser()
pid = os.getpid()
upload_filename = "ninja_log.%s.stub-host-name.20170821-120000.%d" % (
username,
pid,
)
self.assertEqual(
copy_log,
[
(
"gs://chrome-goma-log/2017/08/21/stub-host-name",
"compiler_proxy-subproc.host.log.INFO.20170821-120000.000000.gz",
),
(
"gs://chrome-goma-log/2017/08/21/stub-host-name",
"compiler_proxy.host.log.INFO.20170821-120000.000000.gz",
),
(
"gs://chrome-goma-log/2017/08/21/stub-host-name",
upload_filename + ".gz",
),
],
)
# Verify content of ninja_log file.
ninja_log_content = osutils.ReadFile(
os.path.join(self.tempdir, upload_filename)
)
content, eof, metadata_json = ninja_log_content.split("\n", 3)
self.assertEqual("Ninja Log Content", content)
self.assertEqual("# end of ninja log", eof)
metadata = json.loads(metadata_json)
self.assertEqual(
metadata,
{
"platform": "chromeos",
"cmdline": ["ninja_command"],
"cwd": "ninja_cwd",
"exit": 0,
"env": {"key1": "value1", "key2": "value2"},
"compiler_proxy_info": "compiler_proxy.host.log.INFO.20170821-120000.000000",
},
)