Skip to content

Override collection/database with infinite timeout. #1350

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@ public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection
public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
@Nullable final Timeout timeout,
final String message) {
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
() -> collection,
ms -> collection.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
if (timeout != null) {
return timeout.call(MILLISECONDS,
() -> collection.withTimeout(0, MILLISECONDS),
ms -> collection.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
}
return collection;
}

public static <T> Mono<MongoCollection<T>> collectionWithTimeoutMono(final MongoCollection<T> collection,
Expand All @@ -73,10 +76,13 @@ public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
final String message,
@Nullable final Timeout timeout) {
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
() -> database,
ms -> database.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
if (timeout != null) {
return timeout.call(MILLISECONDS,
() -> database.withTimeout(0, MILLISECONDS),
ms -> database.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
}
return database;
}

private static Mono<MongoDatabase> databaseWithTimeoutMono(final MongoDatabase database,
Expand All @@ -99,5 +105,4 @@ public static Mono<MongoDatabase> databaseWithTimeoutDeferred(final MongoDatabas
@Nullable final Timeout timeout) {
return Mono.defer(() -> databaseWithTimeoutMono(database, message, timeout));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import static com.mongodb.reactivestreams.client.internal.TimeoutHelper.databaseWithTimeout;
import static com.mongodb.reactivestreams.client.internal.TimeoutHelper.databaseWithTimeoutDeferred;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
Expand Down Expand Up @@ -82,39 +81,49 @@ void shouldNotSetRemainingTimeoutDatabaseWhenTimeoutIsNull() {
@Test
void shouldNotSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
//given
MongoCollection<Document> collection = mock(MongoCollection.class);
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
});

//when
MongoCollection<Document> result = collectionWithTimeout(collection, Timeout.infinite());
MongoCollection<Document> monoResult = collectionWithTimeoutMono(collection, Timeout.infinite()).block();
MongoCollection<Document> monoResultDeferred = collectionWithTimeoutDeferred(collection, Timeout.infinite()).block();

//then
assertEquals(collection, result);
assertEquals(collection, monoResult);
assertEquals(collection, monoResultDeferred);
assertEquals(collectionWithTimeout, result);
assertEquals(collectionWithTimeout, monoResult);
assertEquals(collectionWithTimeout, monoResultDeferred);
verify(collection, times(3))
.withTimeout(0L, TimeUnit.MILLISECONDS);
}

@Test
void shouldNotSetRemainingTimeoutOnDatabaseWhenTimeoutIsInfinite() {
//given
MongoDatabase database = mock(MongoDatabase.class);
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
});

//when
MongoDatabase result = databaseWithTimeout(database, TIMEOUT_ERROR_MESSAGE, Timeout.infinite());
MongoDatabase monoResultDeferred = databaseWithTimeoutDeferred(database, TIMEOUT_ERROR_MESSAGE, Timeout.infinite()).block();

//then
assertEquals(database, result);
assertEquals(database, monoResultDeferred);
assertEquals(databaseWithTimeout, result);
assertEquals(databaseWithTimeout, monoResultDeferred);
verify(database, times(2))
.withTimeout(0L, TimeUnit.MILLISECONDS);
}

@Test
void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
//given
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoCollection);
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
});
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);

Expand All @@ -126,17 +135,17 @@ void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
//then
verify(collection, times(3))
.withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
assertNotEquals(collectionWithTimeout, result);
assertNotEquals(collectionWithTimeout, monoResult);
assertNotEquals(collectionWithTimeout, monoResultDeferred);
assertEquals(collectionWithTimeout, result);
assertEquals(collectionWithTimeout, monoResult);
assertEquals(collectionWithTimeout, monoResultDeferred);
}

@Test
void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
//given
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoDatabase);
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
});
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);

Expand All @@ -147,8 +156,8 @@ void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
//then
verify(database, times(2))
.withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
assertNotEquals(databaseWithTimeout, result);
assertNotEquals(databaseWithTimeout, monoResultDeferred);
assertEquals(databaseWithTimeout, result);
assertEquals(databaseWithTimeout, monoResultDeferred);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,13 @@ private TimeoutHelper() {
public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
final String message,
@Nullable final Timeout timeout) {
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
() -> collection,
(ms) -> collection.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
if (timeout != null) {
return timeout.call(MILLISECONDS,
() -> collection.withTimeout(0, MILLISECONDS),
ms -> collection.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
}
return collection;
}

public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
Expand All @@ -51,10 +54,13 @@ public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection
public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
final String message,
@Nullable final Timeout timeout) {
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
() -> database,
(ms) -> database.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
if (timeout != null) {
return timeout.call(MILLISECONDS,
() -> database.withTimeout(0, MILLISECONDS),
ms -> database.withTimeout(ms, MILLISECONDS),
() -> TimeoutContext.throwMongoTimeoutException(message));
}
return database;
}

public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import static com.mongodb.internal.mockito.MongoMockito.mock;
import static com.mongodb.internal.time.Timeout.ZeroSemantics.ZERO_DURATION_MEANS_EXPIRED;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
Expand Down Expand Up @@ -69,35 +68,43 @@ void shouldNotSetRemainingTimeoutDatabaseWhenTimeoutIsNull() {
}

@Test
void shouldNotSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
void shouldSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
//given
MongoCollection<Document> collection = mock(MongoCollection.class);
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
});

//when
MongoCollection<Document> result = collectionWithTimeout(collection, TIMEOUT_ERROR_MESSAGE, Timeout.infinite());

//then
assertEquals(collection, result);
assertEquals(collectionWithTimeout, result);
verify(collection).withTimeout(0L, TimeUnit.MILLISECONDS);
}

@Test
void shouldNotSetRemainingTimeoutOnDatabaseWhenTimeoutIsInfinite() {
//given
MongoDatabase database = mock(MongoDatabase.class);
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
});

//when
MongoDatabase result = databaseWithTimeout(database, TIMEOUT_ERROR_MESSAGE, Timeout.infinite());

//then
assertEquals(database, result);
assertEquals(databaseWithTimeout, result);
verify(database).withTimeout(0L, TimeUnit.MILLISECONDS);
}

@Test
void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
//given
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoCollection);
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
});
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);

Expand All @@ -106,15 +113,15 @@ void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {

//then
verify(collection).withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
assertNotEquals(collectionWithTimeout, result);
assertEquals(collectionWithTimeout, result);
}

@Test
void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
//given
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoDatabase);
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
});
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);

Expand All @@ -123,7 +130,7 @@ void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {

//then
verify(database).withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
assertNotEquals(databaseWithTimeout, result);
assertEquals(databaseWithTimeout, result);
}

@Test
Expand Down