xref: /aosp_15_r20/tools/external_updater/tests/endtoend/test_check.py (revision 3c875a214f382db1236d28570d1304ce57138f32)
1*3c875a21SAndroid Build Coastguard Worker#
2*3c875a21SAndroid Build Coastguard Worker# Copyright (C) 2023 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 TestCheck:
24*3c875a21SAndroid Build Coastguard Worker    """Tests for `external_updater check`."""
25*3c875a21SAndroid Build Coastguard Worker
26*3c875a21SAndroid Build Coastguard Worker    def check(self, updater_cmd: list[str], paths: list[Path]) -> str:
27*3c875a21SAndroid Build Coastguard Worker        """Runs `external_updater check` with the given arguments.
28*3c875a21SAndroid Build Coastguard Worker
29*3c875a21SAndroid Build Coastguard Worker        Returns:
30*3c875a21SAndroid Build Coastguard Worker            The output of the command.
31*3c875a21SAndroid Build Coastguard Worker        """
32*3c875a21SAndroid Build Coastguard Worker        return subprocess.run(
33*3c875a21SAndroid Build Coastguard Worker            updater_cmd + ["check"] + [str(p) for p in paths],
34*3c875a21SAndroid Build Coastguard Worker            check=True,
35*3c875a21SAndroid Build Coastguard Worker            capture_output=True,
36*3c875a21SAndroid Build Coastguard Worker            text=True,
37*3c875a21SAndroid Build Coastguard Worker        ).stdout
38*3c875a21SAndroid Build Coastguard Worker
39*3c875a21SAndroid Build Coastguard Worker    def test_git_up_to_date(
40*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
41*3c875a21SAndroid Build Coastguard Worker    ) -> None:
42*3c875a21SAndroid Build Coastguard Worker        """Tests that up-to-date projects are identified."""
43*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
44*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
45*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit(
46*3c875a21SAndroid Build Coastguard Worker            "Add README.md.",
47*3c875a21SAndroid Build Coastguard Worker            update_files={
48*3c875a21SAndroid Build Coastguard Worker                "README.md": "Hello, world!\n",
49*3c875a21SAndroid Build Coastguard Worker            },
50*3c875a21SAndroid Build Coastguard Worker        )
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        output = self.check(updater_cmd, [a.local.path])
55*3c875a21SAndroid Build Coastguard Worker        current_version = a.upstream.head()
56*3c875a21SAndroid Build Coastguard Worker        assert output == (
57*3c875a21SAndroid Build Coastguard Worker            f"Checking {a.local.path}...\n"
58*3c875a21SAndroid Build Coastguard Worker            f"Current version: {current_version}\n"
59*3c875a21SAndroid Build Coastguard Worker            f"Latest version: {current_version}\n"
60*3c875a21SAndroid Build Coastguard Worker            "Up to date.\n"
61*3c875a21SAndroid Build Coastguard Worker        )
62*3c875a21SAndroid Build Coastguard Worker
63*3c875a21SAndroid Build Coastguard Worker    def test_git_out_of_date(
64*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
65*3c875a21SAndroid Build Coastguard Worker    ) -> None:
66*3c875a21SAndroid Build Coastguard Worker        """Tests that out-of-date projects are identified."""
67*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
68*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
69*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit(
70*3c875a21SAndroid Build Coastguard Worker            "Add README.md.",
71*3c875a21SAndroid Build Coastguard Worker            update_files={
72*3c875a21SAndroid Build Coastguard Worker                "README.md": "Hello, world!\n",
73*3c875a21SAndroid Build Coastguard Worker            },
74*3c875a21SAndroid Build Coastguard Worker        )
75*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
76*3c875a21SAndroid Build Coastguard Worker        a.initial_import()
77*3c875a21SAndroid Build Coastguard Worker        current_version = a.upstream.head()
78*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
79*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit(
80*3c875a21SAndroid Build Coastguard Worker            "Update the project.",
81*3c875a21SAndroid Build Coastguard Worker            update_files={"README.md": "This project is deprecated.\n"},
82*3c875a21SAndroid Build Coastguard Worker        )
83*3c875a21SAndroid Build Coastguard Worker        output = self.check(updater_cmd, [a.local.path])
84*3c875a21SAndroid Build Coastguard Worker        latest_version = a.upstream.head()
85*3c875a21SAndroid Build Coastguard Worker        assert output == (
86*3c875a21SAndroid Build Coastguard Worker            f"Checking {a.local.path}...\n"
87*3c875a21SAndroid Build Coastguard Worker            f"Current version: {current_version}\n"
88*3c875a21SAndroid Build Coastguard Worker            f"Latest version: {latest_version}\n"
89*3c875a21SAndroid Build Coastguard Worker            "Out of date!\n"
90*3c875a21SAndroid Build Coastguard Worker        )
91*3c875a21SAndroid Build Coastguard Worker
92*3c875a21SAndroid Build Coastguard Worker    def test_not_suggest_tag_that_is_not_on_any_branch(
93*3c875a21SAndroid Build Coastguard Worker        self, tree_builder: TreeBuilder, updater_cmd: list[str]
94*3c875a21SAndroid Build Coastguard Worker    ) -> None:
95*3c875a21SAndroid Build Coastguard Worker        """Tests that out-of-date projects are identified."""
96*3c875a21SAndroid Build Coastguard Worker        tree = tree_builder.repo_tree("tree")
97*3c875a21SAndroid Build Coastguard Worker        a = tree.project("platform/external/foo", "external/foo")
98*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Initial commit.", allow_empty=True)
99*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v1.0.0")
100*3c875a21SAndroid Build Coastguard Worker        tree.create_manifest_repo()
101*3c875a21SAndroid Build Coastguard Worker        a.initial_import(True)
102*3c875a21SAndroid Build Coastguard Worker        tree.init_and_sync()
103*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Second commit.", allow_empty=True)
104*3c875a21SAndroid Build Coastguard Worker        a.upstream.switch_to_new_branch("new_branch")
105*3c875a21SAndroid Build Coastguard Worker        a.upstream.commit("Third commit.", allow_empty=True)
106*3c875a21SAndroid Build Coastguard Worker        a.upstream.tag("v2.0.0")
107*3c875a21SAndroid Build Coastguard Worker        a.upstream.checkout("main")
108*3c875a21SAndroid Build Coastguard Worker        a.upstream.delete_branch("new_branch")
109*3c875a21SAndroid Build Coastguard Worker        output = self.check(updater_cmd, [a.local.path])
110*3c875a21SAndroid Build Coastguard Worker        assert "Latest version: Not available" in output
111