334 lines
16 KiB
Python
334 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.utils import evergreen_conn
|
|
from buildscripts.resmokelib.setup_multiversion.config import SetupMultiversionConfig
|
|
from buildscripts.resmokelib.setup_multiversion.setup_multiversion import SetupMultiversion, _DownloadOptions, \
|
|
infer_platform
|
|
|
|
|
|
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)
|