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