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