diff --git a/DynamoDbEncryption/runtimes/java/build.gradle.kts b/DynamoDbEncryption/runtimes/java/build.gradle.kts index 016a38fe5b..ca0aff8033 100644 --- a/DynamoDbEncryption/runtimes/java/build.gradle.kts +++ b/DynamoDbEncryption/runtimes/java/build.gradle.kts @@ -98,6 +98,7 @@ dependencies { // For the DDB-EC with SDK v1 compileOnly("com.amazonaws:aws-java-sdk-dynamodb:1.12.780") + // For the DDB-EC with SDK V2 implementation("io.netty:netty-common:4.2.9.Final") diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index 8ce858e813..1ba1024ed7 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -56,6 +56,7 @@ import java.util.stream.Collectors; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; +import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -349,6 +350,14 @@ public void decryptWithECConfigTest() ); } + @AfterTest + public void tearDownDDBLocal() { + if (client != null) { + client.shutdown(); + client = null; + } + } + @Test(dataProvider = "getDecryptTestVectors") public void decryptTestVector(Scenario scenario) throws IOException { client = DynamoDBEmbedded.create().amazonDynamoDB(); @@ -1583,6 +1592,9 @@ private static String stripFilePath(String path) { return path.replaceFirst("file://", ""); } - @JsonDeserialize(using = AttributeValueDeserializer.class) - public static class DeserializedAttributeValue extends AttributeValue {} + @com.fasterxml.jackson.databind.annotation.JsonDeserialize( + using = AttributeValueDeserializer.class + ) + public static class DeserializedAttributeValue + extends com.amazonaws.services.dynamodbv2.model.AttributeValue {} } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java index b0b8c24839..ee82d1b012 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java @@ -26,6 +26,9 @@ import java.util.Map; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -47,30 +50,48 @@ public class CachingMostRecentProviderTests { private static final DynamoDBEncryptor ENCRYPTOR = DynamoDBEncryptor.getInstance(BASE_PROVIDER); - private AmazonDynamoDB client; - private Map methodCalls; + private static AmazonDynamoDB rawClient; + private static AmazonDynamoDB instrumentedClient; + private static Map methodCalls; private ProviderStore store; private EncryptionContext ctx; + // DDB Local client is created once per class since DynamoDBEmbedded.create() is expensive. + // Table is created/deleted per method to ensure test isolation, as tests assert + // exact DynamoDB call counts and expect a clean table with no leftover data. + @BeforeClass + public static void setupClient() { + methodCalls = new HashMap(); + rawClient = DynamoDBEmbedded.create().amazonDynamoDB(); + instrumentedClient = + instrument(rawClient, AmazonDynamoDB.class, methodCalls); + } + + @AfterClass + public static void tearDownDDBLocal() { + if (rawClient != null) { + rawClient.shutdown(); + rawClient = null; + } + } + @BeforeMethod public void setup() { - methodCalls = new HashMap(); - client = - instrument( - DynamoDBEmbedded.create().amazonDynamoDB(), - AmazonDynamoDB.class, - methodCalls - ); MetaStore.createTable( - client, + instrumentedClient, TABLE_NAME, new ProvisionedThroughput(1L, 1L) ); - store = new MetaStore(client, TABLE_NAME, ENCRYPTOR); + store = new MetaStore(instrumentedClient, TABLE_NAME, ENCRYPTOR); ctx = new EncryptionContext.Builder().build(); methodCalls.clear(); } + @AfterMethod + public void tearDown() { + rawClient.deleteTable(TABLE_NAME); + } + @Test public void testConstructors() { final CachingMostRecentProvider prov = new CachingMostRecentProvider( diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/mapper/integration/DynamoDBTestBase.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/mapper/integration/DynamoDBTestBase.java index 6c4be28481..ad2b485e2f 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/mapper/integration/DynamoDBTestBase.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/mapper/integration/DynamoDBTestBase.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; +import org.testng.annotations.AfterClass; public class DynamoDBTestBase { @@ -30,6 +31,14 @@ public static void setUpTestBase() { dynamo = DynamoDBEmbedded.create().amazonDynamoDB(); } + @AfterClass + public static void tearDownDDBLocal() { + if (dynamo != null) { + dynamo.shutdown(); + dynamo = null; + } + } + public static AmazonDynamoDB getClient() { if (dynamo == null) { setUpTestBase();