tripleo-ci/scripts/emit_releases_file/test_get_dlrn_hash.py

208 lines
7.4 KiB
Python

from emit_releases_file import get_dlrn_hash
import mock
import pytest
@mock.patch('logging.getLogger')
@mock.patch('requests.get')
def test_get_dlrn_hash_ok(mock_get, mock_logging):
mock_logger = mock.MagicMock()
mock_logging.return_value = mock_logger
mock_log_exception = mock.MagicMock()
mock_log_warning = mock.MagicMock()
mock_log_info = mock.MagicMock()
mock_logger.exception = mock_log_exception
mock_logger.warning = mock_log_warning
mock_logger.info = mock_log_info
mock_response = mock.Mock()
mock_response.ok = True
mock_response.text = (
'[delorean]\nname=delorean-openstack-nova-81c23c04'
'7e8e0fc03b54164921f49fdb4103202c\nbaseurl=https:/'
'/trunk.rdoproject.org/centos7/81/c2/81c23c047e8e0'
'fc03b54164921f49fdb4103202c_b333f915\nenabled=1\n'
'gpgcheck=0\npriority=1'
)
mock_get.return_value = mock_response
release = 'master'
hash_name = 'current-tripleo'
dlrn_hash = '81c23c047e8e0fc03b54164921f49fdb4103202c_b333f915'
repo_url = 'https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' % (
release,
hash_name,
)
assert (
get_dlrn_hash(release, hash_name, distro_name='centos', distro_version='7')
== dlrn_hash
)
mock_get.assert_called_once_with(repo_url, timeout=8)
mock_log_info.assert_called_once_with(
"Got DLRN hash: {} for the named "
"hash: {} on the {} "
"release".format(dlrn_hash, hash_name, release)
)
mock_log_warning.assert_not_called()
mock_log_exception.assert_not_called()
mock_get.reset_mock()
mock_log_info.reset_mock()
mock_response.text = '7e8e0fc03b54164921f49fdb4103202c'
mock_get.return_value = mock_response
release = 'master'
hash_name = 'current-tripleo'
dlrn_hash = '7e8e0fc03b54164921f49fdb4103202c'
repo_url = 'https://trunk.rdoproject.org/centos8-%s/%s/delorean.repo.md5' % (
release,
hash_name,
)
assert (
get_dlrn_hash(release, hash_name, distro_name='centos', distro_version='8')
== dlrn_hash
)
mock_get.assert_called_once_with(repo_url, timeout=8)
mock_log_info.assert_called_once_with(
"Got DLRN hash: {} for the named "
"hash: {} on the {} "
"release".format(dlrn_hash, hash_name, release)
)
mock_log_warning.assert_not_called()
mock_log_exception.assert_not_called()
@mock.patch('logging.getLogger')
@mock.patch('requests.get')
def test_null_response_raises_runtimeerror(mock_get, mock_logging):
mock_logger = mock.MagicMock()
mock_logging.return_value = mock_logger
mock_log_exception = mock.MagicMock()
mock_log_warning = mock.MagicMock()
mock_log_info = mock.MagicMock()
mock_logger.exception = mock_log_exception
mock_logger.warning = mock_log_warning
mock_logger.info = mock_log_info
release = 'master'
hash_name = 'current-tripleo'
repo_url = 'https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' % (
release,
hash_name,
)
mock_get.return_value = None
with pytest.raises(RuntimeError):
get_dlrn_hash(release, hash_name)
mock_get.assert_called_with(repo_url, timeout=8)
assert mock_get.call_count == 20
mock_log_info.assert_not_called()
mock_log_warning.assert_called_with(
"Attempt 20 of 20 to get DLRN hash " "failed to get a response."
)
assert mock_log_warning.call_count == 20
mock_log_exception.assert_not_called()
@mock.patch('logging.getLogger')
@mock.patch('requests.get')
def test_get_dlrn_hash_500_then_200(mock_get, mock_logging):
mock_logger = mock.MagicMock()
mock_logging.return_value = mock_logger
mock_log_exception = mock.MagicMock()
mock_log_warning = mock.MagicMock()
mock_log_info = mock.MagicMock()
mock_logger.exception = mock_log_exception
mock_logger.warning = mock_log_warning
mock_logger.info = mock_log_info
mock_response_ok = mock.Mock()
mock_response_ok.ok = True
mock_response_ok.text = (
'[delorean]\nname=delorean-openstack-nova-81c23c04'
'7e8e0fc03b54164921f49fdb4103202c\nbaseurl=https:/'
'/trunk.rdoproject.org/centos7/81/c2/81c23c047e8e0'
'fc03b54164921f49fdb4103202c_b333f915\nenabled=1\n'
'gpgcheck=0\npriority=1'
)
mock_response_bad = mock.Mock()
mock_response_bad.ok = False
mock_response_bad.status_code = 500
release = 'master'
hash_name = 'current-tripleo'
dlrn_hash = '81c23c047e8e0fc03b54164921f49fdb4103202c_b333f915'
repo_url = 'https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' % (
release,
hash_name,
)
mock_get.side_effect = [mock_response_bad, mock_response_ok]
assert get_dlrn_hash(release, hash_name, retries=20) == dlrn_hash
mock_get.assert_called_with(repo_url, timeout=8)
mock_log_info.assert_called_once_with(
"Got DLRN hash: {} for the named "
"hash: {} on the {} "
"release".format(dlrn_hash, hash_name, release)
)
mock_log_warning.assert_called_once_with(
"Attempt 1 of 20 to get DLRN " "hash returned status code 500."
)
mock_log_exception.assert_not_called()
@mock.patch('logging.getLogger')
@mock.patch('requests.get')
def test_get_dlrn_hash_timeout(mock_get, mock_logging):
mock_logger = mock.MagicMock()
mock_logging.return_value = mock_logger
mock_log_exception = mock.MagicMock()
mock_log_warning = mock.MagicMock()
mock_log_info = mock.MagicMock()
mock_logger.exception = mock_log_exception
mock_logger.warning = mock_log_warning
mock_logger.info = mock_log_info
release = 'master'
hash_name = 'current-tripleo'
repo_url = 'https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' % (
release,
hash_name,
)
mock_get_exception = Exception("We need more power!")
mock_get.side_effect = mock_get_exception
with pytest.raises(RuntimeError):
get_dlrn_hash(release, hash_name, retries=20)
mock_get.assert_called_with(repo_url, timeout=8)
mock_log_info.assert_not_called()
mock_log_warning.assert_called_with(
"Attempt 20 of 20 to get DLRN hash " "threw an exception."
)
assert mock_log_warning.call_count == 20
mock_log_exception.assert_called_with(mock_get_exception)
assert mock_log_exception.call_count == 20
@mock.patch('logging.getLogger')
@mock.patch('requests.get')
def test_get_dlrn_hash_500_10_times(mock_get, mock_logging):
mock_logger = mock.MagicMock()
mock_logging.return_value = mock_logger
mock_log_exception = mock.MagicMock()
mock_log_warning = mock.MagicMock()
mock_log_info = mock.MagicMock()
mock_logger.exception = mock_log_exception
mock_logger.warning = mock_log_warning
mock_logger.info = mock_log_info
mock_response = mock.Mock()
mock_response.ok = False
mock_response.status_code = 500
release = 'master'
hash_name = 'current-tripleo'
repo_url = 'https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' % (
release,
hash_name,
)
mock_get.return_value = mock_response
with pytest.raises(RuntimeError):
get_dlrn_hash(release, hash_name, retries=20)
mock_get.assert_called_with(repo_url, timeout=8)
mock_log_info.assert_not_called()
mock_log_warning.assert_called_with(
"Attempt 20 of 20 to get DLRN hash " "returned status code 500."
)
assert mock_log_warning.call_count == 20
mock_log_exception.assert_not_called()