xref: /aosp_15_r20/tools/external_updater/tests/endtoend/test_update.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 Worker"""End-to-end tests for external_updater."""
17*3c875a21SAndroid Build Coastguard Workerimport subprocess
18*3c875a21SAndroid Build Coastguard Workerfrom pathlib import Path
19*3c875a21SAndroid Build Coastguard Worker
20*3c875a21SAndroid Build Coastguard Workerfrom .treebuilder import TreeBuilder
21*3c875a21SAndroid Build Coastguard Worker
22*3c875a21SAndroid Build Coastguard Worker
23*3c875a21SAndroid Build Coastguard Workerclass TestUpdate:
24*3c875a21SAndroid Build Coastguard Worker
25*3c875a21SAndroid Build Coastguard Worker    def update(
26*3c875a21SAndroid Build Coastguard Worker        self,
27*3c875a21SAndroid Build Coastguard Worker        updater_cmd: list[str],
28*3c875a21SAndroid Build Coastguard Worker        paths: list[Path],
29*3c875a21SAndroid Build Coastguard Worker        args: list[str] | None = None,
30*3c875a21SAndroid Build Coastguard Worker    ) -> str:
31*3c875a21SAndroid Build Coastguard Worker        """Runs `external_updater update` with the given arguments.
32*3c875a21SAndroid Build Coastguard Worker
33*3c875a21SAndroid Build Coastguard Worker        Returns:
34*3c875a21SAndroid Build Coastguard Worker        The output of the command.
35*3c875a21SAndroid Build Coastguard Worker        """
36*3c875a21SAndroid Build Coastguard Worker        return subprocess.run(
37*3c875a21SAndroid Build Coastguard Worker            updater_cmd + ["update"] +
38*3c875a21SAndroid Build Coastguard Worker            (args if args is not None else []) +
39*3c875a21SAndroid Build Coastguard Worker            [str(p) for p in paths],
40*3c875a21SAndroid Build Coastguard Worker            check=True,
41*3c875a21SAndroid Build Coastguard Worker            capture_output=True,
42*3c875a21SAndroid Build Coastguard Worker            text=True,
43*3c875a21SAndroid Build Coastguard Worker        ).stdout
44*3c875a21SAndroid Build Coastguard Worker
45*3c875a21SAndroid Build Coastguard Worker    def test_bug_number(
46*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
47*3c875a21SAndroid Build Coastguard Worker    ) -> None:
48*3c875a21SAndroid Build Coastguard Worker        """Tests that bug number is added to the commit message."""
49*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
50*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
51*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
52*3c875a21SAndroid Build Coastguard Worker        a.initial_import()
53*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
54*3c875a21SAndroid Build Coastguard Worker        bug_number = "12345"
55*3c875a21SAndroid Build Coastguard Worker        self.update(updater_cmd, [a.local.path], args=['--refresh', '--bug', bug_number])
56*3c875a21SAndroid Build Coastguard Worker        latest_sha = a.local.head()
57*3c875a21SAndroid Build Coastguard Worker        latest_commit_message = a.local.commit_message_at_revision(latest_sha)
58*3c875a21SAndroid Build Coastguard Worker        assert f"Bug: {bug_number}" in latest_commit_message
59*3c875a21SAndroid Build Coastguard Worker
60*3c875a21SAndroid Build Coastguard Worker    def test_custom_update_to_tag_successful(
61*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
62*3c875a21SAndroid Build Coastguard Worker    ) -> None:
63*3c875a21SAndroid Build Coastguard Worker        """Tests that upgrade to a specific tag is successful."""
64*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
65*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
66*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Initial commit.", allow_empty=True)
67*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v1.0.0")
68*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
69*3c875a21SAndroid Build Coastguard Worker        a.initial_import(True)
70*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
71*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Second commit.", allow_empty=True)
72*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v2.0.0")
73*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Third commit.", allow_empty=True)
74*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v3.0.0")
75*3c875a21SAndroid Build Coastguard Worker        self.update(updater_cmd, [a.local.path], args=['--custom-version', "v2.0.0"])
76*3c875a21SAndroid Build Coastguard Worker        latest_sha = a.local.head()
77*3c875a21SAndroid Build Coastguard Worker        latest_commit_message = a.local.commit_message_at_revision(latest_sha)
78*3c875a21SAndroid Build Coastguard Worker        assert "Upgrade test to v2.0.0" in latest_commit_message
79*3c875a21SAndroid Build Coastguard Worker
80*3c875a21SAndroid Build Coastguard Worker    def test_custom_downgrade_to_tag_unsuccessful(
81*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
82*3c875a21SAndroid Build Coastguard Worker    ) -> None:
83*3c875a21SAndroid Build Coastguard Worker        """Tests that downgrade to a specific tag is unsuccessful."""
84*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
85*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
86*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Initial commit.", allow_empty=True)
87*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v1.0.0")
88*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Second commit.", allow_empty=True)
89*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v2.0.0")
90*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
91*3c875a21SAndroid Build Coastguard Worker        a.initial_import(True)
92*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
93*3c875a21SAndroid Build Coastguard Worker        self.update(updater_cmd, [a.local.path], args=['--custom-version', "v1.0.0"])
94*3c875a21SAndroid Build Coastguard Worker        latest_sha = a.local.head()
95*3c875a21SAndroid Build Coastguard Worker        latest_commit_message = a.local.commit_message_at_revision(latest_sha)
96*3c875a21SAndroid Build Coastguard Worker        assert "Add metadata files." in latest_commit_message
97*3c875a21SAndroid Build Coastguard Worker
98*3c875a21SAndroid Build Coastguard Worker    def test_custom_update_to_sha_successful(
99*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
100*3c875a21SAndroid Build Coastguard Worker    ) -> None:
101*3c875a21SAndroid Build Coastguard Worker        """Tests that upgrade to a specific sha is successful."""
102*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
103*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
104*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Initial commit.", allow_empty=True)
105*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
106*3c875a21SAndroid Build Coastguard Worker        a.initial_import()
107*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
108*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Second commit.", allow_empty=True)
109*3c875a21SAndroid Build Coastguard Worker        custom_sha = a.upstream.head()
110*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Third commit.", allow_empty=True)
111*3c875a21SAndroid Build Coastguard Worker        self.update(updater_cmd, [a.local.path], args=['--custom-version', custom_sha])
112*3c875a21SAndroid Build Coastguard Worker        latest_sha = a.local.head()
113*3c875a21SAndroid Build Coastguard Worker        latest_commit_message = a.local.commit_message_at_revision(latest_sha)
114*3c875a21SAndroid Build Coastguard Worker        assert f"Upgrade test to {custom_sha}" in latest_commit_message
115*3c875a21SAndroid Build Coastguard Worker
116*3c875a21SAndroid Build Coastguard Worker    def test_custom_downgrade_to_sha_unsuccessful(
117*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
118*3c875a21SAndroid Build Coastguard Worker    ) -> None:
119*3c875a21SAndroid Build Coastguard Worker        """Tests that downgrade to a specific sha is unsuccessful."""
120*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
121*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
122*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Initial commit.", allow_empty=True)
123*3c875a21SAndroid Build Coastguard Worker        custom_sha = a.upstream.head()
124*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Second commit.", allow_empty=True)
125*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
126*3c875a21SAndroid Build Coastguard Worker        a.initial_import()
127*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
128*3c875a21SAndroid Build Coastguard Worker        self.update(updater_cmd, [a.local.path], args=['--custom-version', custom_sha])
129*3c875a21SAndroid Build Coastguard Worker        latest_sha = a.local.head()
130*3c875a21SAndroid Build Coastguard Worker        latest_commit_message = a.local.commit_message_at_revision(latest_sha)
131*3c875a21SAndroid Build Coastguard Worker        assert "Add metadata files." in latest_commit_message
132