Skip to content

Commit ebd86a5

Browse files
TheRittlerc24Felixlahirumaramba
authored
fix: Make writeTimeout configurable (similar to readTimeout) (#900)
* add option to configure write timeout in FirebaseOptions * improve tests and fix javadoc --------- Co-authored-by: Felix Rittler <[email protected]> Co-authored-by: Lahiru Maramba <[email protected]>
1 parent 01dd6cc commit ebd86a5

File tree

5 files changed

+47
-1
lines changed

5 files changed

+47
-1
lines changed

Diff for: src/main/java/com/google/firebase/FirebaseOptions.java

+28
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public GoogleCredentials get() {
8282
private final HttpTransport httpTransport;
8383
private final int connectTimeout;
8484
private final int readTimeout;
85+
private final int writeTimeout;
8586
private final JsonFactory jsonFactory;
8687
private final ThreadManager threadManager;
8788
private final FirestoreOptions firestoreOptions;
@@ -112,6 +113,8 @@ private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) {
112113
this.connectTimeout = builder.connectTimeout;
113114
checkArgument(builder.readTimeout >= 0);
114115
this.readTimeout = builder.readTimeout;
116+
checkArgument(builder.writeTimeout >= 0);
117+
this.writeTimeout = builder.writeTimeout;
115118
this.firestoreOptions = builder.firestoreOptions;
116119
}
117120

@@ -207,6 +210,16 @@ public int getReadTimeout() {
207210
return readTimeout;
208211
}
209212

213+
/**
214+
* Returns the write timeout in milliseconds, which is applied to outgoing REST calls
215+
* made by the SDK.
216+
*
217+
* @return Write timeout in milliseconds. 0 indicates an infinite timeout.
218+
*/
219+
public int getWriteTimeout() {
220+
return writeTimeout;
221+
}
222+
210223
@NonNull
211224
ThreadManager getThreadManager() {
212225
return threadManager;
@@ -260,6 +273,7 @@ public static final class Builder {
260273
private ThreadManager threadManager;
261274
private int connectTimeout;
262275
private int readTimeout;
276+
private int writeTimeout;
263277

264278
/**
265279
* Constructs an empty builder.
@@ -289,6 +303,7 @@ public Builder(FirebaseOptions options) {
289303
threadManager = options.threadManager;
290304
connectTimeout = options.connectTimeout;
291305
readTimeout = options.readTimeout;
306+
writeTimeout = options.writeTimeout;
292307
firestoreOptions = options.firestoreOptions;
293308
}
294309

@@ -495,6 +510,19 @@ public Builder setReadTimeout(int readTimeout) {
495510
return this;
496511
}
497512

513+
/**
514+
* Sets the write timeout for outgoing HTTP (REST) calls made by the SDK. This does not affect
515+
* the {@link com.google.firebase.database.FirebaseDatabase} and
516+
* {@link com.google.firebase.cloud.FirestoreClient} APIs.
517+
*
518+
* @param writeTimeout Write timeout in milliseconds. Must not be negative.
519+
* @return This <code>Builder</code> instance is returned so subsequent calls can be chained.
520+
*/
521+
public Builder setWriteTimeout(int writeTimeout) {
522+
this.writeTimeout = writeTimeout;
523+
return this;
524+
}
525+
498526
/**
499527
* Builds the {@link FirebaseOptions} instance from the previously set options.
500528
*

Diff for: src/main/java/com/google/firebase/internal/FirebaseRequestInitializer.java

+3
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,19 @@ private static class TimeoutInitializer implements HttpRequestInitializer {
6060

6161
private final int connectTimeoutMillis;
6262
private final int readTimeoutMillis;
63+
private final int writeTimeoutMillis;
6364

6465
TimeoutInitializer(FirebaseOptions options) {
6566
this.connectTimeoutMillis = options.getConnectTimeout();
6667
this.readTimeoutMillis = options.getReadTimeout();
68+
this.writeTimeoutMillis = options.getWriteTimeout();
6769
}
6870

6971
@Override
7072
public void initialize(HttpRequest request) {
7173
request.setConnectTimeout(connectTimeoutMillis);
7274
request.setReadTimeout(readTimeoutMillis);
75+
request.setWriteTimeout(writeTimeoutMillis);
7376
}
7477
}
7578
}

Diff for: src/test/java/com/google/firebase/FirebaseOptionsTest.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
import org.junit.Test;
4040

41-
/**
41+
/**
4242
* Tests for {@link FirebaseOptions}.
4343
*/
4444
public class FirebaseOptionsTest {
@@ -87,6 +87,7 @@ public void createOptionsWithAllValuesSet() throws IOException {
8787
.setThreadManager(MOCK_THREAD_MANAGER)
8888
.setConnectTimeout(30000)
8989
.setReadTimeout(60000)
90+
.setWriteTimeout(90000)
9091
.setFirestoreOptions(firestoreOptions)
9192
.build();
9293
assertEquals(FIREBASE_DB_URL, firebaseOptions.getDatabaseUrl());
@@ -97,6 +98,7 @@ public void createOptionsWithAllValuesSet() throws IOException {
9798
assertSame(MOCK_THREAD_MANAGER, firebaseOptions.getThreadManager());
9899
assertEquals(30000, firebaseOptions.getConnectTimeout());
99100
assertEquals(60000, firebaseOptions.getReadTimeout());
101+
assertEquals(90000, firebaseOptions.getWriteTimeout());
100102
assertSame(firestoreOptions, firebaseOptions.getFirestoreOptions());
101103

102104
GoogleCredentials credentials = firebaseOptions.getCredentials();
@@ -209,6 +211,14 @@ public void createOptionsWithInvalidReadTimeout() {
209211
.build();
210212
}
211213

214+
@Test(expected = IllegalArgumentException.class)
215+
public void createOptionsWithInvalidWriteTimeout() {
216+
FirebaseOptions.builder()
217+
.setCredentials(TestUtils.getCertCredential(ServiceAccount.EDITOR.asStream()))
218+
.setWriteTimeout(-1)
219+
.build();
220+
}
221+
212222
@Test
213223
public void testNotEquals() throws IOException {
214224
GoogleCredentials credentials = GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream());

Diff for: src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,7 @@ public void testTimeout() throws Exception {
979979
.setHttpTransport(transport)
980980
.setConnectTimeout(30000)
981981
.setReadTimeout(60000)
982+
.setWriteTimeout(90000)
982983
.build());
983984
FirebaseAuth auth = FirebaseAuth.getInstance();
984985
FirebaseUserManager userManager = auth.getUserManager();
@@ -989,6 +990,7 @@ public void testTimeout() throws Exception {
989990
HttpRequest request = interceptor.getResponse().getRequest();
990991
assertEquals(30000, request.getConnectTimeout());
991992
assertEquals(60000, request.getReadTimeout());
993+
assertEquals(90000, request.getWriteTimeout());
992994
}
993995

994996
@Test

Diff for: src/test/java/com/google/firebase/internal/FirebaseRequestInitializerTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class FirebaseRequestInitializerTest {
3838
private static final int MAX_RETRIES = 5;
3939
private static final int CONNECT_TIMEOUT_MILLIS = 30000;
4040
private static final int READ_TIMEOUT_MILLIS = 60000;
41+
private static final int WRITE_TIMEOUT_MILLIS = 90000;
4142

4243
@After
4344
public void tearDown() {
@@ -69,6 +70,7 @@ public void testExplicitTimeouts() throws Exception {
6970
.setCredentials(new MockGoogleCredentials("token"))
7071
.setConnectTimeout(CONNECT_TIMEOUT_MILLIS)
7172
.setReadTimeout(READ_TIMEOUT_MILLIS)
73+
.setWriteTimeout(WRITE_TIMEOUT_MILLIS)
7274
.build());
7375
HttpRequest request = TestUtils.createRequest();
7476

@@ -77,6 +79,7 @@ public void testExplicitTimeouts() throws Exception {
7779

7880
assertEquals(CONNECT_TIMEOUT_MILLIS, request.getConnectTimeout());
7981
assertEquals(READ_TIMEOUT_MILLIS, request.getReadTimeout());
82+
assertEquals(WRITE_TIMEOUT_MILLIS, request.getWriteTimeout());
8083
assertEquals("Bearer token", request.getHeaders().getAuthorization());
8184
assertEquals(HttpRequest.DEFAULT_NUMBER_OF_RETRIES, request.getNumberOfRetries());
8285
assertNull(request.getIOExceptionHandler());

0 commit comments

Comments
 (0)