Files
mongo/buildscripts/tests/resmokelib/setup_multiversion/test_setup_multiversion.py
Juan Gu 855dfadef0 SERVER-94077 Use isort in Ruff configs (#27865)
GitOrigin-RevId: e793d662774ccd3ab6c3f356c2287cf1f7ff9805
2024-10-10 19:33:49 +00:00

377 lines
16 KiB
Python

"""Unit tests for buildscripts/resmokelib/setup_multiversion/setup_multiversion.py."""
import unittest
from argparse import Namespace
import requests
from mock import patch
from buildscripts.resmokelib.setup_multiversion.config import SetupMultiversionConfig
from buildscripts.resmokelib.setup_multiversion.setup_multiversion import (
SetupMultiversion,
_DownloadOptions,
infer_platform,
)
from buildscripts.resmokelib.utils import evergreen_conn
class TestInferPlatform(unittest.TestCase):
@patch("platform.system")
def test_infer_platform_darwin(self, mock_system):
mock_system.return_value = "Darwin"
pltf = infer_platform("base", "4.2")
self.assertEqual(pltf, "osx")
pltf = infer_platform("enterprise", "4.2")
self.assertEqual(pltf, "osx")
pltf = infer_platform("base", "4.0")
self.assertEqual(pltf, "osx")
pltf = infer_platform(None, "4.2")
self.assertEqual(pltf, "osx")
pltf = infer_platform("base", None)
self.assertEqual(pltf, "osx")
pltf = infer_platform(None, None)
self.assertEqual(pltf, "osx")
@patch("platform.system")
def test_infer_platform_windows(self, mock_system):
mock_system.return_value = "Windows"
pltf = infer_platform("base", "4.2")
self.assertEqual(pltf, "windows_x86_64-2012plus")
pltf = infer_platform("enterprise", "4.2")
self.assertEqual(pltf, "windows")
pltf = infer_platform("base", "4.0")
self.assertEqual(pltf, "windows")
pltf = infer_platform(None, "4.2")
self.assertEqual(pltf, "windows")
pltf = infer_platform("base", None)
self.assertEqual(pltf, "windows")
pltf = infer_platform(None, None)
self.assertEqual(pltf, "windows")
@patch("distro.minor_version")
@patch("distro.major_version")
@patch("distro.id")
@patch("platform.system")
def test_infer_platform_linux(self, mock_system, mock_id, mock_major, mock_minor):
mock_system.return_value = "Linux"
mock_id.return_value = "ubuntu"
mock_major.return_value = "18"
mock_minor.return_value = "04"
pltf = infer_platform("base", "4.2")
self.assertEqual(pltf, "ubuntu1804")
pltf = infer_platform("enterprise", "4.2")
self.assertEqual(pltf, "ubuntu1804")
pltf = infer_platform("base", "4.0")
self.assertEqual(pltf, "ubuntu1804")
pltf = infer_platform(None, "4.2")
self.assertEqual(pltf, "ubuntu1804")
pltf = infer_platform("base", None)
self.assertEqual(pltf, "ubuntu1804")
pltf = infer_platform(None, None)
self.assertEqual(pltf, "ubuntu1804")
mock_id.return_value = "rhel"
mock_major.return_value = "8"
mock_minor.return_value = "0"
pltf = infer_platform("base", "4.2")
self.assertEqual(pltf, "rhel80")
pltf = infer_platform("enterprise", "4.2")
self.assertEqual(pltf, "rhel80")
pltf = infer_platform("base", "4.0")
self.assertEqual(pltf, "rhel80")
pltf = infer_platform(None, "4.2")
self.assertEqual(pltf, "rhel80")
pltf = infer_platform("base", None)
self.assertEqual(pltf, "rhel80")
pltf = infer_platform(None, None)
self.assertEqual(pltf, "rhel80")
@patch("distro.id")
@patch("platform.system")
def test_infer_platform_others(self, mock_system, mock_id):
mock_system.return_value = "Java"
self.assertRaises(ValueError, infer_platform, "enterprise", "4.2")
self.assertRaises(ValueError, infer_platform, "base", None)
self.assertRaises(ValueError, infer_platform, None, "4.2")
self.assertRaises(ValueError, infer_platform, None, None)
mock_system.return_value = "Linux"
mock_id.return_value = "debian"
self.assertRaises(ValueError, infer_platform, "enterprise", "4.2")
self.assertRaises(ValueError, infer_platform, "base", None)
self.assertRaises(ValueError, infer_platform, None, "4.2")
self.assertRaises(ValueError, infer_platform, None, None)
class TestSetupMultiversionBase(unittest.TestCase):
def setUp(self):
self.buildvariant_name = "buildvariant-name"
self.generic_buildvariant_name = "generic-buildvariant-name"
edition = "edition"
platform = "platform"
architecture = "architecture"
raw_yaml_config = {
"evergreen_projects": [
"mongodb-mongo-master",
"mongodb-mongo-v4.4",
],
"evergreen_buildvariants": [
{
"name": self.buildvariant_name,
"edition": edition,
"platform": platform,
"architecture": architecture,
},
{
"name": self.generic_buildvariant_name,
"edition": evergreen_conn.GENERIC_EDITION,
"platform": evergreen_conn.GENERIC_PLATFORM,
"architecture": evergreen_conn.GENERIC_ARCHITECTURE,
},
],
}
download_options = _DownloadOptions(db=True, ds=False, da=False, dv=False)
options = Namespace(
install_dir="install",
link_dir="link",
edition=edition,
mv_platform=platform,
architecture=architecture,
use_latest=False,
versions=["4.2.1"],
evergreen_config=None,
github_oauth_token=None,
download_options=download_options,
debug=False,
)
with patch(
"buildscripts.resmokelib.setup_multiversion.config.SetupMultiversionConfig"
) as mock_config:
mock_config.return_value = SetupMultiversionConfig(raw_yaml_config)
self.setup_multiversion = SetupMultiversion(**vars(options))
class TestSetupMultiversionGetLatestUrls(TestSetupMultiversionBase):
@patch("evergreen.api.EvergreenApi.versions_by_project")
def test_no_such_project(self, mock_versions_by_project):
"""Project `mongodb-mongo-v4.2.1` doesn't exist."""
version = "4.2.1"
class DummyIterator:
def __init__(self):
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current == 0:
self.current += 1
resp = requests.models.Response()
resp.status_code = 404
raise requests.HTTPError(response=resp)
raise StopIteration
mock_versions_by_project.return_value = DummyIterator()
urlinfo = self.setup_multiversion.get_latest_urls(version)
self.assertEqual(urlinfo.urls, {})
@patch("evergreen.version.Version")
@patch("evergreen.api.EvergreenApi.versions_by_project")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_no_compile_artifacts(
self, mock_get_compile_artifact_urls, mock_versions_by_project, mock_version
):
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_versions_by_project.return_value = iter([mock_version])
mock_get_compile_artifact_urls.return_value = {}
urlinfo = self.setup_multiversion.get_latest_urls("4.4")
self.assertEqual(urlinfo.urls, {})
@patch("evergreen.version.Version")
@patch("evergreen.api.EvergreenApi.versions_by_project")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_urls_found_on_last_version(
self, mock_get_compile_artifact_urls, mock_versions_by_project, mock_version
):
expected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/mongodb-mongo-master/ubuntu1804/90f767adbb1901d007ee4dd8714f53402d893669/binaries/mongo-mongodb_mongo_master_ubuntu1804_90f767adbb1901d007ee4dd8714f53402d893669_20_11_30_03_14_30.tgz"
}
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_versions_by_project.return_value = iter([mock_version])
mock_get_compile_artifact_urls.return_value = expected_urls
urlinfo = self.setup_multiversion.get_latest_urls("4.4")
self.assertEqual(urlinfo.urls, expected_urls)
@patch("evergreen.version.Version")
@patch("evergreen.version.Version")
@patch("evergreen.api.EvergreenApi.versions_by_project")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_urls_found_on_not_last_version(
self,
mock_get_compile_artifact_urls,
mock_versions_by_project,
mock_version,
mock_expected_version,
):
expected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/mongodb-mongo-master/ubuntu1804/90f767adbb1901d007ee4dd8714f53402d893669/binaries/mongo-mongodb_mongo_master_ubuntu1804_90f767adbb1901d007ee4dd8714f53402d893669_20_11_30_03_14_30.tgz"
}
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_expected_version.build_variants_map = {self.buildvariant_name: "build_id"}
evg_versions = [mock_version for _ in range(3)]
evg_versions.append(mock_expected_version)
mock_versions_by_project.return_value = iter(evg_versions)
mock_get_compile_artifact_urls.side_effect = (
lambda evg_api, evg_version, buildvariant_name, ignore_failed_push: {
(self.setup_multiversion.evg_api, mock_version, self.buildvariant_name, False): {},
(
self.setup_multiversion.evg_api,
mock_expected_version,
self.buildvariant_name,
False,
): expected_urls,
}[evg_api, evg_version, buildvariant_name, ignore_failed_push]
)
urlinfo = self.setup_multiversion.get_latest_urls("4.4")
self.assertEqual(urlinfo.urls, expected_urls)
@patch("evergreen.version.Version")
@patch("evergreen.version.Version")
@patch("evergreen.api.EvergreenApi.versions_by_project")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_start_from_revision(
self,
mock_get_compile_artifact_urls,
mock_versions_by_project,
mock_version,
mock_expected_version,
):
start_from_revision = "90f767adbb1901d007ee4dd8714f53402d893669"
unexpected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/project/build_variant/revision/binaries/unexpected.tgz"
}
expected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/project/build_variant/90f767adbb1901d007ee4dd8714f53402d893669/binaries/expected.tgz"
}
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_expected_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_expected_version.revision = start_from_revision
evg_versions = [mock_version for _ in range(3)]
evg_versions.append(mock_expected_version)
mock_versions_by_project.return_value = iter(evg_versions)
mock_get_compile_artifact_urls.side_effect = (
lambda evg_api, evg_version, buildvariant_name, ignore_failed_push: {
(
self.setup_multiversion.evg_api,
mock_version,
self.buildvariant_name,
False,
): unexpected_urls,
(
self.setup_multiversion.evg_api,
mock_expected_version,
self.buildvariant_name,
False,
): expected_urls,
}[evg_api, evg_version, buildvariant_name, ignore_failed_push]
)
urlinfo = self.setup_multiversion.get_latest_urls("master", start_from_revision)
self.assertEqual(urlinfo.urls, expected_urls)
class TestSetupMultiversionGetUrls(TestSetupMultiversionBase):
@patch("evergreen.version.Version")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_evergreen_version")
@patch("buildscripts.resmokelib.setup_multiversion.github_conn.get_git_tag_and_commit")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_urls_by_binary_version_found(
self,
mock_get_compile_artifact_urls,
mock_get_git_tag_and_commit,
mock_get_evergreen_version,
mock_version,
):
expected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/mongodb-mongo-master/ubuntu1804/90f767adbb1901d007ee4dd8714f53402d893669/binaries/mongo-mongodb_mongo_master_ubuntu1804_90f767adbb1901d007ee4dd8714f53402d893669_20_11_30_03_14_30.tgz"
}
mock_get_git_tag_and_commit.return_value = (
"r4.4.1",
"90f767adbb1901d007ee4dd8714f53402d893669",
)
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_version.project_identifier = "mongodb-mongo-v4.4"
mock_get_evergreen_version.return_value = mock_version
mock_get_compile_artifact_urls.return_value = expected_urls
urlinfo = self.setup_multiversion.get_urls("4.4.1")
self.assertEqual(urlinfo.urls, expected_urls)
@patch("evergreen.version.Version")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_evergreen_version")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_urls_by_commit_hash_found(
self, mock_get_compile_artifact_urls, mock_get_evergreen_version, mock_version
):
expected_urls = {
"Binaries": "https://mciuploads.s3.amazonaws.com/mongodb-mongo-master/ubuntu1804/90f767adbb1901d007ee4dd8714f53402d893669/binaries/mongo-mongodb_mongo_master_ubuntu1804_90f767adbb1901d007ee4dd8714f53402d893669_20_11_30_03_14_30.tgz"
}
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_version.project_identifier = "mongodb-mongo-v4.4"
mock_get_evergreen_version.return_value = mock_version
mock_get_compile_artifact_urls.return_value = expected_urls
urlinfo = self.setup_multiversion.get_urls("90f767adbb1901d007ee4dd8714f53402d893669")
self.assertEqual(urlinfo.urls, expected_urls)
@patch("evergreen.version.Version")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_evergreen_version")
@patch("buildscripts.resmokelib.setup_multiversion.github_conn.get_git_tag_and_commit")
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_compile_artifact_urls")
def test_urls_not_found(
self,
mock_get_compile_artifact_urls,
mock_get_git_tag_and_commit,
mock_get_evergreen_version,
mock_version,
):
mock_get_git_tag_and_commit.return_value = (
"r4.4.1",
"90f767adbb1901d007ee4dd8714f53402d893669",
)
mock_version.version_id = "dummy-version-id"
mock_version.build_variants_map = {self.buildvariant_name: "build_id"}
mock_version.project_identifier = "mongodb-mongo-v4.4"
mock_get_evergreen_version.return_value = mock_version
mock_get_compile_artifact_urls.return_value = {}
urlinfo = self.setup_multiversion.get_urls("4.4.1")
self.assertEqual(urlinfo.urls, {})
self.assertEqual(urlinfo.evg_version_id, mock_version.version_id)
@patch("buildscripts.resmokelib.utils.evergreen_conn.get_evergreen_version")
@patch("buildscripts.resmokelib.setup_multiversion.github_conn.get_git_tag_and_commit")
def test_evg_version_not_found(self, mock_get_git_tag_and_commit, mock_get_evergreen_version):
mock_get_git_tag_and_commit.return_value = (
"r4.4.1",
"90f767adbb1901d007ee4dd8714f53402d893669",
)
mock_get_evergreen_version.return_value = None
urlinfo = self.setup_multiversion.get_urls("4.4.1")
self.assertEqual(urlinfo.urls, {})
self.assertEqual(urlinfo.evg_version_id, None)