2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.persistence.dynamodb.internal;
15 import static org.junit.jupiter.api.Assertions.*;
18 import java.nio.file.Files;
19 import java.nio.file.Path;
20 import java.nio.file.Paths;
21 import java.nio.file.StandardOpenOption;
22 import java.util.Collections;
23 import java.util.HashMap;
25 import java.util.Optional;
27 import org.eclipse.jdt.annotation.NonNullByDefault;
28 import org.junit.jupiter.api.Test;
29 import org.junit.jupiter.api.io.TempDir;
31 import software.amazon.awssdk.core.retry.RetryMode;
32 import software.amazon.awssdk.core.retry.RetryPolicy;
33 import software.amazon.awssdk.regions.Region;
37 * @author Sami Salonen - Initial contribution
41 public class DynamoDBConfigTest {
43 private static Map<String, Object> mapFrom(String... args) {
44 assert args.length % 2 == 0;
45 Map<String, String> config = new HashMap<>();
46 for (int i = 1; i < args.length; i++) {
47 String key = args[i - 1];
51 return Collections.unmodifiableMap(config);
54 public @TempDir @NonNullByDefault({}) File folder;
57 public void testEmpty() throws Exception {
58 assertNull(DynamoDBConfig.fromConfig(new HashMap<>()));
62 public void testInvalidRegion() throws Exception {
63 assertNull(DynamoDBConfig.fromConfig(Map.of("region", "foobie")));
67 public void testRegionOnly() throws Exception {
68 assertNull(DynamoDBConfig.fromConfig(Map.of("region", "eu-west-1")));
72 public void testRegionWithAccessKeys() throws Exception {
73 DynamoDBConfig fromConfig = DynamoDBConfig
74 .fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1", "secretKey", "secret1"));
75 assert fromConfig != null;
76 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
77 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
78 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
79 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
80 assertEquals(1, fromConfig.getReadCapacityUnits());
81 assertEquals(1, fromConfig.getWriteCapacityUnits());
82 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
83 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
86 @SuppressWarnings("null")
88 public void testRegionWithProfilesConfigFile() throws Exception {
89 Path credsFile = Files.createFile(Paths.get(folder.getPath(), "creds"));
90 Files.write(credsFile, ("""
92 aws_access_key_id=testAccessKey
93 aws_secret_access_key=testSecretKey
94 aws_session_token=testSessionToken
95 """).getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
97 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "profilesConfigFile",
98 credsFile.toAbsolutePath().toString(), "profile", "fooprofile"));
99 assertNotNull(fromConfig);
100 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
101 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
102 assertEquals(1, fromConfig.getReadCapacityUnits());
103 assertEquals(1, fromConfig.getWriteCapacityUnits());
104 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
105 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
108 @SuppressWarnings("null")
110 public void testProfilesConfigFileRetryMode() throws Exception {
111 Path credsFile = Files.createFile(Paths.get(folder.getPath(), "creds"));
112 Files.write(credsFile, ("""
114 aws_access_key_id=testAccessKey
115 aws_secret_access_key=testSecretKey
116 aws_session_token=testSessionToken
118 """).getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
120 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "profilesConfigFile",
121 credsFile.toAbsolutePath().toString(), "profile", "fooprofile"));
122 assertNotNull(fromConfig);
123 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
124 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
125 assertEquals(1, fromConfig.getReadCapacityUnits());
126 assertEquals(1, fromConfig.getWriteCapacityUnits());
127 assertEquals(Optional.of(RetryMode.LEGACY), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
128 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
132 public void testEmptyConfiguration() throws Exception {
133 assertNull(DynamoDBConfig.fromConfig(mapFrom()));
137 public void testRegionWithInvalidProfilesConfigFile() throws Exception {
138 Path credsFile = Files.createFile(Paths.get(folder.getPath(), "creds"));
139 Files.write(credsFile, ("""
141 aws_access_key_idINVALIDKEY=testAccessKey
142 aws_secret_access_key=testSecretKey
143 aws_session_token=testSessionToken
144 """).getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
146 assertNull(DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "profilesConfigFile",
147 credsFile.toFile().getAbsolutePath(), "profile", "fooprofile")));
151 public void testRegionWithProfilesConfigFileMissingProfile() throws Exception {
152 Path credsFile = Files.createFile(Paths.get(folder.getPath(), "creds"));
153 Files.write(credsFile, ("""
155 aws_access_key_id=testAccessKey
156 aws_secret_access_key=testSecretKey
157 aws_session_token=testSessionToken
158 """).getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
160 assertNull(DynamoDBConfig.fromConfig(
161 mapFrom("region", "eu-west-1", "profilesConfigFile", credsFile.toAbsolutePath().toString())));
164 @SuppressWarnings("null")
166 public void testRegionWithAccessKeysWithLegacyPrefix() throws Exception {
167 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1",
168 "secretKey", "secret1", "tablePrefix", "foobie-", "expireDays", "105"));
169 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
170 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
171 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
172 assertEquals("foobie-", fromConfig.getTablePrefixLegacy());
173 assertEquals(1, fromConfig.getReadCapacityUnits());
174 assertEquals(1, fromConfig.getWriteCapacityUnits());
175 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
176 assertEquals(ExpectedTableSchema.LEGACY, fromConfig.getTableRevision());
177 assertNull(fromConfig.getExpireDays()); // not supported with legacy
180 @SuppressWarnings("null")
182 public void testRegionWithAccessKeysWithTable() throws Exception {
183 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1",
184 "secretKey", "secret1", "table", "mytable", "expireDays", "105"));
185 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
186 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
187 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
188 assertEquals("mytable", fromConfig.getTable());
189 assertEquals(1, fromConfig.getReadCapacityUnits());
190 assertEquals(1, fromConfig.getWriteCapacityUnits());
191 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
192 assertEquals(ExpectedTableSchema.NEW, fromConfig.getTableRevision());
193 assertEquals(105, fromConfig.getExpireDays());
196 @SuppressWarnings("null")
198 public void testRegionWithAccessKeysWithoutPrefixWithReadCapacityUnits() throws Exception {
199 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1",
200 "secretKey", "secret1", "readCapacityUnits", "5", "expireDays", "105"));
201 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
202 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
203 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
204 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
205 assertEquals(5, fromConfig.getReadCapacityUnits());
206 assertEquals(1, fromConfig.getWriteCapacityUnits());
207 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
208 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
209 assertEquals(105, fromConfig.getExpireDays());
212 @SuppressWarnings("null")
214 public void testRegionWithAccessKeysWithoutPrefixWithWriteCapacityUnits() throws Exception {
215 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1",
216 "secretKey", "secret1", "writeCapacityUnits", "5"));
217 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
218 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
219 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
220 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
221 assertEquals(1, fromConfig.getReadCapacityUnits());
222 assertEquals(5, fromConfig.getWriteCapacityUnits());
223 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
224 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
225 assertNull(fromConfig.getExpireDays()); // default is null
228 @SuppressWarnings("null")
230 public void testRegionWithAccessKeysWithoutPrefixWithReadWriteCapacityUnits() throws Exception {
231 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(mapFrom("region", "eu-west-1", "accessKey", "access1",
232 "secretKey", "secret1", "readCapacityUnits", "3", "writeCapacityUnits", "5", "expireDays", "105"));
233 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
234 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
235 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
236 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
237 assertEquals(3, fromConfig.getReadCapacityUnits());
238 assertEquals(5, fromConfig.getWriteCapacityUnits());
239 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
240 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());
243 @SuppressWarnings("null")
245 public void testRegionWithAccessKeysWithPrefixWithReadWriteCapacityUnitsWithBufferSettings() throws Exception {
246 DynamoDBConfig fromConfig = DynamoDBConfig.fromConfig(
247 mapFrom("region", "eu-west-1", "accessKey", "access1", "secretKey", "secret1", "readCapacityUnits", "3",
248 "writeCapacityUnits", "5", "bufferCommitIntervalMillis", "501", "bufferSize", "112"));
249 assertEquals(Region.EU_WEST_1, fromConfig.getRegion());
250 assertEquals("access1", fromConfig.getCredentials().accessKeyId());
251 assertEquals("secret1", fromConfig.getCredentials().secretAccessKey());
252 assertEquals("openhab-", fromConfig.getTablePrefixLegacy());
253 assertEquals(3, fromConfig.getReadCapacityUnits());
254 assertEquals(5, fromConfig.getWriteCapacityUnits());
255 assertEquals(Optional.empty(), fromConfig.getRetryPolicy().map(RetryPolicy::retryMode));
256 assertEquals(ExpectedTableSchema.MAYBE_LEGACY, fromConfig.getTableRevision());