xref: /aosp_15_r20/tools/external_updater/test_updater_utils.py (revision 3c875a214f382db1236d28570d1304ce57138f32)
1*3c875a21SAndroid Build Coastguard Worker#
2*3c875a21SAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project
3*3c875a21SAndroid Build Coastguard Worker#
4*3c875a21SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*3c875a21SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*3c875a21SAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*3c875a21SAndroid Build Coastguard Worker#
8*3c875a21SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*3c875a21SAndroid Build Coastguard Worker#
10*3c875a21SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*3c875a21SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*3c875a21SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*3c875a21SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*3c875a21SAndroid Build Coastguard Worker# limitations under the License.
15*3c875a21SAndroid Build Coastguard Worker#
16*3c875a21SAndroid Build Coastguard Workerimport unittest
17*3c875a21SAndroid Build Coastguard Worker
18*3c875a21SAndroid Build Coastguard Workerimport updater_utils
19*3c875a21SAndroid Build Coastguard Worker
20*3c875a21SAndroid Build Coastguard Worker
21*3c875a21SAndroid Build Coastguard Workerclass GetLatestVersionTest(unittest.TestCase):
22*3c875a21SAndroid Build Coastguard Worker    """Tests for updater_utils.get_latest_stable_release_tag.
23*3c875a21SAndroid Build Coastguard Worker
24*3c875a21SAndroid Build Coastguard Worker    We don't care which branch a tag belongs to because we look for the latest
25*3c875a21SAndroid Build Coastguard Worker    tag in a list of all references of a remote repository.
26*3c875a21SAndroid Build Coastguard Worker    """
27*3c875a21SAndroid Build Coastguard Worker    def test_float_sort(self) -> None:
28*3c875a21SAndroid Build Coastguard Worker        """ Tests if updater_utils.get_latest_stable_release_tag return the latest tag.
29*3c875a21SAndroid Build Coastguard Worker
30*3c875a21SAndroid Build Coastguard Worker        This is the most common case where tags are in lexicographical order.
31*3c875a21SAndroid Build Coastguard Worker        """
32*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
33*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v1.0.0", ["v1.0.0", "v2.0.0"]), "v2.0.0")
34*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
35*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("1.10", ["1.10", "1.2"]), "1.10")
36*3c875a21SAndroid Build Coastguard Worker
37*3c875a21SAndroid Build Coastguard Worker    def test_mixed_tag(self) -> None:
38*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
39*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("1.0", ["1.0", "foobar"]), "1.0")
40*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
41*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("1.0", ["1.0", "v1.1"]), "1.0")
42*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
43*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v1.0", ["v1.0", "1.1"]), "v1.0")
44*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
45*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("1.0", ["1.0", "v1.0"]), "1.0")
46*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
47*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v3.11.4", ["v3.11.4", "v3.12.2", "v3.13.0a4"]), "v3.12.2")
48*3c875a21SAndroid Build Coastguard Worker
49*3c875a21SAndroid Build Coastguard Worker    def test_non_release_prefix(self) -> None:
50*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
51*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v32.1.3", ["v32.1.3", "v33.0.0", "failureaccess-v1.0.2"]), "v33.0.0")
52*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
53*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("1.0", ["1.0", "test-1.1 "]), "1.0")
54*3c875a21SAndroid Build Coastguard Worker
55*3c875a21SAndroid Build Coastguard Worker    def test_reject_rc_tags(self) -> None:
56*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
57*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v3.27.0", ["v3.27.0", "v3.28.0-rc1"]), "v3.27.0")
58*3c875a21SAndroid Build Coastguard Worker
59*3c875a21SAndroid Build Coastguard Worker    def test_ndk_scheme(self) -> None:
60*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
61*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("r26", ["r26", "r27"]), "r27")
62*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
63*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("r26", ["r26", "r26-beta1"]), "r26")
64*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
65*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("r26", ["r26", "r27-beta1"]), "r26")
66*3c875a21SAndroid Build Coastguard Worker
67*3c875a21SAndroid Build Coastguard Worker    @unittest.expectedFailure
68*3c875a21SAndroid Build Coastguard Worker    def test_ndk_scheme_fail(self) -> None:
69*3c875a21SAndroid Build Coastguard Worker        # The actual latest tag is r26b but since r26b doesn't match the pattern
70*3c875a21SAndroid Build Coastguard Worker        # of current tag, get_latest_stable_release_tag returns r26. Although
71*3c875a21SAndroid Build Coastguard Worker        # get_latest_stable_release_tag doesn't return the answer we are looking
72*3c875a21SAndroid Build Coastguard Worker        # for, we're going to keep this test case anyway.
73*3c875a21SAndroid Build Coastguard Worker        self.assertEqual(
74*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("r26", ["r26", "r26b"]), "r26b")
75*3c875a21SAndroid Build Coastguard Worker
76*3c875a21SAndroid Build Coastguard Worker    def test_no_tags(self) -> None:
77*3c875a21SAndroid Build Coastguard Worker        """Tests that an error is raised when there are no tags."""
78*3c875a21SAndroid Build Coastguard Worker        with self.assertRaises(ValueError):
79*3c875a21SAndroid Build Coastguard Worker            updater_utils.get_latest_stable_release_tag("v1.0.0", [])
80*3c875a21SAndroid Build Coastguard Worker
81*3c875a21SAndroid Build Coastguard Worker
82*3c875a21SAndroid Build Coastguard Workerif __name__ == "__main__":
83*3c875a21SAndroid Build Coastguard Worker    unittest.main(verbosity=2)
84