Skip to content

Fixed KMS master key provider tests when default AWS region is configured #179

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 2, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions test/unit/test_providers_kms_master_key_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# language governing permissions and limitations under the License.
"""Unit test suite from aws_encryption_sdk.key_providers.kms.KMSMasterKeyProvider"""
import botocore.client
import botocore.session
import pytest
from mock import ANY, MagicMock, call, patch, sentinel

Expand All @@ -22,6 +23,19 @@
pytestmark = [pytest.mark.unit, pytest.mark.local]


@pytest.fixture(autouse=True, params=[True, False], ids=["default region", "no default region"])
def patch_default_region(request, monkeypatch):
"""Run all tests in this module both with a default region set and no default region set.

This ensures that we do not regress on default region handling.
https://github.com/aws/aws-encryption-sdk-python/issues/31
"""
if request.param:
monkeypatch.setenv("AWS_DEFAULT_REGION", "us-west-2")
else:
monkeypatch.delenv("AWS_DEFAULT_REGION", raising=False)


def test_init_with_regionless_key_ids_and_region_names():
key_ids = ("alias/key_1",)
region_names = ("test-region-1",)
Expand All @@ -32,6 +46,7 @@ def test_init_with_regionless_key_ids_and_region_names():
class TestKMSMasterKeyProvider(object):
@pytest.fixture(autouse=True)
def apply_fixtures(self):
self.botocore_no_region_session = botocore.session.Session(session_vars={"region": (None, None, None, None)})
self.mock_botocore_session_patcher = patch("aws_encryption_sdk.key_providers.kms.botocore.session.Session")
self.mock_botocore_session = self.mock_botocore_session_patcher.start()
self.mock_boto3_session_patcher = patch("aws_encryption_sdk.key_providers.kms.boto3.session.Session")
Expand Down Expand Up @@ -69,19 +84,19 @@ def test_init_with_region_names(self, mock_add_clients):

@patch("aws_encryption_sdk.key_providers.kms.KMSMasterKeyProvider.add_regional_client")
def test_init_with_default_region_found(self, mock_add_regional_client):
test = KMSMasterKeyProvider()
test = KMSMasterKeyProvider(botocore_session=self.botocore_no_region_session)
assert test.default_region is None
with patch.object(
test.config.botocore_session, "get_config_variable", return_value=sentinel.default_region
) as mock_get_config:
test._process_config()
mock_get_config.assert_called_once_with("region")
assert test.default_region is sentinel.default_region
mock_add_regional_client.assert_called_once_with(sentinel.default_region)
mock_add_regional_client.assert_called_with(sentinel.default_region)

@patch("aws_encryption_sdk.key_providers.kms.KMSMasterKeyProvider.add_regional_client")
def test_init_with_default_region_not_found(self, mock_add_regional_client):
test = KMSMasterKeyProvider()
test = KMSMasterKeyProvider(botocore_session=self.botocore_no_region_session)
assert test.default_region is None
with patch.object(test.config.botocore_session, "get_config_variable", return_value=None) as mock_get_config:
test._process_config()
Expand All @@ -93,12 +108,12 @@ def test_add_regional_client_new(self):
test = KMSMasterKeyProvider()
test._regional_clients = {}
test.add_regional_client("ex_region_name")
self.mock_boto3_session.assert_called_once_with(region_name="ex_region_name", botocore_session=ANY)
self.mock_boto3_session_instance.client.assert_called_once_with("kms", config=test._user_agent_adding_config)
self.mock_boto3_session.assert_called_with(region_name="ex_region_name", botocore_session=ANY)
self.mock_boto3_session_instance.client.assert_called_with("kms", config=test._user_agent_adding_config)
assert test._regional_clients["ex_region_name"] is self.mock_boto3_client_instance

def test_add_regional_client_exists(self):
test = KMSMasterKeyProvider()
test = KMSMasterKeyProvider(botocore_session=self.botocore_no_region_session)
test._regional_clients["ex_region_name"] = sentinel.existing_client
test.add_regional_client("ex_region_name")
assert not self.mock_boto3_session.called
Expand All @@ -114,7 +129,7 @@ def test_client_valid_region_name(self, mock_add_client):
test = KMSMasterKeyProvider()
test._regional_clients["us-east-1"] = self.mock_boto3_client_instance
client = test._client("arn:aws:kms:us-east-1:222222222222:key/aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb")
mock_add_client.assert_called_once_with("us-east-1")
mock_add_client.assert_called_with("us-east-1")
assert client is self.mock_boto3_client_instance

@patch("aws_encryption_sdk.key_providers.kms.KMSMasterKeyProvider.add_regional_client")
Expand All @@ -124,10 +139,10 @@ def test_client_no_region_name_with_default(self, mock_add_client):
test._regional_clients[sentinel.default_region] = sentinel.default_client
client = test._client("")
assert client is sentinel.default_client
mock_add_client.assert_called_once_with(sentinel.default_region)
mock_add_client.assert_called_with(sentinel.default_region)

def test_client_no_region_name_without_default(self):
test = KMSMasterKeyProvider()
test = KMSMasterKeyProvider(botocore_session=self.botocore_no_region_session)
with pytest.raises(UnknownRegionError) as excinfo:
test._client("")
excinfo.match("No default region found and no region determinable from key id: *")
Expand Down