def test_teardown_called_on_slave_when_no_subjobs_remain(self): build = Build(BuildRequest({})) slave = Slave('', 1) slave.teardown = MagicMock() slave.free_executor = MagicMock(return_value=0) build._unstarted_subjobs = Queue() build.execute_next_subjob_on_slave(slave) slave.teardown.assert_called_with()
def test_teardown_called_on_slave_when_no_subjobs_remain(self): build = Build(BuildRequest({})) slave = Slave('', 1) slave.teardown = MagicMock() slave.free_executor = MagicMock(return_value=0) build._unstarted_subjobs = Queue() build._slaves_allocated = [slave] build.execute_next_subjob_on_slave(slave) slave.teardown.assert_called_with()
def test_execute_next_subjob_with_empty_queue_cant_teardown_same_slave_twice( self): build = Build(BuildRequest({})) build._unstarted_subjobs = Queue() slave = Mock() slave.free_executor = Mock(return_value=0) build._slaves_allocated.append(slave) build.execute_next_subjob_on_slave(slave) build.execute_next_subjob_on_slave(slave) self.assertEqual(slave.teardown.call_count, 1, "Teardown should only be called once")
def test_build_doesnt_use_more_than_max_executors_per_slave(self): subjobs = self._create_subjobs() mock_project_type = self._create_mock_project_type() fake_setup_command = 'mock command' mock_slaves = [ self._create_mock_slave(num_executors=5) for _ in range(3) ] max_executors_per_slave = 2 expected_total_num_executors_used = 6 # We expect the build to use 2 executors on each of the 3 slaves. build = Build(BuildRequest({'setup': fake_setup_command})) build.execute_next_subjob_on_slave = MagicMock() build.prepare( subjobs, mock_project_type, self._create_job_config( max_executors_per_slave=max_executors_per_slave)) [build.allocate_slave(mock_slave) for mock_slave in mock_slaves] expected_current_num_executors_used = 0 for i in range(len(mock_slaves)): build.begin_subjob_executions_on_slave(mock_slaves[i]) expected_current_num_executors_used += max_executors_per_slave self.assertEqual( build.execute_next_subjob_on_slave.call_count, expected_current_num_executors_used, 'After allocating {} slaves, build with max_executors_per_slave set to {} should only be using {} ' 'executors.'.format(i + 1, max_executors_per_slave, expected_current_num_executors_used)) self.assertEqual( build.execute_next_subjob_on_slave.call_count, expected_total_num_executors_used, 'Build should start executing as many subjobs per slave as its max_executors_per_slave setting.' )
def test_build_doesnt_use_more_than_max_executors(self): subjobs = self._create_subjobs() mock_project_type = self._create_mock_project_type() fake_setup_command = 'mock command' mock_slaves = [ self._create_mock_slave(num_executors=5) for _ in range(3) ] expected_num_executors = 12 # We expect the build to use 12 out of 15 available executors. build = Build(BuildRequest({'setup': fake_setup_command})) build.execute_next_subjob_on_slave = MagicMock() build.prepare( subjobs, mock_project_type, self._create_job_config(max_executors=expected_num_executors)) [build.allocate_slave(mock_slave) for mock_slave in mock_slaves] [ build.begin_subjob_executions_on_slave(mock_slave) for mock_slave in mock_slaves ] self.assertEqual( build.execute_next_subjob_on_slave.call_count, expected_num_executors, 'Build should start executing as many subjobs as its max_executors setting.' )
def test_handle_result_reported_from_slave_does_nothing_when_build_is_canceled( self): build_id = 1 slave_url = "url" build = Build(BuildRequest({})) build.handle_subjob_payload = Mock() build.mark_subjob_complete = Mock() build.execute_next_subjob_on_slave = Mock() master = ClusterMaster() master._all_builds_by_id[build_id] = build master._all_slaves_by_url[slave_url] = Mock() build._is_canceled = True master.handle_result_reported_from_slave(slave_url, build_id, 1) self.assertEqual(build.handle_subjob_payload.call_count, 0, "Build is canceled, should not handle payload") self.assertEqual(build.mark_subjob_complete.call_count, 0, "Build is canceled, should not complete subjobs") self.assertEqual(build.execute_next_subjob_on_slave.call_count, 0, "Build is canceled, should not do next subjob")