|
|
|
|
@@ -1,521 +0,0 @@
|
|
|
|
|
import pytest
|
|
|
|
|
import time
|
|
|
|
|
import re
|
|
|
|
|
from tests.lib.common_test_utils import GiteaAPIClient, vprint
|
|
|
|
|
|
|
|
|
|
# Shared methods
|
|
|
|
|
|
|
|
|
|
def wait_for_staging_bot_reviewer(gitea_env, prj_pr_number, timeout=30):
|
|
|
|
|
"""Wait for staging-bot to be added as a reviewer."""
|
|
|
|
|
for _ in range(timeout):
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
pr_details = gitea_env.get_pr_details("myproducts/mySLFO", prj_pr_number)
|
|
|
|
|
if any(
|
|
|
|
|
r.get("login") == "autogits_obs_staging_bot"
|
|
|
|
|
for r in pr_details.get("requested_reviewers", [])
|
|
|
|
|
):
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def wait_for_comment(gitea_env, repo_full_name, pr_number, text_to_find, subtext=None, timeout=60):
|
|
|
|
|
"""Wait for a specific comment in the PR timeline."""
|
|
|
|
|
vprint(f"Waiting for comment '{text_to_find}'" + (f" with subtext '{subtext}'" if subtext else "") + f" in {repo_full_name} PR #{pr_number}...")
|
|
|
|
|
for _ in range(timeout):
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
try:
|
|
|
|
|
events = gitea_env.get_timeline_events(repo_full_name, pr_number)
|
|
|
|
|
except Exception:
|
|
|
|
|
continue
|
|
|
|
|
for event in events:
|
|
|
|
|
body = event.get("body", "")
|
|
|
|
|
if not body:
|
|
|
|
|
continue
|
|
|
|
|
if subtext:
|
|
|
|
|
if text_to_find in body and subtext in body:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
if text_to_find == body.strip():
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def setup_obs_mock(httpserver, project_name, build_result_handler):
|
|
|
|
|
"""Setup OBS mock handlers."""
|
|
|
|
|
def general_project_meta_handler(request):
|
|
|
|
|
project = request.path.split("/")[2]
|
|
|
|
|
return f'<project name="{project}"><scmsync>http://gitea-test:3000/myproducts/mySLFO.git</scmsync></project>'
|
|
|
|
|
|
|
|
|
|
httpserver.clear()
|
|
|
|
|
httpserver.expect_request(re.compile(r"/source/[^/]+/_meta$"), method="GET").respond_with_handler(general_project_meta_handler)
|
|
|
|
|
httpserver.expect_request(re.compile(f"/build/{project_name}/_result"), method="GET").respond_with_handler(build_result_handler)
|
|
|
|
|
httpserver.expect_request(re.compile(r"/source/[^/]+/_meta$"), method="PUT").respond_with_data("OK")
|
|
|
|
|
httpserver.expect_request(re.compile(r"/source/[^/]+$"), method="DELETE").respond_with_data("OK")
|
|
|
|
|
|
|
|
|
|
def create_build_result_xml(project_name, repo_arch_package_status):
|
|
|
|
|
"""Create the XML response for OBS build results."""
|
|
|
|
|
results_xml = ""
|
|
|
|
|
# Group statuses by (repo, arch)
|
|
|
|
|
grouped = {}
|
|
|
|
|
for (repo, arch, package), (repo_code, pkg_code) in repo_arch_package_status.items():
|
|
|
|
|
if (repo, arch) not in grouped:
|
|
|
|
|
grouped[(repo, arch)] = {"repo_code": repo_code, "packages": []}
|
|
|
|
|
grouped[(repo, arch)]["packages"].append((package, pkg_code))
|
|
|
|
|
|
|
|
|
|
for (repo, arch), data in grouped.items():
|
|
|
|
|
repo_code = data["repo_code"]
|
|
|
|
|
pkg_statuses = "".join([f'\n <status package="{p}" code="{c}"/>' for p, c in data["packages"]])
|
|
|
|
|
results_xml += f"""
|
|
|
|
|
<result project="{project_name}" repository="{repo}" arch="{arch}" code="{repo_code}" state="{repo_code}">{pkg_statuses}
|
|
|
|
|
</result>"""
|
|
|
|
|
return f'<resultlist state="mock">{results_xml}\n</resultlist>'
|
|
|
|
|
|
|
|
|
|
def create_submodule_diff(submodule_name, old_sha, new_sha):
|
|
|
|
|
"""Create a git diff string for updating a submodule commit ID."""
|
|
|
|
|
return f"""diff --git a/{submodule_name} b/{submodule_name}
|
|
|
|
|
index {old_sha[:7]}..{new_sha[:7]} 160000
|
|
|
|
|
--- a/{submodule_name}
|
|
|
|
|
+++ b/{submodule_name}
|
|
|
|
|
@@ -1 +1 @@
|
|
|
|
|
-Subproject commit {old_sha}
|
|
|
|
|
+Subproject commit {new_sha}
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t001
|
|
|
|
|
def test_001_build_on_all_archs_success(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create a package PR.
|
|
|
|
|
diff = "diff --git a/test_br.txt b/test_br.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR PR", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number = pr["number"]
|
|
|
|
|
|
|
|
|
|
# 2. Wait for the workflow-pr bot to create the related project PR.
|
|
|
|
|
prj_pr_number = gitea_env.wait_for_project_pr("mypool/pkgA", pkg_pr_number)
|
|
|
|
|
assert prj_pr_number is not None, "Workflow bot did not create a project PR."
|
|
|
|
|
|
|
|
|
|
# 3. Wait for staging-bot to be added as a reviewer.
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition all to success.
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build successful" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build successful"), "Staging bot did not post 'Build successful' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build successful..." on package PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t002
|
|
|
|
|
def test_002_build_on_all_archs_mix(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create a package PR.
|
|
|
|
|
diff = "diff --git a/test_br_mix.txt b/test_br_mix.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Mix PR", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number = pr["number"]
|
|
|
|
|
|
|
|
|
|
# 2. Wait for the workflow-pr bot to create the related project PR.
|
|
|
|
|
prj_pr_number = gitea_env.wait_for_project_pr("mypool/pkgA", pkg_pr_number)
|
|
|
|
|
assert prj_pr_number is not None, "Workflow bot did not create a project PR."
|
|
|
|
|
|
|
|
|
|
# 3. Wait for staging-bot to be added as a reviewer.
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition the first repository (all architectures) to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[("repo1", a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# 7. Transition the second repository (all architectures) to "finished" mode and set its package statuses to "failed" (e.g., code="failed").
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[("repo2", a, "pkgA")] = ("finished", "failed")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build failed" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build failed"), "Staging bot did not post 'Build failed' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build failed, for more information go in..." on package PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number, "Build failed, for more information go in", project_name), "Staging bot did not post 'Build failed' comment on package PR."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t003
|
|
|
|
|
def test_003_build_on_some_archs_failed(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create a package PR.
|
|
|
|
|
diff = "diff --git a/test_br_some_fail.txt b/test_br_some_fail.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Some Fail PR", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number = pr["number"]
|
|
|
|
|
|
|
|
|
|
# 2. Wait for the workflow-pr bot to create the related project PR.
|
|
|
|
|
prj_pr_number = gitea_env.wait_for_project_pr("mypool/pkgA", pkg_pr_number)
|
|
|
|
|
assert prj_pr_number is not None, "Workflow bot did not create a project PR."
|
|
|
|
|
|
|
|
|
|
# 3. Wait for staging-bot to be added as a reviewer.
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition the first repository (all architectures) to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[("repo1", a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# 7. Transition the second repository to "finished" mode, setting the first architecture to "failed" (code="failed") and the second architecture to "success" (code="succeeded").
|
|
|
|
|
repo_arch_package_status[("repo2", archs[0], "pkgA")] = ("finished", "failed")
|
|
|
|
|
repo_arch_package_status[("repo2", archs[1], "pkgA")] = ("finished", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build failed" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build failed"), "Staging bot did not post 'Build failed' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build failed, for more information go in..." on package PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number, "Build failed, for more information go in", project_name), "Staging bot did not post 'Build failed' comment on package PR."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t004
|
|
|
|
|
def test_004_build_multiple_packages_success(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create package PRs.
|
|
|
|
|
diff = "diff --git a/test_br_multi_pkgA.txt b/test_br_multi_pkgA.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr1 = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Multi PR A", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number1 = pr1["number"]
|
|
|
|
|
pkg_head_sha1 = pr1["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
diff2 = "diff --git a/test_br_multi_pkgB.txt b/test_br_multi_pkgB.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr2 = gitea_env.create_gitea_pr("mypool/pkgB", diff2, "Test BR Multi PR B", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number2 = pr2["number"]
|
|
|
|
|
pkg_head_sha2 = pr2["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
# 2. Create a project PR mentioning both packages in description and UPDATING SUBMODULES.
|
|
|
|
|
old_sha1 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgA", ref=merge_branch_name)
|
|
|
|
|
old_sha2 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgB", ref=merge_branch_name)
|
|
|
|
|
|
|
|
|
|
prj_diff = create_submodule_diff("pkgA", old_sha1, pkg_head_sha1)
|
|
|
|
|
prj_diff += create_submodule_diff("pkgB", old_sha2, pkg_head_sha2)
|
|
|
|
|
|
|
|
|
|
body = f"PR: mypool/pkgA!{pkg_pr_number1}\nPR: mypool/pkgB!{pkg_pr_number2}"
|
|
|
|
|
prj_pr = gitea_env.create_gitea_pr("myproducts/mySLFO", prj_diff, "Test Project PR Multi", False, base_branch=merge_branch_name, body=body)
|
|
|
|
|
prj_pr_number = prj_pr["number"]
|
|
|
|
|
|
|
|
|
|
# 3. Add staging_bot as a reviewer.
|
|
|
|
|
gitea_env.request_reviewers("myproducts/mySLFO", prj_pr_number, ["autogits_obs_staging_bot"])
|
|
|
|
|
|
|
|
|
|
# Wait for staging-bot to be added (verification)
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures for each package.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
packages = ["pkgA", "pkgB"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
for p in packages:
|
|
|
|
|
repo_arch_package_status[(r, a, p)] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition all repositories and architectures for the first package to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Verify "Build successful" is NOT yet posted
|
|
|
|
|
time.sleep(5)
|
|
|
|
|
events = gitea_env.get_timeline_events("myproducts/mySLFO", prj_pr_number)
|
|
|
|
|
assert not any(e.get("body") == "Build successful" for e in events), "Build successful posted prematurely."
|
|
|
|
|
|
|
|
|
|
# 7. Transition all repositories and architectures for the second package to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgB")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build successful" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build successful"), "Staging bot did not post 'Build successful' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build successful..." on each package PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number1, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR A."
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgB", pkg_pr_number2, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR B."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t005
|
|
|
|
|
def test_005_build_multiple_packages_mix(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create package PRs.
|
|
|
|
|
diff = "diff --git a/test_br_mix_multi_pkgA.txt b/test_br_mix_multi_pkgA.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr1 = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Mix Multi PR A", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number1 = pr1["number"]
|
|
|
|
|
pkg_head_sha1 = pr1["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
diff2 = "diff --git a/test_br_mix_multi_pkgB.txt b/test_br_mix_multi_pkgB.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr2 = gitea_env.create_gitea_pr("mypool/pkgB", diff2, "Test BR Mix Multi PR B", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number2 = pr2["number"]
|
|
|
|
|
pkg_head_sha2 = pr2["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
# 2. Create a project PR mentioning both packages in description and UPDATING SUBMODULES.
|
|
|
|
|
old_sha1 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgA", ref=merge_branch_name)
|
|
|
|
|
old_sha2 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgB", ref=merge_branch_name)
|
|
|
|
|
|
|
|
|
|
prj_diff = create_submodule_diff("pkgA", old_sha1, pkg_head_sha1)
|
|
|
|
|
prj_diff += create_submodule_diff("pkgB", old_sha2, pkg_head_sha2)
|
|
|
|
|
|
|
|
|
|
body = f"PR: mypool/pkgA!{pkg_pr_number1}\nPR: mypool/pkgB!{pkg_pr_number2}"
|
|
|
|
|
prj_pr = gitea_env.create_gitea_pr("myproducts/mySLFO", prj_diff, "Test Project PR Multi Mix", False, base_branch=merge_branch_name, body=body)
|
|
|
|
|
prj_pr_number = prj_pr["number"]
|
|
|
|
|
|
|
|
|
|
# 3. Add staging_bot as a reviewer.
|
|
|
|
|
gitea_env.request_reviewers("myproducts/mySLFO", prj_pr_number, ["autogits_obs_staging_bot"])
|
|
|
|
|
|
|
|
|
|
# Wait for staging-bot to be added (verification)
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures for each package.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
packages = ["pkgA", "pkgB"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
for p in packages:
|
|
|
|
|
repo_arch_package_status[(r, a, p)] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition the first package (all repositories and architectures) to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# 7. Transition the second package (all repositories and architectures) to "finished" mode and set its package statuses to "failed" (e.g., code="failed").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgB")] = ("finished", "failed")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build failed" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build failed"), "Staging bot did not post 'Build failed' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build successful..." on the successful package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number1, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR A."
|
|
|
|
|
|
|
|
|
|
# Expected Result 4: "Build failed..." on the failed package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgB", pkg_pr_number2, "Build failed, for more information go in", project_name), "Staging bot did not post 'Build failed' comment on package PR B."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t006
|
|
|
|
|
def test_006_build_multiple_packages_partial_fail(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create package PRs.
|
|
|
|
|
diff = "diff --git a/test_br_partial_multi_pkgA.txt b/test_br_partial_multi_pkgA.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr1 = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Partial Multi PR A", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number1 = pr1["number"]
|
|
|
|
|
pkg_head_sha1 = pr1["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
diff2 = "diff --git a/test_br_partial_multi_pkgB.txt b/test_br_partial_multi_pkgB.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr2 = gitea_env.create_gitea_pr("mypool/pkgB", diff2, "Test BR Partial Multi PR B", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number2 = pr2["number"]
|
|
|
|
|
pkg_head_sha2 = pr2["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
# 2. Create a project PR mentioning both packages in description and UPDATING SUBMODULES.
|
|
|
|
|
old_sha1 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgA", ref=merge_branch_name)
|
|
|
|
|
old_sha2 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgB", ref=merge_branch_name)
|
|
|
|
|
|
|
|
|
|
prj_diff = create_submodule_diff("pkgA", old_sha1, pkg_head_sha1)
|
|
|
|
|
prj_diff += create_submodule_diff("pkgB", old_sha2, pkg_head_sha2)
|
|
|
|
|
|
|
|
|
|
body = f"PR: mypool/pkgA!{pkg_pr_number1}\nPR: mypool/pkgB!{pkg_pr_number2}"
|
|
|
|
|
prj_pr = gitea_env.create_gitea_pr("myproducts/mySLFO", prj_diff, "Test Project PR Multi Partial", False, base_branch=merge_branch_name, body=body)
|
|
|
|
|
prj_pr_number = prj_pr["number"]
|
|
|
|
|
|
|
|
|
|
# 3. Add staging_bot as a reviewer.
|
|
|
|
|
gitea_env.request_reviewers("myproducts/mySLFO", prj_pr_number, ["autogits_obs_staging_bot"])
|
|
|
|
|
|
|
|
|
|
# Wait for staging-bot to be added (verification)
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures for each package.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
packages = ["pkgA", "pkgB"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
for p in packages:
|
|
|
|
|
repo_arch_package_status[(r, a, p)] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition the first package (all repositories and architectures) to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# 7. Transition the second package:
|
|
|
|
|
# Repository 1 (all architectures) to "finished" mode with "success" (e.g., code="succeeded").
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[("repo1", a, "pkgB")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Repository 2 (all architectures) to "finished" mode with "failed" (e.g., code="failed").
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[("repo2", a, "pkgB")] = ("finished", "failed")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build failed" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build failed"), "Staging bot did not post 'Build failed' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build successful..." on the first (successful) package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number1, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR A."
|
|
|
|
|
|
|
|
|
|
# Expected Result 4: "Build failed..." on the second (failed) package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgB", pkg_pr_number2, "Build failed, for more information go in", project_name), "Staging bot did not post 'Build failed' comment on package PR B."
|
|
|
|
|
|
|
|
|
|
@pytest.mark.t007
|
|
|
|
|
def test_007_build_multiple_packages_arch_fail(staging_main_env, httpserver):
|
|
|
|
|
gitea_env, test_full_repo_name, merge_branch_name = staging_main_env
|
|
|
|
|
|
|
|
|
|
# 1. Create package PRs.
|
|
|
|
|
diff = "diff --git a/test_br_arch_multi_pkgA.txt b/test_br_arch_multi_pkgA.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr1 = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test BR Arch Multi PR A", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number1 = pr1["number"]
|
|
|
|
|
pkg_head_sha1 = pr1["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
diff2 = "diff --git a/test_br_arch_multi_pkgB.txt b/test_br_arch_multi_pkgB.txt\nnew file mode 100644\nindex 00000000..473a0f4c\n"
|
|
|
|
|
pr2 = gitea_env.create_gitea_pr("mypool/pkgB", diff2, "Test BR Arch Multi PR B", False, base_branch=merge_branch_name)
|
|
|
|
|
pkg_pr_number2 = pr2["number"]
|
|
|
|
|
pkg_head_sha2 = pr2["head"]["sha"]
|
|
|
|
|
|
|
|
|
|
# 2. Create a project PR mentioning both packages in description and UPDATING SUBMODULES.
|
|
|
|
|
old_sha1 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgA", ref=merge_branch_name)
|
|
|
|
|
old_sha2 = gitea_env.get_submodule_sha("myproducts", "mySLFO", "pkgB", ref=merge_branch_name)
|
|
|
|
|
|
|
|
|
|
prj_diff = create_submodule_diff("pkgA", old_sha1, pkg_head_sha1)
|
|
|
|
|
prj_diff += create_submodule_diff("pkgB", old_sha2, pkg_head_sha2)
|
|
|
|
|
|
|
|
|
|
body = f"PR: mypool/pkgA!{pkg_pr_number1}\nPR: mypool/pkgB!{pkg_pr_number2}"
|
|
|
|
|
prj_pr = gitea_env.create_gitea_pr("myproducts/mySLFO", prj_diff, "Test Project PR Multi Arch Fail", False, base_branch=merge_branch_name, body=body)
|
|
|
|
|
prj_pr_number = prj_pr["number"]
|
|
|
|
|
|
|
|
|
|
# 3. Add staging_bot as a reviewer.
|
|
|
|
|
gitea_env.request_reviewers("myproducts/mySLFO", prj_pr_number, ["autogits_obs_staging_bot"])
|
|
|
|
|
|
|
|
|
|
# Wait for staging-bot to be added (verification)
|
|
|
|
|
assert wait_for_staging_bot_reviewer(gitea_env, prj_pr_number), "Staging bot was not added as a reviewer."
|
|
|
|
|
|
|
|
|
|
# 4. Mock the OBS result list with 2 repositories and 2 architectures for each package.
|
|
|
|
|
project_name = f"openSUSE:Leap:16.0:PullRequest:{prj_pr_number}"
|
|
|
|
|
repos = ["repo1", "repo2"]
|
|
|
|
|
archs = ["x86_64", "aarch64"]
|
|
|
|
|
packages = ["pkgA", "pkgB"]
|
|
|
|
|
repo_arch_package_status = {}
|
|
|
|
|
|
|
|
|
|
# 5. Set all repository, architecture, and package statuses to "in progress" (e.g., code="building").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
for p in packages:
|
|
|
|
|
repo_arch_package_status[(r, a, p)] = ("building", "building")
|
|
|
|
|
|
|
|
|
|
def build_result_handler(request):
|
|
|
|
|
return create_build_result_xml(project_name, repo_arch_package_status)
|
|
|
|
|
|
|
|
|
|
setup_obs_mock(httpserver, project_name, build_result_handler)
|
|
|
|
|
|
|
|
|
|
# Expected Result 1: "Build is started in..."
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build is started in", project_name), "Staging bot did not post 'Build is started' comment."
|
|
|
|
|
|
|
|
|
|
# 6. Transition the first package (all repositories and architectures) to "finished" mode and set its package statuses to "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
for a in archs:
|
|
|
|
|
repo_arch_package_status[(r, a, "pkgA")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# 7. Transition the second package:
|
|
|
|
|
# Architecture 1 (all repositories) to "finished" mode with "success" (e.g., code="succeeded").
|
|
|
|
|
for r in repos:
|
|
|
|
|
repo_arch_package_status[(r, archs[0], "pkgB")] = ("published", "succeeded")
|
|
|
|
|
|
|
|
|
|
# Architecture 2 (all repositories) to "finished" mode with "failed" (e.g., code="failed").
|
|
|
|
|
for r in repos:
|
|
|
|
|
repo_arch_package_status[(r, archs[1], "pkgB")] = ("finished", "failed")
|
|
|
|
|
|
|
|
|
|
# Expected Result 2: "Build failed" on project PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "myproducts/mySLFO", prj_pr_number, "Build failed"), "Staging bot did not post 'Build failed' comment on project PR."
|
|
|
|
|
|
|
|
|
|
# Expected Result 3: "Build successful..." on the first (successful) package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgA", pkg_pr_number1, "Build successful, for more information go in", project_name), "Staging bot did not post 'Build successful' comment on package PR A."
|
|
|
|
|
|
|
|
|
|
# Expected Result 4: "Build failed..." on the second (failed) package's PR.
|
|
|
|
|
assert wait_for_comment(gitea_env, "mypool/pkgB", pkg_pr_number2, "Build failed, for more information go in", project_name), "Staging bot did not post 'Build failed' comment on package PR B."
|