blob: 20de6226cec37f07eb3e1f6bdfd1c3f24dafc83e [file] [log] [blame]
# Copyright 2019 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 the uprev_frequency script."""
import datetime
from unittest import mock
from chromite.contrib import uprev_frequency
from chromite.lib import cros_test_lib
from chromite.lib import git
from chromite.scripts import cros_mark_as_stable
class GetDirectoryCommitsTest(cros_test_lib.MockTestCase):
"""Unit tests for get_directory_commits."""
def testNoOutput(self) -> None:
"""Test get_directory_commits doesn't explode when log has no output."""
self.PatchObject(git, "Log", return_value="")
self.assertFalse(uprev_frequency.get_directory_commits("foo/bar"))
def testGitLogCalledCorrectly(self) -> None:
"""Test get_directory_commits calls git.Log with correct arguments."""
start_date = datetime.datetime.strptime(
"1996-01-01", uprev_frequency.DATE_FORMAT
)
end_date = datetime.datetime.strptime(
"1997-01-01", uprev_frequency.DATE_FORMAT
)
log = self.PatchObject(git, "Log", return_value="")
uprev_frequency.get_directory_commits(
"foo/bar", start_date=start_date, end_date=end_date
)
self.assertEqual(
log.call_args_list,
[
mock.call(
"foo/bar",
format='format:"%h|%cd|%s"',
after="1996-01-01",
until="1997-01-01",
reverse=True,
date="unix",
paths=["foo/bar"],
)
],
)
def testCommitParsing(self) -> None:
"""Test get_directory_commits when log outputs commits."""
log_lines = [
"abc|123|foo",
"def|456|bar",
]
log_output = "\n".join(log_lines)
self.PatchObject(git, "Log", return_value=log_output)
commits = uprev_frequency.get_directory_commits("foo/bar")
self.assertEqual(
commits,
[
uprev_frequency.Commit("abc", "123", "foo"),
uprev_frequency.Commit("def", "456", "bar"),
],
)
class GetUprevCommitsTest(cros_test_lib.TestCase):
"""Unit tests for get_uprev_commits."""
def testEmptyInput(self) -> None:
"""Test get_uprev_commits does not explode on empty list."""
self.assertFalse(uprev_frequency.get_uprev_commits([]))
def testMixed(self) -> None:
"""Test get_uprev_commits with mixed input."""
uprev_commit = uprev_frequency.Commit(
"abc", "123", cros_mark_as_stable.GIT_COMMIT_SUBJECT
)
commits = [
uprev_commit,
uprev_frequency.Commit("def", "456", "not an uprev commit"),
]
self.assertEqual(
uprev_frequency.get_uprev_commits(commits), [uprev_commit]
)
class GetCommitTimestampsTest(cros_test_lib.TestCase):
"""Unit tests for get_commit_timestamps."""
def testMalformed(self) -> None:
"""Test get_commit_timestamps explodes on malformed timestamp."""
self.assertRaises(
ValueError,
uprev_frequency.get_commit_timestamps,
[uprev_frequency.Commit("abc", "bad-timestamp", "foo")],
)
def testBasic(self) -> None:
"""Test get_commit_timestamps works with good timestamps."""
commits = [
uprev_frequency.Commit("abc", "123", "foo"),
uprev_frequency.Commit("def", "456", "bar"),
]
timestamps = uprev_frequency.get_commit_timestamps(commits)
self.assertEqual(timestamps, [123, 456])
class GetAverageTimestampDeltaDaysTest(cros_test_lib.TestCase):
"""Unit tests for get_average_timestamp_delta_days."""
def testEmptyInput(self) -> None:
"""Test get_average_timestamp_delta_days dies on empty input."""
self.assertRaises(
ValueError, uprev_frequency.get_average_timestamp_delta_days, []
)
def testOneTimestampInput(self) -> None:
"""Test get_average_timestamp_delta_days dies on single timestamp."""
self.assertRaises(
ValueError, uprev_frequency.get_average_timestamp_delta_days, [1]
)
def testMultipleTimestampsInput(self) -> None:
"""Test get_average_timestamp_delta_days computes correct avg delta."""
timestamps = [
1 * uprev_frequency.SECONDS_PER_DAY,
3 * uprev_frequency.SECONDS_PER_DAY,
5 * uprev_frequency.SECONDS_PER_DAY,
]
average_delta = uprev_frequency.get_average_timestamp_delta_days(
timestamps
)
self.assertEqual(average_delta, 2)