blob: 71c4492acfb9a9d3c99007dc2c10e2f92d8a8d72 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# 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
from __future__ import print_function
import os
import subprocess
import sys
import mock
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.scripts.sysmon import git_metrics
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
class TestGitMetricCollector(cros_test_lib.TestCase):
"""Tests for _GitMetricCollector."""
def setUp(self):
patcher = mock.patch('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('dummy')
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', 'dummy')
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')
devnull = open(os.devnull, 'w')
self.addCleanup(devnull.close)
def call(args, **kwargs):
subprocess.check_call(args, stdout=devnull, stderr=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'])
with open('foo', 'w') as f:
f.write('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()."""
with open(os.path.join(self.tempdir, 'spam'), 'w') as f:
f.write('a\n')
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)