Skip to content

Commit a7448ab

Browse files
committed
expand cache use testing and add functional tests relying on moto
1 parent 0dbf8d0 commit a7448ab

File tree

4 files changed

+84
-49
lines changed

4 files changed

+84
-49
lines changed

test/functional/functional_test_utils.py

+74-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from dynamodb_encryption_sdk.encrypted.table import EncryptedTable
3333
from dynamodb_encryption_sdk.identifiers import CryptoAction
3434
from dynamodb_encryption_sdk.internal.identifiers import ReservedAttributes
35+
from dynamodb_encryption_sdk.material_providers.most_recent import MostRecentProvider
3536
from dynamodb_encryption_sdk.material_providers.static import StaticCryptographicMaterialsProvider
3637
from dynamodb_encryption_sdk.material_providers.store.meta import MetaStore
3738
from dynamodb_encryption_sdk.material_providers.wrapped import WrappedCryptographicMaterialsProvider
@@ -74,7 +75,7 @@
7475

7576
@pytest.fixture
7677
def example_table():
77-
mock_dynamodb2().start()
78+
mock_dynamodb2().start(reset=False)
7879
ddb = boto3.client("dynamodb", region_name="us-west-2")
7980
ddb.create_table(
8081
TableName=TEST_TABLE_NAME,
@@ -94,7 +95,7 @@ def example_table():
9495

9596
@pytest.fixture
9697
def table_with_local_seconary_indexes():
97-
mock_dynamodb2().start()
98+
mock_dynamodb2().start(reset=False)
9899
ddb = boto3.client("dynamodb", region_name="us-west-2")
99100
ddb.create_table(
100101
TableName=TEST_TABLE_NAME,
@@ -126,8 +127,8 @@ def table_with_local_seconary_indexes():
126127

127128

128129
@pytest.fixture
129-
def table_with_global_seconary_indexes():
130-
mock_dynamodb2().start()
130+
def table_with_global_secondary_indexes():
131+
mock_dynamodb2().start(reset=False)
131132
ddb = boto3.client("dynamodb", region_name="us-west-2")
132133
ddb.create_table(
133134
TableName=TEST_TABLE_NAME,
@@ -676,3 +677,72 @@ def mock_metastore():
676677
metastore, table_name = build_metastore()
677678
yield metastore
678679
delete_metastore(table_name)
680+
681+
682+
def _count_entries(records, *messages):
683+
count = 0
684+
685+
for record in records:
686+
if all((message in record.getMessage() for message in messages)):
687+
count += 1
688+
689+
return count
690+
691+
692+
def _count_puts(records, table_name):
693+
return _count_entries(records, '"TableName": "{}"'.format(table_name), "OperationModel(name=PutItem)")
694+
695+
696+
def _count_gets(records, table_name):
697+
return _count_entries(records, '"TableName": "{}"'.format(table_name), "OperationModel(name=GetItem)")
698+
699+
700+
def check_metastore_cache_use_encrypt(metastore, table_name, log_capture):
701+
table = boto3.resource("dynamodb").Table(table_name)
702+
703+
most_recent_provider = MostRecentProvider(provider_store=metastore, material_name="test", version_ttl=600.0)
704+
e_table = EncryptedTable(
705+
table=table,
706+
materials_provider=most_recent_provider,
707+
)
708+
709+
item = diverse_item()
710+
item.update(TEST_KEY)
711+
e_table.put_item(Item=item)
712+
e_table.put_item(Item=item)
713+
e_table.put_item(Item=item)
714+
e_table.put_item(Item=item)
715+
716+
try:
717+
primary_puts = _count_puts(log_capture.records, e_table.name)
718+
metastore_puts = _count_puts(log_capture.records, metastore._table.name)
719+
720+
assert primary_puts == 4
721+
assert metastore_puts == 1
722+
723+
e_table.get_item(Key=TEST_KEY)
724+
e_table.get_item(Key=TEST_KEY)
725+
e_table.get_item(Key=TEST_KEY)
726+
727+
primary_gets = _count_gets(log_capture.records, e_table.name)
728+
metastore_gets = _count_gets(log_capture.records, metastore._table.name)
729+
metastore_puts = _count_puts(log_capture.records, metastore._table.name)
730+
731+
assert primary_gets == 3
732+
assert metastore_gets == 0
733+
assert metastore_puts == 1
734+
735+
most_recent_provider.refresh()
736+
737+
e_table.get_item(Key=TEST_KEY)
738+
e_table.get_item(Key=TEST_KEY)
739+
e_table.get_item(Key=TEST_KEY)
740+
741+
primary_gets = _count_gets(log_capture.records, e_table.name)
742+
metastore_gets = _count_gets(log_capture.records, metastore._table.name)
743+
744+
assert primary_gets == 6
745+
assert metastore_gets == 1
746+
747+
finally:
748+
e_table.delete_item(Key=TEST_KEY)

test/functional/material_providers/test_most_recent.py

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
from dynamodb_encryption_sdk.material_providers.most_recent import MostRecentProvider
2222
from dynamodb_encryption_sdk.material_providers.store import ProviderStore
2323

24+
from ..functional_test_utils import mock_metastore, example_table # pylint: disable=unused-import
25+
from ..functional_test_utils import TEST_TABLE_NAME, check_metastore_cache_use_encrypt
26+
2427
pytestmark = [pytest.mark.functional, pytest.mark.local]
2528

2629

@@ -130,3 +133,7 @@ def test_decryption_materials_cache_use():
130133
expected_calls.append(("version_from_material_description", 0))
131134

132135
assert store.provider_calls == expected_calls
136+
137+
138+
def test_cache_use_encrypt(mock_metastore, example_table, caplog):
139+
check_metastore_cache_use_encrypt(mock_metastore, TEST_TABLE_NAME, caplog)

test/functional/test_structures.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from .functional_test_utils import (
2222
TEST_TABLE_NAME,
2323
example_table,
24-
table_with_global_seconary_indexes,
24+
table_with_global_secondary_indexes,
2525
table_with_local_seconary_indexes,
2626
)
2727

test/integration/material_providers/test_most_recent.py

+2-44
Original file line numberDiff line numberDiff line change
@@ -11,58 +11,16 @@
1111
# ANY KIND, either express or implied. See the License for the specific
1212
# language governing permissions and limitations under the License.
1313
"""Load testing using MostRecentProvider and MetaStore."""
14-
import boto3
1514
import pytest
1615

17-
from dynamodb_encryption_sdk.encrypted.table import EncryptedTable
18-
from dynamodb_encryption_sdk.material_providers.most_recent import MostRecentProvider
19-
2016
from ..integration_test_utils import ( # pylint: disable=unused-import
2117
ddb_table_name,
22-
functional_test_utils,
2318
temp_metastore,
2419
)
20+
from ..integration_test_utils import functional_test_utils
2521

2622
pytestmark = [pytest.mark.integ, pytest.mark.ddb_integ]
2723

2824

29-
def count_entries(records, *messages):
30-
count = 0
31-
32-
for record in records:
33-
if all((message in record.getMessage() for message in messages)):
34-
count += 1
35-
36-
return count
37-
38-
39-
def count_puts(records, table_name):
40-
return count_entries(records, '"TableName": "{}"'.format(table_name), "OperationModel(name=PutItem)")
41-
42-
43-
def count_gets(records, table_name):
44-
return count_entries(records, '"TableName": "{}"'.format(table_name), "OperationModel(name=GetItem)")
45-
46-
4725
def test_cache_use_encrypt(temp_metastore, ddb_table_name, caplog):
48-
table = boto3.resource("dynamodb").Table(ddb_table_name)
49-
50-
e_table = EncryptedTable(
51-
table=table,
52-
materials_provider=MostRecentProvider(provider_store=temp_metastore, material_name="test", version_ttl=600.0),
53-
)
54-
55-
item = functional_test_utils.diverse_item()
56-
item.update(functional_test_utils.TEST_KEY)
57-
e_table.put_item(Item=item)
58-
e_table.put_item(Item=item)
59-
e_table.put_item(Item=item)
60-
e_table.put_item(Item=item)
61-
62-
e_table.delete_item(Key=functional_test_utils.TEST_KEY)
63-
64-
primary_puts = count_puts(caplog.records, ddb_table_name)
65-
metastore_puts = count_puts(caplog.records, temp_metastore._table.name)
66-
67-
assert primary_puts == 4
68-
assert metastore_puts == 1
26+
functional_test_utils.check_metastore_cache_use_encrypt(temp_metastore, ddb_table_name, caplog)

0 commit comments

Comments
 (0)