From 3e70d9a570362ffe2aea054ffa8f17659566e4f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 9 Feb 2022 10:33:36 +0800 Subject: [PATCH] Addresses Changes --- .../datamodeling/internal/AttributeValueMarshaller.java | 6 +++++- .../datamodeling/encryption/DynamoDBEncryptorTest.java | 1 + .../internal/AttributeValueMarshallerTest.java | 9 +++------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshaller.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshaller.java index 26622af4..7082ad08 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshaller.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshaller.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.TreeMap; import java.util.List; import java.util.Map; @@ -119,7 +120,10 @@ private static void marshall(final AttributeValue attributeValue, final DataOutp marshall(attr, out); } } else if (attributeValue.getM() != null) { - final Map m = attributeValue.getM(); + // Using TreeMap to ensure deterministic entry order + final Map m = new TreeMap<>(attributeValue.getM()); + // Update the deterministic order to attributeValue + attributeValue.setM(m); final List mKeys = new ArrayList(m.keySet()); Collections.sort(mKeys); out.writeChar('M'); diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptorTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptorTest.java index 32a22993..9d7496ac 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptorTest.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptorTest.java @@ -199,6 +199,7 @@ public void ensureEncryptedAttributesUnmodified() throws GeneralSecurityExceptio Map encryptedAttributes = encryptor.encryptAllFieldsExcept( Collections.unmodifiableMap(attribs), context, "hashKey", "rangeKey", "version"); + // Using TreeMap before casting to string to avoid nondeterministic key orders. String encryptedString = new TreeMap<>(encryptedAttributes).toString(); encryptor.decryptAllFieldsExcept( Collections.unmodifiableMap(encryptedAttributes), diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshallerTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshallerTest.java index 904624e4..523a1958 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshallerTest.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/AttributeValueMarshallerTest.java @@ -266,12 +266,9 @@ public void testSimpleMapWithNull() { marshall(av); Assert.fail("Unexpected success"); } catch (final NullPointerException npe) { - // Map entries may permute under nondeterministic Java API - String npeMessage = npe.getMessage(); - String common = "Encountered null map value for key NullKeyValue while marshalling attribute value "; - String case1 = common + "{M: {KeyValue={S: ValueValue,}, NullKeyValue=null},}"; - String case2 = common + "{M: {NullKeyValue=null, KeyValue={S: ValueValue,}},}"; - Assert.assertTrue(case1.equals(npeMessage) || case2.equals(npeMessage)); + Assert.assertEquals( + "Encountered null map value for key NullKeyValue while marshalling attribute value {M: {KeyValue={S: ValueValue,}, NullKeyValue=null},}", + npe.getMessage()); } }