From 1d2e99d0289a36e8c2a53ff3bf5690f0f780ba63 Mon Sep 17 00:00:00 2001 From: Gavin Mak Date: Sat, 22 Jul 2023 02:56:44 +0000 Subject: sync: Track last completed fetch/checkout Save the latest time any project is fetched and checked out. This will be used to detect partial checkouts. Bug: b/286126621 Change-Id: I53b264dc70ba168d506076dbd693ef79a696b61d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/380514 Commit-Queue: Gavin Mak Reviewed-by: Joanna Wang Tested-by: Gavin Mak --- tests/test_subcmds_sync.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'tests/test_subcmds_sync.py') diff --git a/tests/test_subcmds_sync.py b/tests/test_subcmds_sync.py index 5c8e606e..057478ef 100644 --- a/tests/test_subcmds_sync.py +++ b/tests/test_subcmds_sync.py @@ -14,6 +14,8 @@ """Unittests for the subcmds/sync.py module.""" import os +import shutil +import tempfile import unittest from unittest import mock @@ -104,6 +106,79 @@ def test_cli_jobs(argv, jobs_manifest, jobs, jobs_net, jobs_check): assert opts.jobs_checkout == jobs_check +class LocalSyncState(unittest.TestCase): + """Tests for _LocalSyncState.""" + + _TIME = 10 + + def setUp(self): + """Common setup.""" + self.repodir = tempfile.mkdtemp(".repo") + self.manifest = mock.MagicMock( + repodir=self.repodir, + ) + self.state = self._new_state() + + def tearDown(self): + """Common teardown.""" + shutil.rmtree(self.repodir) + + def _new_state(self): + with mock.patch("time.time", return_value=self._TIME): + return sync._LocalSyncState(self.manifest) + + def test_set(self): + """Times are set.""" + p = mock.MagicMock(relpath="projA") + self.state.SetFetchTime(p) + self.state.SetCheckoutTime(p) + self.assertEqual(self.state.GetFetchTime(p), self._TIME) + self.assertEqual(self.state.GetCheckoutTime(p), self._TIME) + + def test_update(self): + """Times are updated.""" + with open(self.state._path, "w") as f: + f.write( + """ + { + "projB": { + "last_fetch": 5, + "last_checkout": 7 + } + } + """ + ) + + # Initialize state to read from the new file. + self.state = self._new_state() + projA = mock.MagicMock(relpath="projA") + projB = mock.MagicMock(relpath="projB") + self.assertEqual(self.state.GetFetchTime(projA), None) + self.assertEqual(self.state.GetFetchTime(projB), 5) + self.assertEqual(self.state.GetCheckoutTime(projB), 7) + + self.state.SetFetchTime(projA) + self.state.SetFetchTime(projB) + self.assertEqual(self.state.GetFetchTime(projA), self._TIME) + self.assertEqual(self.state.GetFetchTime(projB), self._TIME) + self.assertEqual(self.state.GetCheckoutTime(projB), 7) + + def test_save_to_file(self): + """Data is saved under repodir.""" + p = mock.MagicMock(relpath="projA") + self.state.SetFetchTime(p) + self.state.Save() + self.assertEqual( + os.listdir(self.repodir), [".repo_localsyncstate.json"] + ) + + def test_nonexistent_project(self): + """Unsaved projects don't have data.""" + p = mock.MagicMock(relpath="projC") + self.assertEqual(self.state.GetFetchTime(p), None) + self.assertEqual(self.state.GetCheckoutTime(p), None) + + class GetPreciousObjectsState(unittest.TestCase): """Tests for _GetPreciousObjectsState.""" -- cgit v1.2.3-54-g00ecf