This is an automated email from the ASF dual-hosted git repository. joscorbe pushed a commit to branch OAK-11835 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 5a4bea300412c25d8e727543b2fbab38f1345205 Author: Jose Cordero <corde...@adobe.com> AuthorDate: Tue Aug 5 04:11:14 2025 +0200 OAK-11835: Added some test cases --- .../mongo/MongoDocumentNodeStoreBuilderBase.java | 1 - .../DocumentNodeStoreServiceConfigurationTest.java | 85 +++++++++ .../mongo/MongoConnectionPoolSettingsTest.java | 193 +++++++++++++++++++++ 3 files changed, 278 insertions(+), 1 deletion(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java index 1828a780ea..f561cb4959 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java @@ -164,7 +164,6 @@ public abstract class MongoDocumentNodeStoreBuilderBase<T extends MongoDocumentN * @return this builder. */ public T setLeaseSocketTimeout(int timeoutMillis) { - this.leaseSocketTimeout = timeoutMillis; return thisBuilder(); } diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java index c0d587e3da..d2eaf2d9d4 100644 --- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java +++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java @@ -363,6 +363,91 @@ public class DocumentNodeStoreServiceConfigurationTest { assertEquals(60000L, config.recoveryDelayMillis()); } + @Test + public void mongoConnectionPoolDefaults() throws IOException { + Configuration config = createConfiguration(); + + // Verify MongoDB connection pool defaults match MongoDB Java Driver defaults + assertEquals(100, config.mongoMaxPoolSize()); + assertEquals(0, config.mongoMinPoolSize()); + assertEquals(2, config.mongoMaxConnecting()); + assertEquals(0, config.mongoMaxIdleTimeMS()); + assertEquals(0, config.mongoMaxLifeTimeMS()); + assertEquals(60000, config.mongoWaitQueueTimeoutMS()); + assertEquals(10000, config.mongoConnectTimeoutMS()); + assertEquals(0, config.mongoReadTimeoutMS()); + assertEquals(5000, config.mongoHeartbeatFrequencyMS()); + assertEquals(500, config.mongoMinHeartbeatFrequencyMS()); + assertEquals(30000, config.mongoServerSelectionTimeoutMS()); + } + + @Test + public void mongoConnectionPoolCustomValues() throws IOException { + // Set custom values for all MongoDB connection pool parameters + addConfigurationEntry(preset, "mongoMaxPoolSize", 50); + addConfigurationEntry(preset, "mongoMinPoolSize", 5); + addConfigurationEntry(preset, "mongoMaxConnecting", 3); + addConfigurationEntry(preset, "mongoMaxIdleTimeMS", 60000); + addConfigurationEntry(preset, "mongoMaxLifeTimeMS", 300000); + addConfigurationEntry(preset, "mongoWaitQueueTimeoutMS", 30000); + addConfigurationEntry(preset, "mongoConnectTimeoutMS", 5000); + addConfigurationEntry(preset, "mongoReadTimeoutMS", 20000); + addConfigurationEntry(preset, "mongoHeartbeatFrequencyMS", 15000); + addConfigurationEntry(preset, "mongoMinHeartbeatFrequencyMS", 1000); + addConfigurationEntry(preset, "mongoServerSelectionTimeoutMS", 10000); + + Configuration config = createConfiguration(); + + // Verify custom values are properly applied + assertEquals(50, config.mongoMaxPoolSize()); + assertEquals(5, config.mongoMinPoolSize()); + assertEquals(3, config.mongoMaxConnecting()); + assertEquals(60000, config.mongoMaxIdleTimeMS()); + assertEquals(300000, config.mongoMaxLifeTimeMS()); + assertEquals(30000, config.mongoWaitQueueTimeoutMS()); + assertEquals(5000, config.mongoConnectTimeoutMS()); + assertEquals(20000, config.mongoReadTimeoutMS()); + assertEquals(15000, config.mongoHeartbeatFrequencyMS()); + assertEquals(1000, config.mongoMinHeartbeatFrequencyMS()); + assertEquals(10000, config.mongoServerSelectionTimeoutMS()); + } + + @Test + public void mongoConnectionPoolZeroValues() throws IOException { + // Test zero values (should be allowed for "unlimited/disabled" semantics) + addConfigurationEntry(preset, "mongoMaxIdleTimeMS", 0); + addConfigurationEntry(preset, "mongoMaxLifeTimeMS", 0); + addConfigurationEntry(preset, "mongoConnectTimeoutMS", 0); + addConfigurationEntry(preset, "mongoReadTimeoutMS", 0); + addConfigurationEntry(preset, "mongoServerSelectionTimeoutMS", 0); + + Configuration config = createConfiguration(); + + // Verify zero values are preserved (disabled/unlimited timeouts) + assertEquals(0, config.mongoMaxIdleTimeMS()); + assertEquals(0, config.mongoMaxLifeTimeMS()); + assertEquals(0, config.mongoConnectTimeoutMS()); + assertEquals(0, config.mongoReadTimeoutMS()); + assertEquals(0, config.mongoServerSelectionTimeoutMS()); + } + + @Test + public void mongoConnectionPoolSettingsIntegration() throws IOException { + // Set some custom MongoDB connection pool values + addConfigurationEntry(preset, "mongoMaxPoolSize", 50); + addConfigurationEntry(preset, "mongoReadTimeoutMS", 20000); + addConfigurationEntry(preset, "mongoConnectTimeoutMS", 5000); + addConfigurationEntry(preset, "mongoHeartbeatFrequencyMS", 15000); + + Configuration config = createConfiguration(); + + // Verify the configuration values are read correctly + assertEquals(50, config.mongoMaxPoolSize()); + assertEquals(20000, config.mongoReadTimeoutMS()); + assertEquals(5000, config.mongoConnectTimeoutMS()); + assertEquals(15000, config.mongoHeartbeatFrequencyMS()); + } + private Configuration createConfiguration() throws IOException { return DocumentNodeStoreServiceConfiguration.create( context.componentContext(), configAdmin, diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionPoolSettingsTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionPoolSettingsTest.java new file mode 100644 index 0000000000..9f9bcb4f28 --- /dev/null +++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionPoolSettingsTest.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.jackrabbit.oak.plugins.document.mongo; + +import com.mongodb.MongoClientSettings; +import org.junit.Test; + +import java.lang.reflect.Field; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.*; + +/** + * Tests for MongoDB connection pool settings configuration. + * These are unit tests that verify MongoClientSettings are built correctly. + */ +public class MongoConnectionPoolSettingsTest { + + /** + * Helper method to create a builder with URI and name set for testing, + * without actually connecting to MongoDB. + */ + private MongoDocumentNodeStoreBuilder createTestBuilder() throws Exception { + MongoDocumentNodeStoreBuilder builder = new MongoDocumentNodeStoreBuilder(); + + // Use reflection to set uri and name fields without connecting + Field uriField = MongoDocumentNodeStoreBuilderBase.class.getDeclaredField("uri"); + uriField.setAccessible(true); + uriField.set(builder, "mongodb://localhost:27017"); + + Field nameField = MongoDocumentNodeStoreBuilderBase.class.getDeclaredField("name"); + nameField.setAccessible(true); + nameField.set(builder, "test"); + + return builder; + } + + @Test + public void testDefaultMongoClientSettings() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder(); + + // Test default connection (isLease = false) + MongoClientSettings settings = builder.buildMongoClientSettings(false); + assertNotNull(settings); + + // Verify default connection pool settings + assertEquals(100, settings.getConnectionPoolSettings().getMaxSize()); + assertEquals(0, settings.getConnectionPoolSettings().getMinSize()); + assertEquals(2, settings.getConnectionPoolSettings().getMaxConnecting()); + + // Verify default socket settings + assertEquals(0, settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + assertEquals(10000, settings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + + // Verify default server settings + assertEquals(5000, settings.getServerSettings().getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + assertEquals(500, settings.getServerSettings().getMinHeartbeatFrequency(TimeUnit.MILLISECONDS)); + + // Verify default cluster settings + assertEquals(30000, settings.getClusterSettings().getServerSelectionTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testCustomMongoClientSettings() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder() + // Set custom connection pool settings + .setMongoMaxPoolSize(57) + .setMongoMinPoolSize(13) + .setMongoMaxConnecting(7) + .setMongoMaxIdleTimeMS(61113) + .setMongoMaxLifeTimeMS(303030) + .setMongoWaitQueueTimeoutMS(41091) + // Set custom socket settings + .setMongoConnectTimeoutMS(5123) + .setMongoReadTimeoutMS(29011) + // Set custom server settings + .setMongoHeartbeatFrequencyMS(15013) + .setMongoMinHeartbeatFrequencyMS(1009) + // Set custom cluster settings + .setMongoServerSelectionTimeoutMS(10999); + + // Test default connection (isLease = false) + MongoClientSettings settings = builder.buildMongoClientSettings(false); + + // Verify custom connection pool settings + assertEquals(57, settings.getConnectionPoolSettings().getMaxSize()); + assertEquals(13, settings.getConnectionPoolSettings().getMinSize()); + assertEquals(7, settings.getConnectionPoolSettings().getMaxConnecting()); + assertEquals(61113, settings.getConnectionPoolSettings().getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + assertEquals(303030, settings.getConnectionPoolSettings().getMaxConnectionLifeTime(TimeUnit.MILLISECONDS)); + assertEquals(41091, settings.getConnectionPoolSettings().getMaxWaitTime(TimeUnit.MILLISECONDS)); + + // Verify custom socket settings + assertEquals(5123, settings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + assertEquals(29011, settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + + // Verify custom server settings + assertEquals(15013, settings.getServerSettings().getHeartbeatFrequency(TimeUnit.MILLISECONDS)); + assertEquals(1009, settings.getServerSettings().getMinHeartbeatFrequency(TimeUnit.MILLISECONDS)); + + // Verify custom cluster settings + assertEquals(10999, settings.getClusterSettings().getServerSelectionTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testLeaseConnectionSocketTimeout() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder() + .setMongoReadTimeoutMS(55001) // Default connection timeout + .setLeaseSocketTimeout(33002); // Lease connection timeout + + // Test default connection pool (isLease = false) - should use readTimeout + MongoClientSettings mainSettings = builder.buildMongoClientSettings(false); + assertEquals(55001, mainSettings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + + // Test lease connection (isLease = true) - should use leaseSocketTimeout + MongoClientSettings leaseSettings = builder.buildMongoClientSettings(true); + assertEquals(33002, leaseSettings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testZeroTimeoutValues() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder() + .setMongoMaxIdleTimeMS(0) // Disabled + .setMongoMaxLifeTimeMS(0) // Disabled + .setMongoConnectTimeoutMS(0) // Disabled + .setMongoReadTimeoutMS(0) // Disabled + .setMongoServerSelectionTimeoutMS(0); // Disabled + + MongoClientSettings settings = builder.buildMongoClientSettings(false); + + // Verify zero values are preserved (unlimited/disabled timeouts) + assertEquals(0, settings.getConnectionPoolSettings().getMaxConnectionIdleTime(TimeUnit.MILLISECONDS)); + assertEquals(0, settings.getConnectionPoolSettings().getMaxConnectionLifeTime(TimeUnit.MILLISECONDS)); + assertEquals(0, settings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + assertEquals(0, settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + assertEquals(0, settings.getClusterSettings().getServerSelectionTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testMainConnectionWithoutReadTimeout() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder(); + // Don't set readTimeout (should default to 0) + + MongoClientSettings settings = builder.buildMongoClientSettings(false); + + // Main connection without explicit readTimeout should use 0 (unlimited) + assertEquals(0, settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testLeaseConnectionWithDefaultTimeout() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder(); + // Use default lease socket timeout (20000ms per DocumentNodeStoreService.DEFAULT_MONGO_LEASE_SO_TIMEOUT_MILLIS) + + MongoClientSettings settings = builder.buildMongoClientSettings(true); + + // Lease connection should use default lease socket timeout + assertEquals(60000, settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS)); + } + + @Test + public void testBuilderSettersReturnCorrectValues() throws Exception { + MongoDocumentNodeStoreBuilder builder = createTestBuilder() + .setMongoMaxPoolSize(75) + .setMongoMinPoolSize(10) + .setMongoConnectTimeoutMS(15000); + + // Test that setters return the builder itself + assertSame(builder, builder.setMongoMaxPoolSize(75)); + + // Test that settings are applied correctly + MongoClientSettings settings = builder.buildMongoClientSettings(false); + assertEquals(75, settings.getConnectionPoolSettings().getMaxSize()); + assertEquals(10, settings.getConnectionPoolSettings().getMinSize()); + assertEquals(15000, settings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS)); + } +} \ No newline at end of file