Skip to content

Commit ba3bb2e

Browse files
committed
add tests for docs
1 parent 7df3d2a commit ba3bb2e

1 file changed

Lines changed: 113 additions & 53 deletions

File tree

src/test/java/io/getstream/chat/java/DefaultClientConfigurationTest.java

Lines changed: 113 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -33,59 +33,74 @@ void whenCreatingClientWithoutOverrides_thenUsesDoubledDefaults() {
3333
}
3434

3535
@Test
36-
@DisplayName("DefaultClient uses configured HTTP properties")
37-
void givenHttpProperties_whenCreatingClient_thenUsesConfiguredValues() {
36+
@DisplayName("README and DOCS property snippet configures the documented settings")
37+
void docsPropertySnippetConfiguresDocumentedSettings() {
38+
var originalInstance = getDefaultClientInstance();
39+
try {
40+
var properties = new Properties();
41+
properties.put(DefaultClient.API_KEY_PROP_NAME, "test-key");
42+
properties.put(DefaultClient.API_SECRET_PROP_NAME, "test-secret");
43+
properties.put(DefaultClient.DISPATCHER_MAX_REQUESTS_PROP_NAME, "128");
44+
properties.put(DefaultClient.DISPATCHER_MAX_REQUESTS_PER_HOST_PROP_NAME, "32");
45+
properties.put(DefaultClient.CONNECTION_POOL_MAX_IDLE_CONNECTIONS_PROP_NAME, "20");
46+
properties.put(DefaultClient.CONNECTION_POOL_KEEP_ALIVE_DURATION_PROP_NAME, "59000");
47+
properties.put(DefaultClient.API_CONNECT_TIMEOUT_PROP_NAME, "10000");
48+
properties.put(DefaultClient.API_READ_TIMEOUT_PROP_NAME, "30000");
49+
properties.put(DefaultClient.API_WRITE_TIMEOUT_PROP_NAME, "30000");
50+
properties.put(DefaultClient.API_TIMEOUT_PROP_NAME, "30000");
51+
52+
var client = new DefaultClient(properties);
53+
client.setDispatcher(128, 32);
54+
client.setConnectionPool(20, Duration.ofSeconds(59));
55+
client.setTimeouts(
56+
Duration.ofSeconds(10),
57+
Duration.ofSeconds(30),
58+
Duration.ofSeconds(30),
59+
Duration.ofSeconds(30));
60+
DefaultClient.setInstance(client);
61+
62+
Assertions.assertSame(client, DefaultClient.getInstance());
63+
assertConfiguredHttpClient(client, 128, 32, 20, 59, 10_000, 30_000, 30_000, 30_000);
64+
} finally {
65+
setDefaultClientInstance(originalInstance);
66+
}
67+
}
68+
69+
@Test
70+
@DisplayName("README and DOCS options plus client snippet configures the documented settings")
71+
void docsOptionsAndClientSnippetConfiguresDocumentedSettings() {
3872
var properties = baseProperties();
39-
properties.put(DefaultClient.DISPATCHER_MAX_REQUESTS_PROP_NAME, "80");
40-
properties.put(DefaultClient.DISPATCHER_MAX_REQUESTS_PER_HOST_PROP_NAME, "24");
41-
properties.put(DefaultClient.CONNECTION_POOL_MAX_IDLE_CONNECTIONS_PROP_NAME, "20");
42-
properties.put(DefaultClient.CONNECTION_POOL_KEEP_ALIVE_DURATION_PROP_NAME, "120000");
43-
properties.put(DefaultClient.API_CONNECT_TIMEOUT_PROP_NAME, "5000");
44-
properties.put(DefaultClient.API_READ_TIMEOUT_PROP_NAME, "15000");
45-
properties.put(DefaultClient.API_WRITE_TIMEOUT_PROP_NAME, "25000");
46-
properties.put(DefaultClient.API_TIMEOUT_PROP_NAME, "30000");
47-
48-
var client = new DefaultClient(properties);
49-
var okHttpClient = getOkHttpClient(client);
50-
var pool = okHttpClient.connectionPool();
73+
var options =
74+
DefaultClient.HttpClientOptions.builder()
75+
.dispatcher(128, 32)
76+
.connectionPool(20, Duration.ofSeconds(59))
77+
.connectTimeout(Duration.ofSeconds(10))
78+
.readTimeout(Duration.ofSeconds(30))
79+
.writeTimeout(Duration.ofSeconds(30))
80+
.callTimeout(Duration.ofSeconds(30))
81+
.build();
5182

52-
Assertions.assertEquals(20, readIntField(poolDelegate(pool), "maxIdleConnections"));
53-
Assertions.assertEquals(
54-
Duration.ofMinutes(2).toNanos(), readLongField(poolDelegate(pool), "keepAliveDurationNs"));
55-
Assertions.assertEquals(80, readIntField(okHttpClient.dispatcher(), "maxRequests"));
56-
Assertions.assertEquals(24, readIntField(okHttpClient.dispatcher(), "maxRequestsPerHost"));
57-
Assertions.assertEquals(5_000, okHttpClient.connectTimeoutMillis());
58-
Assertions.assertEquals(15_000, okHttpClient.readTimeoutMillis());
59-
Assertions.assertEquals(25_000, okHttpClient.writeTimeoutMillis());
60-
Assertions.assertEquals(30_000, okHttpClient.callTimeoutMillis());
83+
var client = new DefaultClient(properties, options);
84+
85+
assertConfiguredHttpClient(client, 128, 32, 20, 59, 10_000, 30_000, 30_000, 30_000);
6186
}
6287

6388
@Test
64-
@DisplayName("DefaultClient uses option-based HTTP configuration")
65-
void givenHttpOptions_whenCreatingClient_thenUsesConfiguredValues() {
89+
@DisplayName("README and DOCS options builder snippet builds the documented settings")
90+
void docsOptionsBuilderSnippetBuildsDocumentedSettings() {
6691
var options =
6792
DefaultClient.HttpClientOptions.builder()
68-
.dispatcher(96, 32)
69-
.connectionPool(30, Duration.ofSeconds(90))
70-
.connectTimeout(Duration.ofSeconds(3))
71-
.readTimeout(Duration.ofSeconds(12))
72-
.writeTimeout(Duration.ofSeconds(18))
73-
.callTimeout(Duration.ofSeconds(25))
93+
.dispatcher(128, 32)
94+
.connectionPool(20, Duration.ofSeconds(59))
95+
.connectTimeout(Duration.ofSeconds(10))
96+
.readTimeout(Duration.ofSeconds(30))
97+
.writeTimeout(Duration.ofSeconds(30))
98+
.callTimeout(Duration.ofSeconds(30))
7499
.build();
75100

76101
var client = new DefaultClient(baseProperties(), options);
77-
var okHttpClient = getOkHttpClient(client);
78-
var pool = okHttpClient.connectionPool();
79102

80-
Assertions.assertEquals(30, readIntField(poolDelegate(pool), "maxIdleConnections"));
81-
Assertions.assertEquals(
82-
Duration.ofSeconds(90).toNanos(), readLongField(poolDelegate(pool), "keepAliveDurationNs"));
83-
Assertions.assertEquals(96, readIntField(okHttpClient.dispatcher(), "maxRequests"));
84-
Assertions.assertEquals(32, readIntField(okHttpClient.dispatcher(), "maxRequestsPerHost"));
85-
Assertions.assertEquals(3_000, okHttpClient.connectTimeoutMillis());
86-
Assertions.assertEquals(12_000, okHttpClient.readTimeoutMillis());
87-
Assertions.assertEquals(18_000, okHttpClient.writeTimeoutMillis());
88-
Assertions.assertEquals(25_000, okHttpClient.callTimeoutMillis());
103+
assertConfiguredHttpClient(client, 128, 32, 20, 59, 10_000, 30_000, 30_000, 30_000);
89104
}
90105

91106
@Test
@@ -101,17 +116,7 @@ void whenSettingHttpConfiguration_thenRebuildsClientWithNewValues() {
101116
Duration.ofSeconds(16),
102117
Duration.ofSeconds(22));
103118

104-
var okHttpClient = getOkHttpClient(client);
105-
var pool = okHttpClient.connectionPool();
106-
Assertions.assertEquals(15, readIntField(poolDelegate(pool), "maxIdleConnections"));
107-
Assertions.assertEquals(
108-
Duration.ofSeconds(30).toNanos(), readLongField(poolDelegate(pool), "keepAliveDurationNs"));
109-
Assertions.assertEquals(72, readIntField(okHttpClient.dispatcher(), "maxRequests"));
110-
Assertions.assertEquals(16, readIntField(okHttpClient.dispatcher(), "maxRequestsPerHost"));
111-
Assertions.assertEquals(4_000, okHttpClient.connectTimeoutMillis());
112-
Assertions.assertEquals(14_000, okHttpClient.readTimeoutMillis());
113-
Assertions.assertEquals(16_000, okHttpClient.writeTimeoutMillis());
114-
Assertions.assertEquals(22_000, okHttpClient.callTimeoutMillis());
119+
assertConfiguredHttpClient(client, 72, 16, 15, 30, 4_000, 14_000, 16_000, 22_000);
115120
}
116121

117122
private static Properties baseProperties() {
@@ -126,6 +131,41 @@ private static OkHttpClient getOkHttpClient(DefaultClient client) {
126131
return (OkHttpClient) readField(retrofit, "callFactory");
127132
}
128133

134+
private static DefaultClient getDefaultClientInstance() {
135+
return (DefaultClient) readStaticField(DefaultClient.class, "defaultInstance");
136+
}
137+
138+
private static void setDefaultClientInstance(DefaultClient client) {
139+
writeStaticField(DefaultClient.class, "defaultInstance", client);
140+
}
141+
142+
private static void assertConfiguredHttpClient(
143+
DefaultClient client,
144+
int maxRequests,
145+
int maxRequestsPerHost,
146+
int maxIdleConnections,
147+
long keepAliveSeconds,
148+
int connectTimeoutMillis,
149+
int readTimeoutMillis,
150+
int writeTimeoutMillis,
151+
int callTimeoutMillis) {
152+
var okHttpClient = getOkHttpClient(client);
153+
var pool = okHttpClient.connectionPool();
154+
155+
Assertions.assertEquals(
156+
maxIdleConnections, readIntField(poolDelegate(pool), "maxIdleConnections"));
157+
Assertions.assertEquals(
158+
Duration.ofSeconds(keepAliveSeconds).toNanos(),
159+
readLongField(poolDelegate(pool), "keepAliveDurationNs"));
160+
Assertions.assertEquals(maxRequests, readIntField(okHttpClient.dispatcher(), "maxRequests"));
161+
Assertions.assertEquals(
162+
maxRequestsPerHost, readIntField(okHttpClient.dispatcher(), "maxRequestsPerHost"));
163+
Assertions.assertEquals(connectTimeoutMillis, okHttpClient.connectTimeoutMillis());
164+
Assertions.assertEquals(readTimeoutMillis, okHttpClient.readTimeoutMillis());
165+
Assertions.assertEquals(writeTimeoutMillis, okHttpClient.writeTimeoutMillis());
166+
Assertions.assertEquals(callTimeoutMillis, okHttpClient.callTimeoutMillis());
167+
}
168+
129169
private static Object poolDelegate(ConnectionPool pool) {
130170
return readField(pool, "delegate");
131171
}
@@ -155,4 +195,24 @@ private static Object readField(Object target, String fieldName) {
155195
throw new IllegalStateException(
156196
String.format("Field '%s' not found on %s", fieldName, target.getClass().getName()));
157197
}
198+
199+
private static Object readStaticField(Class<?> type, String fieldName) {
200+
try {
201+
Field field = type.getDeclaredField(fieldName);
202+
field.setAccessible(true);
203+
return field.get(null);
204+
} catch (NoSuchFieldException | IllegalAccessException ex) {
205+
throw new IllegalStateException(ex);
206+
}
207+
}
208+
209+
private static void writeStaticField(Class<?> type, String fieldName, Object value) {
210+
try {
211+
Field field = type.getDeclaredField(fieldName);
212+
field.setAccessible(true);
213+
field.set(null, value);
214+
} catch (NoSuchFieldException | IllegalAccessException ex) {
215+
throw new IllegalStateException(ex);
216+
}
217+
}
158218
}

0 commit comments

Comments
 (0)