| # Copyright 2016 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Unit tests for git_metrics.""" | |
| # pylint: disable=protected-access | |
| from __future__ import absolute_import | |
| import os | |
| import subprocess | |
| from unittest import mock | |
| from chromite.lib import cros_test_lib | |
| from chromite.lib import osutils | |
| from chromite.scripts.sysmon import git_metrics | |
| class TestGitMetricCollector(cros_test_lib.TestCase): | |
| """Tests for _GitMetricCollector.""" | |
| def setUp(self): | |
| patcher = mock.patch( | |
| "chromite.third_party.infra_libs.ts_mon.common.interface.state." | |
| "store", | |
| autospec=True, | |
| ) | |
| self.store = patcher.start() | |
| self.addCleanup(patcher.stop) | |
| def test_collect(self): | |
| with mock.patch.object( | |
| git_metrics, "_GitRepo", autospec=True | |
| ) as _GitRepo: | |
| instance = _GitRepo("stub") | |
| instance.get_commit_hash.return_value = ( | |
| "2b1ce059425edc91e013c260e59019195f927a07" | |
| ) | |
| instance.get_commit_time.return_value = 1483257600 | |
| instance.get_unstaged_changes.return_value = (0, 3) | |
| collector = git_metrics._GitMetricCollector("~/solciel", "stub") | |
| collector.collect() | |
| setter = self.store.set | |
| calls = [ | |
| mock.call( | |
| "git/hash", | |
| ("~/solciel",), | |
| None, | |
| "2b1ce059425edc91e013c260e59019195f927a07", | |
| enforce_ge=mock.ANY, | |
| ), | |
| mock.call( | |
| "git/timestamp", | |
| ("~/solciel",), | |
| None, | |
| 1483257600, | |
| enforce_ge=mock.ANY, | |
| ), | |
| mock.call( | |
| "git/unstaged_changes", | |
| ("added", "~/solciel"), | |
| None, | |
| 0, | |
| enforce_ge=mock.ANY, | |
| ), | |
| mock.call( | |
| "git/unstaged_changes", | |
| ("deleted", "~/solciel"), | |
| None, | |
| 3, | |
| enforce_ge=mock.ANY, | |
| ), | |
| ] | |
| setter.assert_has_calls(calls) | |
| self.assertEqual(len(setter.mock_calls), len(calls)) | |
| class TestGitRepoWithTempdir(cros_test_lib.TempDirTestCase): | |
| """Tests for _GitRepo using a Git fixture.""" | |
| def setUp(self): | |
| self.git_dir = os.path.join(self.tempdir, ".git") | |
| def call(args, **kwargs): | |
| subprocess.check_call( | |
| args, | |
| stdout=subprocess.DEVNULL, | |
| stderr=subprocess.DEVNULL, | |
| **kwargs, | |
| ) | |
| with osutils.ChdirContext(self.tempdir): | |
| call(["git", "init"]) | |
| call(["git", "config", "user.name", "John Doe"]) | |
| call(["git", "config", "user.email", "john@example.com"]) | |
| osutils.WriteFile("foo", "a\nb\nc\n") | |
| call(["git", "add", "foo"]) | |
| env = os.environ.copy() | |
| env["GIT_AUTHOR_DATE"] = "2017-01-01T00:00:00Z" | |
| env["GIT_COMMITTER_DATE"] = "2017-01-01T00:00:00Z" | |
| call(["git", "commit", "-m", "Initial commit"], env=env) | |
| def test_get_commit_hash(self): | |
| """Test get_commit_hash().""" | |
| repo = git_metrics._GitRepo(self.git_dir) | |
| got = repo.get_commit_hash() | |
| self.assertEqual(got, "7c88f131e520e8455e2403b88ff4f723758c5dd6") | |
| def test_get_commit_time(self): | |
| """Test get_commit_time().""" | |
| repo = git_metrics._GitRepo(self.git_dir) | |
| got = repo.get_commit_time() | |
| self.assertEqual(got, 1483228800) | |
| def test_get_unstaged_changes(self): | |
| """Test get_unstaged_changes().""" | |
| (self.tempdir / "spam").write_text("a\n", encoding="utf-8") | |
| os.remove(os.path.join(self.tempdir, "foo")) | |
| repo = git_metrics._GitRepo(self.git_dir) | |
| added, removed = repo.get_unstaged_changes() | |
| self.assertEqual(added, 0) # Does not count untracked files | |
| self.assertEqual(removed, 3) |