Skip to content

Commit 252bf73

Browse files
authored
add simple test for KMS (#54)
1 parent 6d4beb7 commit 252bf73

File tree

5 files changed

+111
-0
lines changed

5 files changed

+111
-0
lines changed

src/main/java/cloud/localstack/Localstack.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ public int getEdgePort() {
139139
public String getEndpointKinesis() {
140140
return endpointForService(ServiceName.KINESIS);
141141
}
142+
143+
public String getEndpointKMS() {
144+
return endpointForService(ServiceName.KMS);
145+
}
142146

143147
public String getEndpointLambda() {
144148
return endpointForService(ServiceName.LAMBDA);

src/main/java/cloud/localstack/ServiceName.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
public class ServiceName {
44
public static final String API_GATEWAY = "apigateway";
55
public static final String KINESIS = "kinesis";
6+
public static final String KMS = "kms";
67
public static final String DYNAMO = "dynamodb";
78
public static final String DYNAMO_STREAMS = "dynamodbstreams";
89
public static final String ELASTICSEARCH = "elasticsearch";

src/main/java/cloud/localstack/awssdkv1/PowerMockLocalStack.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
import com.amazonaws.services.kinesis.AmazonKinesisAsync;
2323
import com.amazonaws.services.kinesis.AmazonKinesisAsyncClientBuilder;
2424
import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder;
25+
import com.amazonaws.services.kms.AWSKMS;
26+
import com.amazonaws.services.kms.AWSKMSAsync;
27+
import com.amazonaws.services.kms.AWSKMSAsyncClientBuilder;
28+
import com.amazonaws.services.kms.AWSKMSClientBuilder;
2529
import com.amazonaws.services.lambda.AWSLambda;
2630
import com.amazonaws.services.lambda.AWSLambdaAsync;
2731
import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
@@ -57,6 +61,7 @@
5761
AWSLambdaClientBuilder.class, AWSLogsClientBuilder.class, AWSLogsAsyncClientBuilder.class,
5862
AmazonS3ClientBuilder.class, AmazonSimpleEmailServiceAsyncClientBuilder.class,
5963
AmazonSimpleEmailServiceClientBuilder.class, AmazonSNSAsyncClientBuilder.class, AmazonSNSClientBuilder.class,
64+
AWSKMSClientBuilder.class, AWSKMSAsyncClientBuilder.class,
6065
AWSSecretsManagerClientBuilder.class, AmazonSQSClientBuilder.class })
6166
@PowerMockIgnore({ "javax.crypto.*", "org.hamcrest.*", "javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*",
6267
"org.xml.*", "javax.management.*", "javax.security.*", "org.w3c.*" })
@@ -97,6 +102,18 @@ public static void mockKinesis() {
97102
PowerMockito.mockStatic(AmazonKinesisClientBuilder.class);
98103
when(AmazonKinesisClientBuilder.defaultClient()).thenReturn(mockService);
99104
}
105+
106+
public static void mockKMS() {
107+
AWSKMS mockService = TestUtils.getClientKMS();
108+
PowerMockito.mockStatic(AWSKMSClientBuilder.class);
109+
when(AWSKMSClientBuilder.defaultClient()).thenReturn(mockService);
110+
}
111+
112+
public static void mockKMSAsync() {
113+
AWSKMSAsync mockService = TestUtils.getClientKMSAsync();
114+
PowerMockito.mockStatic(AWSKMSAsyncClientBuilder.class);
115+
when(AWSKMSAsyncClientBuilder.defaultClient()).thenReturn(mockService);
116+
}
100117

101118
public static void mockKinesisAsync() {
102119
AmazonKinesisAsync mockServiceAsync = TestUtils.getClientKinesisAsync();

src/main/java/cloud/localstack/awssdkv1/TestUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
import com.amazonaws.services.kinesis.AmazonKinesisAsync;
2121
import com.amazonaws.services.kinesis.AmazonKinesisAsyncClientBuilder;
2222
import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder;
23+
import com.amazonaws.services.kms.AWSKMS;
24+
import com.amazonaws.services.kms.AWSKMSAsync;
25+
import com.amazonaws.services.kms.AWSKMSAsyncClientBuilder;
26+
import com.amazonaws.services.kms.AWSKMSClientBuilder;
2327
import com.amazonaws.services.lambda.AWSLambda;
2428
import com.amazonaws.services.lambda.AWSLambdaAsync;
2529
import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
@@ -203,6 +207,17 @@ public static AmazonIdentityManagementAsync getClientIAMAsync() {
203207
withCredentials(getCredentialsProvider()).build();
204208
}
205209

210+
public static AWSKMS getClientKMS(){
211+
return AWSKMSClientBuilder.standard().
212+
withEndpointConfiguration(getEndpointConfigurationKMS()).
213+
withCredentials(getCredentialsProvider()).build();
214+
}
215+
216+
public static AWSKMSAsync getClientKMSAsync(){
217+
return AWSKMSAsyncClientBuilder.standard().
218+
withEndpointConfiguration(getEndpointConfigurationKMS()).
219+
withCredentials(getCredentialsProvider()).build();
220+
}
206221

207222
protected static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationIAM() {
208223
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointIAM());
@@ -255,6 +270,10 @@ protected static AwsClientBuilder.EndpointConfiguration getEndpointConfiguration
255270
protected static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationStepFunctions() {
256271
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointStepFunctions());
257272
}
273+
274+
protected static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationKMS() {
275+
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointKMS());
276+
}
258277

259278
/**
260279
* UTIL METHODS
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package cloud.localstack;
2+
3+
import cloud.localstack.awssdkv1.PowerMockLocalStack;
4+
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.assertNotNull;
7+
8+
import java.nio.ByteBuffer;
9+
10+
import com.amazonaws.services.kms.AWSKMS;
11+
import com.amazonaws.services.kms.AWSKMSClientBuilder;
12+
import com.amazonaws.services.kms.model.CreateKeyRequest;
13+
import com.amazonaws.services.kms.model.CreateKeyResult;
14+
import com.amazonaws.services.kms.model.DecryptRequest;
15+
import com.amazonaws.services.kms.model.DecryptResult;
16+
import com.amazonaws.services.kms.model.EncryptRequest;
17+
import com.amazonaws.services.kms.model.EncryptResult;
18+
19+
import org.junit.Assert;
20+
import org.junit.Before;
21+
import org.junit.Test;
22+
23+
/**
24+
* Test integration of KMS with LocalStack
25+
*/
26+
public class KMSTest extends PowerMockLocalStack {
27+
private AWSKMS awskms;
28+
private String keyId = "";
29+
30+
@Before
31+
public void mock() {
32+
PowerMockLocalStack.mockKMS();
33+
awskms = AWSKMSClientBuilder.defaultClient();
34+
}
35+
36+
@Test
37+
public void createKeyTest() throws Exception {
38+
CreateKeyRequest request = new CreateKeyRequest().withDescription("test key");
39+
CreateKeyResult result = awskms.createKey(request);
40+
keyId = result.getKeyMetadata().getKeyId();
41+
Assert.assertNotNull(keyId);
42+
}
43+
44+
@Test
45+
public void stringEncriptionTest() throws Exception {
46+
if(keyId.isEmpty()){
47+
createKeyTest();
48+
}
49+
50+
String testMessage = "hey, this is a test of encryption";
51+
byte[] encodedMessage = encrypt(testMessage.getBytes());
52+
byte[] decodedMessage = decrypt(encodedMessage);
53+
String resultMessage = new String(decodedMessage);
54+
55+
Assert.assertEquals(testMessage, resultMessage);
56+
}
57+
58+
public byte[] encrypt(byte[] input) {
59+
ByteBuffer buffer = ByteBuffer.wrap(input);
60+
EncryptResult result = awskms.encrypt(new EncryptRequest().withKeyId(keyId).withPlaintext(buffer));
61+
return result.getCiphertextBlob().array();
62+
}
63+
64+
public byte[] decrypt(byte[] input) {
65+
ByteBuffer buffer = ByteBuffer.wrap(input);
66+
DecryptResult result = awskms.decrypt(new DecryptRequest().withCiphertextBlob(buffer));
67+
return result.getPlaintext().array();
68+
}
69+
70+
}

0 commit comments

Comments
 (0)