Skip to content

Commit 235adf4

Browse files
authored
Override collection/database with infinite timeout. (#1350)
JAVA-5384
1 parent 98c5bd4 commit 235adf4

File tree

4 files changed

+69
-42
lines changed

4 files changed

+69
-42
lines changed

driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/TimeoutHelper.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,13 @@ public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection
4444
public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
4545
@Nullable final Timeout timeout,
4646
final String message) {
47-
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
48-
() -> collection,
49-
ms -> collection.withTimeout(ms, MILLISECONDS),
50-
() -> TimeoutContext.throwMongoTimeoutException(message));
47+
if (timeout != null) {
48+
return timeout.call(MILLISECONDS,
49+
() -> collection.withTimeout(0, MILLISECONDS),
50+
ms -> collection.withTimeout(ms, MILLISECONDS),
51+
() -> TimeoutContext.throwMongoTimeoutException(message));
52+
}
53+
return collection;
5154
}
5255

5356
public static <T> Mono<MongoCollection<T>> collectionWithTimeoutMono(final MongoCollection<T> collection,
@@ -73,10 +76,13 @@ public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
7376
public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
7477
final String message,
7578
@Nullable final Timeout timeout) {
76-
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
77-
() -> database,
78-
ms -> database.withTimeout(ms, MILLISECONDS),
79-
() -> TimeoutContext.throwMongoTimeoutException(message));
79+
if (timeout != null) {
80+
return timeout.call(MILLISECONDS,
81+
() -> database.withTimeout(0, MILLISECONDS),
82+
ms -> database.withTimeout(ms, MILLISECONDS),
83+
() -> TimeoutContext.throwMongoTimeoutException(message));
84+
}
85+
return database;
8086
}
8187

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

driver-reactive-streams/src/test/unit/com/mongodb/reactivestreams/client/internal/TimeoutHelperTest.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import static com.mongodb.reactivestreams.client.internal.TimeoutHelper.databaseWithTimeout;
3434
import static com.mongodb.reactivestreams.client.internal.TimeoutHelper.databaseWithTimeoutDeferred;
3535
import static org.junit.jupiter.api.Assertions.assertEquals;
36-
import static org.junit.jupiter.api.Assertions.assertNotEquals;
3736
import static org.junit.jupiter.api.Assertions.assertThrows;
3837
import static org.mockito.ArgumentMatchers.anyLong;
3938
import static org.mockito.ArgumentMatchers.eq;
@@ -82,39 +81,49 @@ void shouldNotSetRemainingTimeoutDatabaseWhenTimeoutIsNull() {
8281
@Test
8382
void shouldNotSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
8483
//given
85-
MongoCollection<Document> collection = mock(MongoCollection.class);
84+
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
85+
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
86+
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
87+
});
8688

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

9294
//then
93-
assertEquals(collection, result);
94-
assertEquals(collection, monoResult);
95-
assertEquals(collection, monoResultDeferred);
95+
assertEquals(collectionWithTimeout, result);
96+
assertEquals(collectionWithTimeout, monoResult);
97+
assertEquals(collectionWithTimeout, monoResultDeferred);
98+
verify(collection, times(3))
99+
.withTimeout(0L, TimeUnit.MILLISECONDS);
96100
}
97101

98102
@Test
99103
void shouldNotSetRemainingTimeoutOnDatabaseWhenTimeoutIsInfinite() {
100104
//given
101-
MongoDatabase database = mock(MongoDatabase.class);
105+
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
106+
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
107+
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
108+
});
102109

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

107114
//then
108-
assertEquals(database, result);
109-
assertEquals(database, monoResultDeferred);
115+
assertEquals(databaseWithTimeout, result);
116+
assertEquals(databaseWithTimeout, monoResultDeferred);
117+
verify(database, times(2))
118+
.withTimeout(0L, TimeUnit.MILLISECONDS);
110119
}
111120

112121
@Test
113122
void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
114123
//given
115124
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
116125
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
117-
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoCollection);
126+
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
118127
});
119128
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);
120129

@@ -126,17 +135,17 @@ void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
126135
//then
127136
verify(collection, times(3))
128137
.withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
129-
assertNotEquals(collectionWithTimeout, result);
130-
assertNotEquals(collectionWithTimeout, monoResult);
131-
assertNotEquals(collectionWithTimeout, monoResultDeferred);
138+
assertEquals(collectionWithTimeout, result);
139+
assertEquals(collectionWithTimeout, monoResult);
140+
assertEquals(collectionWithTimeout, monoResultDeferred);
132141
}
133142

134143
@Test
135144
void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
136145
//given
137146
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
138147
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
139-
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoDatabase);
148+
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
140149
});
141150
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);
142151

@@ -147,8 +156,8 @@ void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
147156
//then
148157
verify(database, times(2))
149158
.withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
150-
assertNotEquals(databaseWithTimeout, result);
151-
assertNotEquals(databaseWithTimeout, monoResultDeferred);
159+
assertEquals(databaseWithTimeout, result);
160+
assertEquals(databaseWithTimeout, monoResultDeferred);
152161
}
153162

154163
@Test

driver-sync/src/main/com/mongodb/client/internal/TimeoutHelper.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ private TimeoutHelper() {
3737
public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
3838
final String message,
3939
@Nullable final Timeout timeout) {
40-
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
41-
() -> collection,
42-
(ms) -> collection.withTimeout(ms, MILLISECONDS),
43-
() -> TimeoutContext.throwMongoTimeoutException(message));
40+
if (timeout != null) {
41+
return timeout.call(MILLISECONDS,
42+
() -> collection.withTimeout(0, MILLISECONDS),
43+
ms -> collection.withTimeout(ms, MILLISECONDS),
44+
() -> TimeoutContext.throwMongoTimeoutException(message));
45+
}
46+
return collection;
4447
}
4548

4649
public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection<T> collection,
@@ -51,10 +54,13 @@ public static <T> MongoCollection<T> collectionWithTimeout(final MongoCollection
5154
public static MongoDatabase databaseWithTimeout(final MongoDatabase database,
5255
final String message,
5356
@Nullable final Timeout timeout) {
54-
return Timeout.nullAsInfinite(timeout).call(MILLISECONDS,
55-
() -> database,
56-
(ms) -> database.withTimeout(ms, MILLISECONDS),
57-
() -> TimeoutContext.throwMongoTimeoutException(message));
57+
if (timeout != null) {
58+
return timeout.call(MILLISECONDS,
59+
() -> database.withTimeout(0, MILLISECONDS),
60+
ms -> database.withTimeout(ms, MILLISECONDS),
61+
() -> TimeoutContext.throwMongoTimeoutException(message));
62+
}
63+
return database;
5864
}
5965

6066
public static MongoDatabase databaseWithTimeout(final MongoDatabase database,

driver-sync/src/test/unit/com/mongodb/client/internal/TimeoutHelperTest.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import static com.mongodb.internal.mockito.MongoMockito.mock;
3131
import static com.mongodb.internal.time.Timeout.ZeroSemantics.ZERO_DURATION_MEANS_EXPIRED;
3232
import static org.junit.jupiter.api.Assertions.assertEquals;
33-
import static org.junit.jupiter.api.Assertions.assertNotEquals;
3433
import static org.junit.jupiter.api.Assertions.assertThrows;
3534
import static org.mockito.ArgumentMatchers.anyLong;
3635
import static org.mockito.ArgumentMatchers.eq;
@@ -69,35 +68,43 @@ void shouldNotSetRemainingTimeoutDatabaseWhenTimeoutIsNull() {
6968
}
7069

7170
@Test
72-
void shouldNotSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
71+
void shouldSetRemainingTimeoutOnCollectionWhenTimeoutIsInfinite() {
7372
//given
74-
MongoCollection<Document> collection = mock(MongoCollection.class);
73+
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
74+
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
75+
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
76+
});
7577

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

7981
//then
80-
assertEquals(collection, result);
82+
assertEquals(collectionWithTimeout, result);
83+
verify(collection).withTimeout(0L, TimeUnit.MILLISECONDS);
8184
}
8285

8386
@Test
8487
void shouldNotSetRemainingTimeoutOnDatabaseWhenTimeoutIsInfinite() {
8588
//given
86-
MongoDatabase database = mock(MongoDatabase.class);
89+
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
90+
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
91+
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
92+
});
8793

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

9197
//then
92-
assertEquals(database, result);
98+
assertEquals(databaseWithTimeout, result);
99+
verify(database).withTimeout(0L, TimeUnit.MILLISECONDS);
93100
}
94101

95102
@Test
96103
void shouldSetRemainingTimeoutOnCollectionWhenTimeout() {
97104
//given
98105
MongoCollection<Document> collectionWithTimeout = mock(MongoCollection.class);
99106
MongoCollection<Document> collection = mock(MongoCollection.class, mongoCollection -> {
100-
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoCollection);
107+
when(mongoCollection.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(collectionWithTimeout);
101108
});
102109
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);
103110

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

107114
//then
108115
verify(collection).withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
109-
assertNotEquals(collectionWithTimeout, result);
116+
assertEquals(collectionWithTimeout, result);
110117
}
111118

112119
@Test
113120
void shouldSetRemainingTimeoutOnDatabaseWhenTimeout() {
114121
//given
115122
MongoDatabase databaseWithTimeout = mock(MongoDatabase.class);
116123
MongoDatabase database = mock(MongoDatabase.class, mongoDatabase -> {
117-
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(mongoDatabase);
124+
when(mongoDatabase.withTimeout(anyLong(), eq(TimeUnit.MILLISECONDS))).thenReturn(databaseWithTimeout);
118125
});
119126
Timeout timeout = Timeout.expiresIn(1, TimeUnit.DAYS, ZERO_DURATION_MEANS_EXPIRED);
120127

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

124131
//then
125132
verify(database).withTimeout(longThat(remaining -> remaining > 0), eq(TimeUnit.MILLISECONDS));
126-
assertNotEquals(databaseWithTimeout, result);
133+
assertEquals(databaseWithTimeout, result);
127134
}
128135

129136
@Test

0 commit comments

Comments
 (0)