| """Tests for get_latest_build.""" |
| import unittest |
| |
| from build import get_latest_build |
| from gunittest import gtestcase |
| |
| from unittest import mock |
| |
| |
| class GetLatestBuildTest(gtestcase.GTestCase): |
| |
| def setUp(self): |
| self._orig_get_builds = get_latest_build.GetBuildsListByFlavor |
| self._orig_execute = get_latest_build._Execute |
| |
| def tearDown(self): |
| get_latest_build.GetBuildsListByFlavor = self._orig_get_builds |
| get_latest_build._Execute = self._orig_execute |
| |
| def testToBuildNumber(self): |
| """Ensures build numbers can be parsed.""" |
| self.assertEqual( |
| get_latest_build.ToBuildNumber( |
| 'gs://gtv-te/internal/gtv-3.0/cosmo-tests/32908/' |
| 'cosmo-tests-32908.zip'), |
| '32908') |
| self.assertEqual( |
| get_latest_build.ToBuildNumber( |
| 'gs://gtv-te/internal/gtv-3.0/cosmo-eng/1234/' |
| 'cosmo-eng-1234.zip'), |
| '1234') |
| |
| def testGetLatestBuild(self): |
| """Ensures the latest build is returned.""" |
| fmt = ('gs://gtv-eureka/internal/unfork_m37/anchovy-{1}/{0}' |
| '/anchovy-ota-{0}.zip') |
| |
| get_latest_build.FLAGS = mock.Mock(test_identifier='', |
| use_unit_test_hint=False, |
| claim_unit_test_hint=False) |
| mock_build_output = { |
| 'eng': [fmt.format(i, 'eng') for i in range(18307, 183012, 2)], |
| 'user': [fmt.format(i, 'user') for i in [18304, 18305, 18307, 18309]] |
| } |
| get_latest_build.GetBuildsListByFlavor = ( |
| lambda *args: mock_build_output.get(args[3])) |
| get_latest_build._Execute = mock.Mock( |
| side_effect=get_latest_build.GOOD_BUILD_MARKER) |
| get_latest_build.GetBuildNumberWithMarker = lambda x, *_, **__: str(max(x)) |
| self.assertEqual( |
| get_latest_build.GetLatestBuildNumber('', 'unfork_m37', 'anchovy'), |
| '18309') |
| expected_build = fmt.format(18309, 'user') |
| get_latest_build._Execute = lambda x: expected_build |
| self.assertEqual( |
| get_latest_build.GetBuildPath( |
| '', 'unfork_m37', 'anchovy', '18309', 'ota', 'user', ''), |
| expected_build) |
| |
| def testExecute(self): |
| """Ensures execute works.""" |
| self.assertEqual('foo bar\n', get_latest_build._Execute('echo foo bar')) |
| |
| def testGetListCmd(self): |
| """Ensures the correct list command is built.""" |
| kwargs = { |
| 'product': 'anchovy', |
| 'build_output_type': 'w', |
| 'board_type': 'x', |
| 'branch': 'y', |
| 'flavor': 'z' |
| } |
| |
| self.assertEqual( |
| get_latest_build.GetListBuildsCommand(**kwargs), |
| ('gsutil ls gs://gtv-eureka/internal/y/anchovy-z/[0-9]*/' |
| 'anchovy-w-x-[0-9]*.zip')) |
| kwargs['build_number'] = 'A' |
| self.assertEqual( |
| get_latest_build.GetListBuildsCommand(**kwargs), |
| 'gsutil ls gs://gtv-eureka/internal/y/anchovy-z/A/anchovy-w-x-A.zip') |
| kwargs['build_output_type'] = 'fct' |
| self.assertEqual( |
| get_latest_build.GetListBuildsCommand(**kwargs), |
| 'gsutil ls gs://gtv-eureka/internal/y/anchovy-z/A/factory/' |
| 'anchovy-fct-x-A.zip') |
| |
| |
| class GetBuildNumberWithMarkerTest(gtestcase.GTestCase): |
| """Tests for the GetBuildNumberWithMarker() function.""" |
| |
| def _TestBuildNumberWithMarker( |
| self, build_numbers, expected_build, build_selection_policy, |
| build_marked_mock=None, build_tested_mock=None): |
| """Helper to test GetBuildNumberWithMarker().""" |
| if build_marked_mock: |
| get_latest_build._IsBuildMarked = build_marked_mock |
| if build_tested_mock: |
| get_latest_build._IsBuildTested = build_tested_mock |
| latest_build = get_latest_build.GetBuildNumberWithMarker( |
| build_numbers, 'MOCK_COMMAND_PATTERN', |
| has_been_tested_cmd='MOCK_TESTED_COMMAND', |
| build_selection_policy=build_selection_policy) |
| self.assertEqual(expected_build, latest_build) |
| |
| def testBacktrackThenLatestPolicy(self): |
| """Tests the first untested build is returned.""" |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '1', get_latest_build.BACKTRACK_THEN_LATEST, |
| lambda *_: True, mock.Mock(side_effect=[True, True, False])) |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '3', get_latest_build.BACKTRACK_THEN_LATEST, |
| lambda *_: True, lambda *_: True) |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '0', get_latest_build.BACKTRACK_THEN_LATEST, |
| lambda *_: False) |
| |
| def testBacktrackOnlyPolicy(self): |
| """Tests that no build is returned when the flag is not specified.""" |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '0', get_latest_build.ONLY_BACKTRACK, |
| lambda *_: True, lambda *_: True) |
| self._TestBuildNumberWithMarker( |
| [1, 2, 3], '1', get_latest_build.ONLY_BACKTRACK, |
| lambda *_: True, mock.Mock(side_effect=[True, True, False])) |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '0', get_latest_build.BACKTRACK_THEN_LATEST, |
| lambda *_: False) |
| |
| def testAlwaysLatestPolicy(self): |
| """Tests the always return latest policy.""" |
| self._TestBuildNumberWithMarker( |
| [1, 2, 3], '3', get_latest_build.ALWAYS_USE_LATEST, |
| lambda *_: True, lambda *_: False) |
| self._TestBuildNumberWithMarker( |
| [1, 2, 3], '3', get_latest_build.ALWAYS_USE_LATEST, |
| lambda *_: True, lambda *_: True) |
| self._TestBuildNumberWithMarker( |
| [3, 2, 1], '0', get_latest_build.ALWAYS_USE_LATEST, |
| lambda *_: False) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |