Skip to content

Commit 51b9cef

Browse files
authored
Handle duration string when accepting duration properties (#1183)
1 parent 19ac032 commit 51b9cef

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-5
lines changed

src/main/java/io/nats/client/Options.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.time.Duration;
3535
import java.time.LocalDateTime;
3636
import java.time.format.DateTimeFormatter;
37+
import java.time.format.DateTimeParseException;
3738
import java.util.*;
3839
import java.util.concurrent.*;
3940
import java.util.concurrent.atomic.AtomicInteger;
@@ -2603,12 +2604,23 @@ private static void durationProperty(Properties props, String key, Duration defa
26032604
consumer.accept(defaultValue);
26042605
}
26052606
else {
2606-
int ms = Integer.parseInt(value);
2607-
if (ms < 0) {
2608-
consumer.accept(defaultValue);
2607+
try {
2608+
Duration d = Duration.parse(value);
2609+
if (d.toNanos() < 0) {
2610+
consumer.accept(defaultValue);
2611+
}
2612+
else {
2613+
consumer.accept(d);
2614+
}
26092615
}
2610-
else {
2611-
consumer.accept(Duration.ofMillis(ms));
2616+
catch (DateTimeParseException pe) {
2617+
int ms = Integer.parseInt(value);
2618+
if (ms < 0) {
2619+
consumer.accept(defaultValue);
2620+
}
2621+
else {
2622+
consumer.accept(Duration.ofMillis(ms));
2623+
}
26122624
}
26132625
}
26142626
}

src/test/java/io/nats/client/OptionsTests.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,56 @@ private static void _testChainedStatisticsCollector(StatisticsCollector cHandler
279279
assertSame(cHandler, o.getStatisticsCollector(), "chained statistics collector");
280280
}
281281

282+
@Test
283+
public void testDurationProperties() {
284+
// test millis
285+
Properties props = new Properties();
286+
props.setProperty(Options.PROP_RECONNECT_WAIT, "" + (15 * MINUTE));
287+
props.setProperty(Options.PROP_RECONNECT_JITTER, "" + (2 * DAY + 3 * HOUR + 4 * MINUTE));
288+
props.setProperty(Options.PROP_RECONNECT_JITTER_TLS, "" + DAY);
289+
props.setProperty(Options.PROP_CONNECTION_TIMEOUT, "42000");
290+
props.setProperty(Options.PROP_SOCKET_WRITE_TIMEOUT, "42123");
291+
props.setProperty(Options.PROP_PING_INTERVAL, "20345");
292+
props.setProperty(Options.PROP_CLEANUP_INTERVAL, "" + (10 * HOUR));
293+
_testDurationProperties(new Options.Builder(props).build());
294+
295+
// test duration strings
296+
props = new Properties();
297+
props.setProperty(Options.PROP_RECONNECT_WAIT, "PT15M");
298+
props.setProperty(Options.PROP_RECONNECT_JITTER, "P2DT3H4M");
299+
props.setProperty(Options.PROP_RECONNECT_JITTER_TLS, "P1D");
300+
props.setProperty(Options.PROP_CONNECTION_TIMEOUT, "PT42S");
301+
props.setProperty(Options.PROP_SOCKET_WRITE_TIMEOUT, "PT42.123S");
302+
props.setProperty(Options.PROP_PING_INTERVAL, "PT20.345S");
303+
props.setProperty(Options.PROP_CLEANUP_INTERVAL, "PT10H");
304+
_testDurationProperties(new Options.Builder(props).build());
305+
306+
// test negative value gives default
307+
props = new Properties();
308+
props.setProperty(Options.PROP_RECONNECT_WAIT, "-1");
309+
Options o = new Options.Builder(props).build();
310+
assertEquals(2000, o.getReconnectWait().toMillis());
311+
312+
// test parse error
313+
Properties px1 = new Properties();
314+
px1.setProperty(Options.PROP_RECONNECT_WAIT, "A");
315+
assertThrows(NumberFormatException.class, () -> new Options.Builder(px1).build());
316+
}
317+
318+
private static final long MINUTE = 1000 * 60;
319+
private static final long HOUR = MINUTE * 60;
320+
private static final long DAY = HOUR * 24;
321+
322+
private static void _testDurationProperties(Options o) {
323+
assertEquals(15 * MINUTE, o.getReconnectWait().toMillis());
324+
assertEquals(2 * DAY + 3 * HOUR + 4 * MINUTE, o.getReconnectJitter().toMillis());
325+
assertEquals(DAY, o.getReconnectJitterTls().toMillis());
326+
assertEquals(42000, o.getConnectionTimeout().toMillis());
327+
assertEquals(42123, o.getSocketWriteTimeout().toMillis());
328+
assertEquals(20345, o.getPingInterval().toMillis());
329+
assertEquals(10 * HOUR, o.getRequestCleanupInterval().toMillis());
330+
}
331+
282332
@Test
283333
public void testPropertiesBooleanBuilder() {
284334
Properties props = new Properties();

0 commit comments

Comments
 (0)