You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
10 KiB

# Copyright (C) 2024 The Sipwise Team - http://sipwise.com
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
import pprint
import sys
from unittest.mock import patch
from django.test import override_settings
from django.test import SimpleTestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from build.conf import settings
from build.exceptions import PreviousBuildNotDone
from build.models import BuildRelease
from build.models import ReleaseConfig
from build.utils import get_simple_release
from build.utils import guess_trunk_filename
from repoapi.models import JenkinsBuildInfo
from repoapi.test.base import BaseTest
from repoapi.utils import get_build_release
FIXTURES_PATH = settings.BASE_DIR.joinpath("build", "fixtures")
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next")
)
class BuildReleaseTestCase(BaseTest):
fixtures = ["test_trunk_next"]
release_uuid = "53f9e166-4271-4581-ae3d-b3c1bb0bb081"
def test_distribution(self):
br = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(br.distribution, "bookworm")
def test_build_release(self):
br = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(br.release, "trunk-next")
self.assertEqual(br.build_release, "trunk")
def test_fail(self):
with self.assertRaisesRegex(
PreviousBuildNotDone, "release:trunk-next is already building"
):
BuildRelease.objects.create_build_release("AAA", "trunk-next")
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next"),
JBI_ALLOWED_HOSTS=["fake.local"],
)
@patch("repoapi.utils.dlfile")
@patch("build.tasks.trigger_build")
class BuildReleaseBuilds(BaseTest):
fixtures = ["test_trunk_next"]
release = "trunk"
release_uuid = "53f9e166-4271-4581-ae3d-b3c1bb0bb081"
project = "ngcpcfg"
def test_jbi_manage_ok_release_job(self, tb, _):
br = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(br.pool_size, 0)
JenkinsBuildInfo.objects.create(
job_url="http://fake.local/job/release-copy-debs-yml/",
projectname="release-copy-debs-yml",
jobname="release-copy-debs-yml",
tag="UUIDA",
param_release=self.release,
param_release_uuid=self.release_uuid,
buildnumber=1,
result="SUCCESS",
)
params = {
"project": f"{self.project}-get-code",
"release_uuid": self.release_uuid,
"trigger_release": self.release,
"trigger_branch_or_tag": "branch/master",
"trigger_distribution": "bookworm",
}
tb.assert_called_once_with(**params)
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next")
)
class ReleaseConfigNext(SimpleTestCase):
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config")
)
def test_trunk_next_check(self):
"""
No trunk-next.yml in config
validate() works fine but
release gets detected as trunk
since there is no trunk-next.yml in config!!
"""
ok = FIXTURES_PATH.joinpath("config.next", "trunk-next.yml")
data = ReleaseConfig.load_config(ok)
cfg = ReleaseConfig("fake", config=data)
self.assertEqual(cfg.branch, "master")
self.assertEqual(cfg.config_file, "fake.yml")
self.assertEqual(cfg.debian_release, "bookworm")
self.assertEqual(cfg.release, "trunk")
self.assertEqual(cfg.distribution, None)
def test_guess_trunk_filename(self):
res = guess_trunk_filename("release-trunk-bullseye")
self.assertEqual(res, "trunk")
res = guess_trunk_filename("release-trunk-bookworm")
self.assertEqual(res, "trunk-next")
@override_settings(BUILD_RELEASES_SKIP=["mr0.1"])
def test_supported_releases(self):
supported = [
"release-trunk-bullseye",
"release-trunk-bookworm",
]
res = ReleaseConfig.supported_releases()
self.assertListEqual(res, supported)
def test_trunk_next(self):
rc = ReleaseConfig("trunk-next")
self.assertIsNotNone(rc.config)
self.assertEqual(rc.debian_release, "bookworm")
self.assertNotIn("rainbow-misc", rc.projects)
rc = ReleaseConfig("release-trunk-bookworm")
self.assertEqual(rc.debian_release, "bookworm")
self.assertNotIn("rainbow-misc", rc.projects)
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next")
)
class BuildReleaseCreate(BaseTest):
@patch("build.tasks.trigger_copy_deps")
@patch("build.signals.build_resume")
def test_create_build_release(self, build_resume, trigger_copy_deps):
br = BuildRelease.objects.create_build_release(
"UUID1",
"release-trunk-bookworm",
)
self.assertEqual(br.release, "trunk-next")
self.assertEqual(br.distribution, "bookworm")
build_resume.delay.assert_not_called()
trigger_copy_deps.assert_called_once_with(
internal=True,
release="release-trunk-bookworm",
release_uuid=br.uuid,
)
def test_get_simple_release(self):
val = get_simple_release("release-trunk-bookworm")
self.assertEqual(val, "trunk-next")
def test_is_trunk_next(self):
self.assertTrue(ReleaseConfig.is_trunk_next("release-trunk-bookworm"))
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config")
)
def test_is_trunk_next_no_cfg(self):
self.assertFalse(ReleaseConfig.is_trunk_next("release-trunk-bookworm"))
def test_config(self):
cfg = ReleaseConfig("release-trunk-bookworm")
self.assertEqual(cfg.branch, "master")
self.assertEqual(cfg.distribution, "bookworm")
self.assertEqual(cfg.config_file, "trunk-next.yml")
self.assertEqual(cfg.debian_release, "bookworm")
self.assertEqual(cfg.release, "trunk-next")
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next")
)
@patch("repoapi.utils.dlfile")
@patch("build.tasks.trigger_build")
class TestViews(BaseTest, APITestCase):
fixtures = ["test_trunk_next"]
release = "trunk"
release_uuid = "53f9e166-4271-4581-ae3d-b3c1bb0bb081"
def test_release_ok(self, tb, dl):
qs = BuildRelease.objects.filter(uuid=self.release_uuid)
self.assertEqual(qs.count(), 1)
def test_project_list(self, tb, dl):
url_base = reverse("project-list", args=["trunk-next"])
url = f"{url_base}?release_uuid={self.release_uuid}"
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
pprint.pp(response.data, stream=sys.stderr)
# ngcpcfg build
self.assertEqual(len(response.data), 1)
info = response.data[0]
self.assertRegex(info["url"], r"http://testserver/release/trunk-next/")
self.assertNotIn(info["projectname"], settings.BUILD_RELEASE_JOBS)
def test_project_fulllist(self, tb, dl):
url_base = reverse(
"project-fulllist",
args=["trunk-next"],
)
url = f"{url_base}?release_uuid={self.release_uuid}"
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
pprint.pp(response.data, stream=sys.stderr)
# ngcpcfg build
self.assertEqual(len(response.data), 1)
info = response.data["ngcpcfg"]["7737120e-f512-4793-9c45-47eb4a4f4891"]
self.assertTrue(info["latest"])
def test_uuidinfo_list(self, tb, dl):
url_base = reverse(
"uuidinfo-list",
args=[
"trunk-next",
"ngcpcfg",
"7737120e-f512-4793-9c45-47eb4a4f4891",
],
)
url = f"{url_base}?release_uuid={self.release_uuid}"
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
pprint.pp(response.data, stream=sys.stderr)
# ngcpcfg build
self.assertEqual(len(response.data), 1)
def test_latestuuid_list(self, tb, dl):
url_base = reverse(
"latestuuid-list",
args=["trunk-next", "ngcpcfg"],
)
url = f"{url_base}?release_uuid={self.release_uuid}"
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
pprint.pp(response.data, stream=sys.stderr)
self.assertEqual(
response.data["tag"], "7737120e-f512-4793-9c45-47eb4a4f4891"
)
def test_projectuuid_list(self, tb, dl):
url_base = reverse(
"projectuuid-list",
args=["trunk-next", "ngcpcfg"],
)
url = f"{url_base}?release_uuid={self.release_uuid}"
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
pprint.pp(response.data, stream=sys.stderr)
info = response.data[0]
self.assertRegex(info["url"], r"http://testserver/release/trunk-next/")
self.assertEqual(info["tag"], "7737120e-f512-4793-9c45-47eb4a4f4891")
self.assertTrue(info["latest"])
@override_settings(
BUILD_REPOS_SCRIPTS_CONFIG_DIR=FIXTURES_PATH.joinpath("config.next")
)
class UtilsRelease(BaseTest):
fixtures = ["test_trunk_next"]
release_uuid = "53f9e166-4271-4581-ae3d-b3c1bb0bb081"
def test_get_build_release(self):
self.assertEqual(get_build_release(self.release_uuid), "trunk")