def setUp(self): super().setUp() self.patch('app.util.fs.create_dir') self.patch('app.util.fs.async_delete') self.patch('os.makedirs') self.mock_slave_allocator = self.patch( 'app.master.cluster_master.SlaveAllocator').return_value self.mock_scheduler_pool = self.patch( 'app.master.cluster_master.BuildSchedulerPool').return_value # mock datetime class inside cluster master self._mock_current_datetime = datetime(2018, 4, 1) self._mock_datetime = self.patch('app.master.cluster_master.datetime') self._mock_datetime.now.return_value = self._mock_current_datetime # Two threads are ran everytime we start up the ClusterMaster. We redirect the calls to # `ThreadPoolExecutor.submit` through a mock proxy so we can capture events. self.thread_pool_executor = ThreadPoolExecutor(max_workers=2) self._thread_pool_executor_cls = self.patch( 'app.master.cluster_master.ThreadPoolExecutor') self._thread_pool_executor_cls.return_value.submit.side_effect = \ self.thread_pool_executor.submit SlaveRegistry.reset_singleton() Configuration['pagination_offset'] = self._PAGINATION_OFFSET Configuration['pagination_limit'] = self._PAGINATION_LIMIT Configuration['pagination_max_limit'] = self._PAGINATION_MAX_LIMIT
def setUp(self): # Configure logging to go to stdout. This makes debugging easier by allowing us to see logs for failed tests. log.configure_logging('DEBUG') self._reset_config() Secret.set('testsecret') SlaveRegistry.reset_singleton() self.cluster = FunctionalTestCluster(verbose=self._get_test_verbosity()) self._network = Network()
def setUp(self): super().setUp() self.addCleanup(patch.stopall) self._patched_items = {} self._blacklist_methods_not_allowed_in_unit_tests() # Stub out a few library dependencies that launch subprocesses. self.patch( 'app.util.autoversioning.get_version').return_value = '0.0.0' self.patch('app.util.conf.base_config_loader.platform.node' ).return_value = self._fake_hostname if self._do_network_mocks: # requests.Session() also makes some subprocess calls on instantiation. self.patch('app.util.network.requests.Session') # Stub out Network.are_hosts_same() call with a simple string comparison. self.patch('app.util.network.Network.are_hosts_same', new=lambda host_a, host_b: host_a == host_b) # Reset singletons so that they get recreated for every test that uses them. Configuration.reset_singleton() UnhandledExceptionHandler.reset_singleton() SlaveRegistry.reset_singleton() # Explicitly initialize UnhandledExceptionHandler singleton here (on the main thread) since it sets up signal # handlers that must execute on the main thread. UnhandledExceptionHandler.singleton() MasterConfigLoader().configure_defaults(Configuration.singleton()) MasterConfigLoader().configure_postload(Configuration.singleton()) self.patch( 'app.util.conf.master_config_loader.MasterConfigLoader.load_from_config_file' ) # Reset counters Slave._slave_id_counter = Counter() Build._build_id_counter = Counter() analytics._event_id_generator = Counter() # Configure logging to go to stdout. This makes debugging easier by allowing us to see logs for failed tests. log.configure_logging('DEBUG') # Then stub out configure_logging so we don't end up logging to real files during testing. self.patch('app.util.log.configure_logging') # Set up TestHandler. This allows asserting on log messages in tests. self.log_handler = logbook.TestHandler(bubble=True) self.log_handler.push_application() self._base_setup_called = True
def test_slave_reconnection_does_not_take_down_master(self): SlaveRegistry.reset_singleton() test_config = JOB_WITH_SETUP_AND_TEARDOWN job_config = yaml.safe_load( test_config.config[os.name])['JobWithSetupAndTeardown'] master = self.cluster.start_master() # Start a slave, hard kill it, then reconnect it. self.cluster.start_slave(num_executors_per_slave=5, start_port=43001) self.cluster.kill_slaves(kill_gracefully=False) # Make sure the slave restarts with the same port. slave = self.cluster.start_slave(num_executors_per_slave=5, start_port=43001) # Start two builds. project_dir_1 = tempfile.TemporaryDirectory() build_1 = master.post_new_build({ 'type': 'directory', 'config': job_config, 'project_directory': project_dir_1.name, }) project_dir_2 = tempfile.TemporaryDirectory() build_2 = master.post_new_build({ 'type': 'directory', 'config': job_config, 'project_directory': project_dir_2.name, }) self.assertTrue( master.block_until_build_finished(build_1['build_id'], timeout=45), 'Build 1 should finish building within the timeout.') self.assertTrue( master.block_until_build_finished(build_2['build_id'], timeout=45), 'Build 2 should finish building within the timeout.') slave.block_until_idle( timeout=20 ) # ensure slave teardown has finished before making assertions self._assert_build_completed_as_expected(build_1['build_id'], test_config, project_dir_1) self._assert_build_completed_as_expected(build_2['build_id'], test_config, project_dir_2)
def setUp(self): super().setUp() self.addCleanup(patch.stopall) self._patched_items = {} self._blacklist_methods_not_allowed_in_unit_tests() # Stub out a few library dependencies that launch subprocesses. self.patch('app.util.autoversioning.get_version').return_value = '0.0.0' self.patch('app.util.conf.base_config_loader.platform.node').return_value = self._fake_hostname if self._do_network_mocks: # requests.Session() also makes some subprocess calls on instantiation. self.patch('app.util.network.requests.Session') # Stub out Network.are_hosts_same() call with a simple string comparison. self.patch('app.util.network.Network.are_hosts_same', new=lambda host_a, host_b: host_a == host_b) # Reset singletons so that they get recreated for every test that uses them. Configuration.reset_singleton() UnhandledExceptionHandler.reset_singleton() SlaveRegistry.reset_singleton() # Explicitly initialize UnhandledExceptionHandler singleton here (on the main thread) since it sets up signal # handlers that must execute on the main thread. UnhandledExceptionHandler.singleton() MasterConfigLoader().configure_defaults(Configuration.singleton()) MasterConfigLoader().configure_postload(Configuration.singleton()) self.patch('app.util.conf.master_config_loader.MasterConfigLoader.load_from_config_file') # Reset counters Slave._slave_id_counter = Counter() Build._build_id_counter = Counter() analytics._event_id_generator = Counter() # Configure logging to go to stdout. This makes debugging easier by allowing us to see logs for failed tests. log.configure_logging('DEBUG') # Then stub out configure_logging so we don't end up logging to real files during testing. self.patch('app.util.log.configure_logging') # Set up TestHandler. This allows asserting on log messages in tests. self.log_handler = logbook.TestHandler(bubble=True) self.log_handler.push_application() self._base_setup_called = True
def setUp(self): super().setUp() SlaveRegistry.reset_singleton()