| # 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) |