From e5b55c2e47b44afb48eb657d8033adf7fec0414c Mon Sep 17 00:00:00 2001 From: Julia Lee <5765049+sxhinzvc@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:50:33 -0400 Subject: [PATCH 1/3] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 366786fc6d..a872f8d0ac 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-GH-4446-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 2de4b6b635..d052213c58 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-GH-4446-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 060a6d0dd9..b818a36590 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-GH-4446-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index dc07f13ccc..7632cf8266 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-GH-4446-SNAPSHOT ../pom.xml From 6968f4b34e28f81a6a637bf151b83af800d0b227 Mon Sep 17 00:00:00 2001 From: Julia Lee <5765049+sxhinzvc@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:52:12 -0400 Subject: [PATCH 2/3] Fix test setup so that temporal conversions use symmetric timezone setting. Closes: #4446 --- .../mongodb/core/convert/MappingMongoConverterUnitTests.java | 4 ++-- .../mongodb/core/encryption/AbstractEncryptionTestBase.java | 3 ++- .../mongodb/core/encryption/BypassAutoEncryptionTest.java | 3 ++- .../data/mongodb/core/encryption/EncryptionTests.java | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index ea081dd8f7..c9fb53f8fc 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -2619,7 +2619,7 @@ void readsMapThatDoesNotComeAsDocument() { void projectShouldReadSimpleInterfaceProjection() { org.bson.Document source = new org.bson.Document("birthDate", - Date.from(LocalDate.of(1999, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC))).append("foo", "Walter"); + Date.from(LocalDate.of(1999, 12, 1).atStartOfDay(systemDefault()).toInstant())).append("foo", "Walter"); EntityProjectionIntrospector discoverer = EntityProjectionIntrospector.create(converter.getProjectionFactory(), EntityProjectionIntrospector.ProjectionPredicate.typeHierarchy() @@ -2637,7 +2637,7 @@ void projectShouldReadSimpleInterfaceProjection() { void projectShouldReadSimpleDtoProjection() { org.bson.Document source = new org.bson.Document("birthDate", - Date.from(LocalDate.of(1999, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC))).append("foo", "Walter"); + Date.from(LocalDate.of(1999, 12, 1).atStartOfDay(systemDefault()).toInstant())).append("foo", "Walter"); EntityProjectionIntrospector introspector = EntityProjectionIntrospector.create(converter.getProjectionFactory(), EntityProjectionIntrospector.ProjectionPredicate.typeHierarchy() diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java index 473fad3d3f..280542130c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java @@ -450,7 +450,8 @@ public MongoClient mongoClient() { protected void configureConverters(MongoConverterConfigurationAdapter converterConfigurationAdapter) { converterConfigurationAdapter - .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)); + .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)) + .useNativeDriverJavaTimeCodecs(); } @Bean diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java index 90e6a9ba36..9b9097eab0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java @@ -78,7 +78,8 @@ protected void configureClientSettings(Builder builder) { protected void configureConverters(MongoConverterConfigurationAdapter converterConfigurationAdapter) { converterConfigurationAdapter - .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)); + .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)) + .useNativeDriverJavaTimeCodecs(); } @Bean diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java index 78a930c731..5e2a1926bc 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java @@ -74,7 +74,8 @@ public MongoClient mongoClient() { protected void configureConverters(MongoConverterConfigurationAdapter converterConfigurationAdapter) { converterConfigurationAdapter - .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)); + .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)) + .useNativeDriverJavaTimeCodecs(); } @Bean From 0e61a9032dea5fae936e5a3002cc7631be7d0104 Mon Sep 17 00:00:00 2001 From: Julia Lee <5765049+sxhinzvc@users.noreply.github.com> Date: Fri, 14 Jul 2023 13:05:16 -0400 Subject: [PATCH 3/3] Polishing - Remove duplicate test configuration --- .../MappingMongoConverterUnitTests.java | 2 +- .../AbstractEncryptionTestBase.java | 1 + .../encryption/BypassAutoEncryptionTest.java | 42 +------- .../core/encryption/EncryptionTests.java | 99 +------------------ 4 files changed, 7 insertions(+), 137 deletions(-) diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index c9fb53f8fc..8a3fac7797 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -25,7 +25,6 @@ import java.net.URL; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; import java.util.*; @@ -106,6 +105,7 @@ * @author Mark Paluch * @author Roman Puchkovskiy * @author Heesu Jung + * @author Julia Lee */ @ExtendWith(MockitoExtension.class) class MappingMongoConverterUnitTests { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java index 280542130c..393a0d12f2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/AbstractEncryptionTestBase.java @@ -70,6 +70,7 @@ /** * @author Christoph Strobl + * @author Julia Lee */ public abstract class AbstractEncryptionTestBase { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java index 9b9097eab0..6f44503495 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/BypassAutoEncryptionTest.java @@ -16,20 +16,10 @@ package org.springframework.data.mongodb.core.encryption; -import java.util.Collections; - -import org.bson.BsonBinary; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.convert.PropertyValueConverterFactory; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter; -import org.springframework.data.mongodb.core.convert.encryption.MongoEncryptionConverter; -import org.springframework.data.mongodb.core.encryption.BypassAutoEncryptionTest.Config; -import org.springframework.data.util.Lazy; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -38,16 +28,15 @@ import com.mongodb.MongoClientSettings.Builder; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; -import com.mongodb.client.model.vault.DataKeyOptions; -import com.mongodb.client.vault.ClientEncryptions; /** * Encryption tests for client having {@link AutoEncryptionSettings#isBypassAutoEncryption()}. * * @author Christoph Strobl + * @author Julia Lee */ @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Config.class) +@ContextConfiguration public class BypassAutoEncryptionTest extends AbstractEncryptionTestBase { @Disabled @@ -59,8 +48,6 @@ void altKeyDetection(@Autowired CachingMongoClientEncryption mongoClientEncrypti @Configuration static class Config extends EncryptionConfig { - @Autowired ApplicationContext applicationContext; - @Override protected void configureClientSettings(Builder builder) { @@ -74,31 +61,6 @@ protected void configureClientSettings(Builder builder) { .bypassAutoEncryption(true).build()); } - @Override - protected void configureConverters(MongoConverterConfigurationAdapter converterConfigurationAdapter) { - - converterConfigurationAdapter - .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)) - .useNativeDriverJavaTimeCodecs(); - } - - @Bean - @Override - MongoEncryptionConverter encryptingConverter(MongoClientEncryption mongoClientEncryption) { - - Lazy dataKey = Lazy.of(() -> mongoClientEncryption.getClientEncryption().createDataKey("local", - new DataKeyOptions().keyAltNames(Collections.singletonList("mySuperSecretKey")))); - - return new MongoEncryptionConverter(mongoClientEncryption, - EncryptionKeyResolver.annotated((ctx) -> EncryptionKey.keyId(dataKey.get()))); - } - - @Bean - @Override - CachingMongoClientEncryption clientEncryption(ClientEncryptionSettings encryptionSettings) { - return new CachingMongoClientEncryption(() -> ClientEncryptions.create(encryptionSettings)); - } - } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java index 5e2a1926bc..a36828cbce 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/EncryptionTests.java @@ -15,109 +15,16 @@ */ package org.springframework.data.mongodb.core.encryption; -import java.security.SecureRandom; -import java.util.Collections; -import java.util.Map; - -import org.bson.BsonBinary; -import org.bson.Document; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.convert.PropertyValueConverterFactory; -import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter; -import org.springframework.data.mongodb.core.convert.encryption.MongoEncryptionConverter; -import org.springframework.data.mongodb.core.encryption.EncryptionTests.Config; -import org.springframework.data.util.Lazy; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import com.mongodb.ClientEncryptionSettings; -import com.mongodb.ConnectionString; -import com.mongodb.MongoClientSettings; -import com.mongodb.MongoNamespace; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.Filters; -import com.mongodb.client.model.IndexOptions; -import com.mongodb.client.model.Indexes; -import com.mongodb.client.model.vault.DataKeyOptions; -import com.mongodb.client.vault.ClientEncryptions; - /** * @author Christoph Strobl + * @author Julia Lee */ @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Config.class) +@ContextConfiguration(classes = AbstractEncryptionTestBase.EncryptionConfig.class) public class EncryptionTests extends AbstractEncryptionTestBase { - @Configuration - static class Config extends AbstractMongoClientConfiguration { - - @Autowired ApplicationContext applicationContext; - - @Override - protected String getDatabaseName() { - return "fle-test"; - } - - @Bean - @Override - public MongoClient mongoClient() { - return super.mongoClient(); - } - - @Override - protected void configureConverters(MongoConverterConfigurationAdapter converterConfigurationAdapter) { - - converterConfigurationAdapter - .registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(applicationContext)) - .useNativeDriverJavaTimeCodecs(); - } - - @Bean - MongoEncryptionConverter encryptingConverter(MongoClientEncryption mongoClientEncryption) { - - Lazy dataKey = Lazy.of(() -> mongoClientEncryption.getClientEncryption().createDataKey("local", - new DataKeyOptions().keyAltNames(Collections.singletonList("mySuperSecretKey")))); - - return new MongoEncryptionConverter(mongoClientEncryption, - EncryptionKeyResolver.annotated((ctx) -> EncryptionKey.keyId(dataKey.get()))); - } - - @Bean - CachingMongoClientEncryption clientEncryption(ClientEncryptionSettings encryptionSettings) { - return new CachingMongoClientEncryption(() -> ClientEncryptions.create(encryptionSettings)); - } - - @Bean - ClientEncryptionSettings encryptionSettings(MongoClient mongoClient) { - - MongoNamespace keyVaultNamespace = new MongoNamespace("encryption.testKeyVault"); - MongoCollection keyVaultCollection = mongoClient.getDatabase(keyVaultNamespace.getDatabaseName()) - .getCollection(keyVaultNamespace.getCollectionName()); - keyVaultCollection.drop(); - // Ensure that two data keys cannot share the same keyAltName. - keyVaultCollection.createIndex(Indexes.ascending("keyAltNames"), - new IndexOptions().unique(true).partialFilterExpression(Filters.exists("keyAltNames"))); - - MongoCollection collection = mongoClient.getDatabase(getDatabaseName()).getCollection("test"); - collection.drop(); // Clear old data - - byte[] localMasterKey = new byte[96]; - new SecureRandom().nextBytes(localMasterKey); - Map> kmsProviders = Map.of("local", Map.of("key", localMasterKey)); - - // Create the ClientEncryption instance - return ClientEncryptionSettings.builder() - .keyVaultMongoClientSettings( - MongoClientSettings.builder().applyConnectionString(new ConnectionString("mongodb://localhost")).build()) // - .keyVaultNamespace(keyVaultNamespace.getFullName()) // - .kmsProviders(kmsProviders) // - .build(); - } - } -} +} \ No newline at end of file