Files
mongo/buildscripts/tests/test_selected_tests.py
Lydia Stepanek bfa494770a SERVER-45394 Generate selected tasks in a patch using test mappings
create mode 100644 buildscripts/patch_builds/selected_tests_service.py
 create mode 100644 buildscripts/selected_tests.py
 create mode 100644 buildscripts/tests/patch_builds/test_selected_tests_service.py
 create mode 100644 buildscripts/tests/test_selected_tests.py
2020-02-04 15:37:03 +00:00

283 lines
12 KiB
Python

"""Unit tests for the selected_tests script."""
import os
import unittest
from mock import MagicMock, patch
# pylint: disable=wrong-import-position
import buildscripts.ciconfig.evergreen as _evergreen
from buildscripts import selected_tests as under_test
# pylint: disable=missing-docstring,invalid-name,unused-argument,protected-access
NS = "buildscripts.selected_tests"
def ns(relative_name): # pylint: disable=invalid-name
"""Return a full name from a name relative to the test module"s name space."""
return NS + "." + relative_name
def tests_by_task_stub():
return {
"jsCore_auth": {
"tests": [
"jstests/core/currentop_waiting_for_latch.js",
"jstests/core/latch_analyzer.js",
],
"use_multiversion": None,
"distro": "rhel62-small",
},
"auth_gen": {
"tests": ["jstests/auth/auth3.js"],
"use_multiversion": None,
"distro": "rhel62-small",
},
}
class TestSelectedTestsConfigOptions(unittest.TestCase):
@patch(ns("read_config"))
def test_overwrites_overwrite_filepath_config(self, read_config_mock):
filepath = MagicMock()
read_config_mock.read_config_file.return_value = {"key1": 1}
overwrites = {"key1": 2}
required_keys = {"key1"}
defaults = {}
formats = {"key1": int}
config_options = under_test.SelectedTestsConfigOptions.from_file(
filepath, overwrites, required_keys, defaults, formats)
self.assertEqual(overwrites["key1"], config_options.key1)
@patch(ns("read_config"))
def test_overwrites_overwrite_defaults(self, read_config_mock):
filepath = MagicMock()
read_config_mock.read_config_file.return_value = {"key1": 1}
overwrites = {"key1": 2}
required_keys = {"key1"}
defaults = {"key1": 3}
formats = {"key1": int}
config_options = under_test.SelectedTestsConfigOptions.from_file(
filepath, overwrites, required_keys, defaults, formats)
self.assertEqual(overwrites["key1"], config_options.key1)
def test_run_tests_task(self):
config_options = under_test.SelectedTestsConfigOptions(
{"name_of_generating_task": "my_task_gen"}, {}, {}, {})
self.assertEqual(config_options.run_tests_task, "my_task")
def test_run_tests_build_variant(self):
config_options = under_test.SelectedTestsConfigOptions(
{"name_of_generating_build_variant": "my-build-variant"}, {}, {}, {})
self.assertEqual(config_options.run_tests_build_variant, "my-build-variant")
def test_run_tests_build_id(self):
config_options = under_test.SelectedTestsConfigOptions(
{"name_of_generating_build_id": "my_build_id"}, {}, {}, {})
self.assertEqual(config_options.run_tests_build_id, "my_build_id")
@patch(ns("read_config"))
def test_generate_display_task(self, read_config_mock):
config_options = under_test.SelectedTestsConfigOptions(
{"task_name": "my_task", "build_variant": "my_variant"}, {}, {}, {})
display_task = config_options.generate_display_task(["task_1", "task_2"])
self.assertEqual("my_task_my_variant", display_task._name)
self.assertIn("task_1", display_task.to_map()["execution_tasks"])
self.assertIn("task_2", display_task.to_map()["execution_tasks"])
class TestFindRelatedTestFiles(unittest.TestCase):
@patch(ns("is_file_a_test_file"))
@patch(ns("SelectedTestsService"))
def test_related_files_returned_from_selected_tests_service(self, selected_tests_service_mock,
is_file_a_test_file_mock):
is_file_a_test_file_mock.return_value = True
changed_files = {"src/file1.cpp", "src/file2.js"}
selected_tests_service_mock.get_test_mappings.return_value = [
{
"source_file": "src/file1.cpp",
"test_files": [{"name": "jstests/file-1.js"}],
},
{
"source_file": "src/file2.cpp",
"test_files": [{"name": "jstests/file-3.js"}],
},
]
related_test_files = under_test._find_related_test_files(selected_tests_service_mock,
changed_files)
self.assertEqual(related_test_files, {"jstests/file-1.js", "jstests/file-3.js"})
@patch(ns("is_file_a_test_file"))
@patch(ns("SelectedTestsService"))
def test_related_files_returned_are_not_valid_test_files(self, selected_tests_service_mock,
is_file_a_test_file_mock):
is_file_a_test_file_mock.return_value = False
changed_files = {"src/file1.cpp", "src/file2.js"}
selected_tests_service_mock.get_test_mappings.return_value = [
{
"source_file": "src/file1.cpp",
"test_files": [{"name": "jstests/file-1.js"}],
},
{
"source_file": "src/file2.cpp",
"test_files": [{"name": "jstests/file-3.js"}],
},
]
related_test_files = under_test._find_related_test_files(selected_tests_service_mock,
changed_files)
self.assertEqual(related_test_files, set())
@patch(ns("SelectedTestsService"))
def test_no_related_files_returned(self, selected_tests_service_mock):
selected_tests_service_mock.get_test_mappings.return_value = set()
changed_files = {"src/file1.cpp", "src/file2.js"}
related_test_files = under_test._find_related_test_files(selected_tests_service_mock,
changed_files)
self.assertEqual(related_test_files, set())
class TestGetSelectedTestsTaskConfiguration(unittest.TestCase):
@patch(ns("read_config"))
def test_gets_values(self, read_config_mock):
filepath = MagicMock()
read_config_mock.read_config_file.return_value = {
"task_name": "my_task", "build_variant": "my-build-variant", "build_id": "my_build_id"
}
selected_tests_task_config = under_test._get_selected_tests_task_configuration(filepath)
self.assertEqual(selected_tests_task_config["name_of_generating_task"], "my_task")
self.assertEqual(selected_tests_task_config["name_of_generating_build_variant"],
"my-build-variant")
self.assertEqual(selected_tests_task_config["name_of_generating_build_id"], "my_build_id")
class TestGetEvgTaskConfiguration(unittest.TestCase):
def test_task_is_a_generate_resmoke_task(self):
task_name = "auth_gen"
task = _evergreen.Task({
"name":
task_name,
"commands": [{
"func": "generate resmoke tasks",
"vars": {
"fallback_num_sub_suites": "4",
"resmoke_args": "--storageEngine=wiredTiger",
},
}],
})
burn_in_task_config = tests_by_task_stub()[task_name]
evg_conf_mock = MagicMock()
evg_conf_mock.get_variant.return_value.get_task.return_value = task
evg_task_config = under_test._get_evg_task_configuration(evg_conf_mock, "variant",
task_name, burn_in_task_config)
self.assertEqual(evg_task_config["task_name"], task_name)
self.assertEqual(evg_task_config["build_variant"], "variant")
self.assertEqual(evg_task_config["selected_tests_to_run"], {"jstests/auth/auth3.js"})
self.assertIsNone(evg_task_config.get("suite"))
self.assertEqual(
evg_task_config["resmoke_args"],
"--storageEngine=wiredTiger",
)
self.assertEqual(evg_task_config["fallback_num_sub_suites"], "4")
def test_task_is_not_a_generate_resmoke_task(self):
task_name = "jsCore_auth"
task = _evergreen.Task({
"name":
task_name,
"commands": [{
"func": "run tests",
"vars": {"resmoke_args": "--suites=core_auth --storageEngine=wiredTiger"}
}],
})
burn_in_task_config = tests_by_task_stub()[task_name]
evg_conf_mock = MagicMock()
evg_conf_mock.get_variant.return_value.get_task.return_value = task
evg_task_config = under_test._get_evg_task_configuration(evg_conf_mock, "variant",
task_name, burn_in_task_config)
self.assertEqual(evg_task_config["task_name"], task_name)
self.assertEqual(evg_task_config["build_variant"], "variant")
self.assertEqual(
evg_task_config["selected_tests_to_run"],
{"jstests/core/currentop_waiting_for_latch.js", "jstests/core/latch_analyzer.js"})
self.assertEqual(evg_task_config["suite"], "core_auth")
self.assertEqual(
evg_task_config["resmoke_args"],
"--storageEngine=wiredTiger",
)
self.assertEqual(evg_task_config["fallback_num_sub_suites"], "1")
class TestGenerateShrubConfig(unittest.TestCase):
@patch(ns("_get_selected_tests_task_configuration"))
@patch(ns("_get_evg_task_configuration"))
@patch(ns("SelectedTestsConfigOptions"))
@patch(ns("GenerateSubSuites"))
def test_when_test_by_task_returned(
self, generate_subsuites_mock, selected_tests_config_options_mock,
get_evg_task_configuration_mock, get_selected_tests_task_configuration_mock):
evg_api = MagicMock()
evg_conf = MagicMock()
expansion_file = MagicMock()
tests_by_task = tests_by_task_stub()
yml_suite_file_contents = MagicMock()
shrub_json_file_contents = MagicMock()
suite_file_dict_mock = {"auth_0.yml": yml_suite_file_contents}
generate_subsuites_mock.return_value.generate_task_config_and_suites.return_value = (
suite_file_dict_mock,
shrub_json_file_contents,
)
config_file_dict = under_test._generate_shrub_config(evg_api, evg_conf, expansion_file,
tests_by_task, "variant")
self.assertEqual(
config_file_dict,
{
"auth_0.yml": yml_suite_file_contents,
"selected_tests_config.json": shrub_json_file_contents,
},
)
@patch(ns("_get_selected_tests_task_configuration"))
@patch(ns("_get_evg_task_configuration"))
@patch(ns("SelectedTestsConfigOptions"))
@patch(ns("GenerateSubSuites"))
def test_when_no_test_by_task_returned(
self, generate_subsuites_mock, selected_tests_config_options_mock,
get_evg_task_configuration_mock, get_selected_tests_task_configuration_mock):
evg_api = MagicMock()
evg_conf = MagicMock()
expansion_file = MagicMock()
tests_by_task = {}
yml_suite_file_contents = MagicMock()
shrub_json_file_contents = MagicMock()
suite_file_dict_mock = {"auth_0.yml": yml_suite_file_contents}
generate_subsuites_mock.return_value.generate_task_config_and_suites.return_value = (
suite_file_dict_mock,
shrub_json_file_contents,
)
config_file_dict = under_test._generate_shrub_config(evg_api, evg_conf, expansion_file,
tests_by_task, "variant")
self.assertEqual(config_file_dict, {})