Skip to content

Commit 7310144

Browse files
committed
message get request tests, fix "Direct Get with both last_by_subj and no_hdrs"
1 parent 2677334 commit 7310144

File tree

3 files changed

+110
-34
lines changed

3 files changed

+110
-34
lines changed

src/main/java/io/nats/client/api/MessageGetRequest.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,6 @@ private MessageGetRequest(long sequence, String lastBySubject, String nextBySubj
7575
noHeaders = false;
7676
}
7777

78-
private MessageGetRequest(MessageGetRequest r, boolean noHeaders) {
79-
this.sequence = r.sequence;
80-
this.lastBySubject = r.lastBySubject;
81-
this.nextBySubject = r.nextBySubject;
82-
this.startTime = r.startTime;
83-
this.noHeaders = noHeaders;
84-
}
85-
8678
public long getSequence() {
8779
return sequence;
8880
}
@@ -109,6 +101,11 @@ public boolean isNextBySubject() {
109101
return nextBySubject != null;
110102
}
111103

104+
@Nullable
105+
public ZonedDateTime getStartTime() {
106+
return startTime;
107+
}
108+
112109
public boolean isNoHeaders() {
113110
return noHeaders;
114111
}

src/main/java/io/nats/client/impl/NatsJetStreamManagement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ private MessageInfo _getMessage(String streamName, MessageGetRequest messageGetR
321321
if (csi.allowDirect) {
322322
String subject;
323323
byte[] payload;
324-
if (messageGetRequest.isLastBySubject()) {
324+
if (messageGetRequest.isLastBySubject() && !messageGetRequest.isNoHeaders()) {
325325
subject = String.format(JSAPI_DIRECT_GET_LAST, streamName, messageGetRequest.getLastBySubject());
326326
payload = null;
327327
}

src/test/java/io/nats/client/impl/JetStreamManagementTests.java

Lines changed: 104 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,50 +1329,129 @@ private void assertMessageInfo(TestingStreamContainer tsc, int subj, long seq, M
13291329
assertNull(mi.getHeaders().getFirst(NATS_LAST_SEQUENCE));
13301330
}
13311331

1332-
@SuppressWarnings("deprecation")
13331332
@Test
1334-
public void testMessageGetRequest() {
1335-
validateMessageGetRequest(1, null, null, false, MessageGetRequest.forSequence(1));
1336-
validateMessageGetRequest(-1, "last", null, false, MessageGetRequest.lastForSubject("last"));
1337-
validateMessageGetRequest(-1, null, "first", false, MessageGetRequest.firstForSubject("first"));
1338-
validateMessageGetRequest(1, null, "first", false, MessageGetRequest.nextForSubject(1, "first"));
1339-
1340-
// coverage for deprecated methods
1341-
MessageGetRequest.seqBytes(1);
1342-
MessageGetRequest.lastBySubjectBytes(SUBJECT);
1343-
new MessageGetRequest(1);
1344-
new MessageGetRequest(SUBJECT);
1345-
1346-
// coverage for MessageInfo, has error
1347-
String json = dataAsString("GenericErrorResponse.json");
1348-
NatsMessage m = new NatsMessage("sub", null, json.getBytes(StandardCharsets.US_ASCII));
1349-
MessageInfo mi = new MessageInfo(m);
1350-
assertTrue(mi.hasError());
1351-
assertEquals(-1, mi.getLastSeq());
1352-
assertFalse(mi.toString().contains("last_seq"));
1333+
public void testMessageGetRequestObject() {
1334+
ZonedDateTime zdt = ZonedDateTime.now();
1335+
validateMessageGetRequestObject(1, null, null, null, MessageGetRequest.forSequence(1));
1336+
validateMessageGetRequestObject(-1, "last", null, null, MessageGetRequest.lastForSubject("last"));
1337+
validateMessageGetRequestObject(-1, null, "first", null, MessageGetRequest.firstForSubject("first"));
1338+
validateMessageGetRequestObject(1, null, "first", null, MessageGetRequest.nextForSubject(1, "first"));
1339+
validateMessageGetRequestObject(-1, null, null, zdt, MessageGetRequest.firstForStartTime(zdt));
1340+
validateMessageGetRequestObject(-1, null, "first", zdt, MessageGetRequest.firstForStartTimeAndSubject(zdt, "first"));
13531341

13541342
// coverage for MessageInfo
1355-
m = new NatsMessage("sub", null, new Headers()
1343+
Message m = new NatsMessage("sub", null, new Headers()
13561344
.put(NATS_SUBJECT, "sub")
13571345
.put(NATS_SEQUENCE, "1")
13581346
.put(NATS_LAST_SEQUENCE, "1")
13591347
.put(NATS_TIMESTAMP, DateTimeUtils.toRfc3339(ZonedDateTime.now())),
13601348
null);
1361-
mi = new MessageInfo(m, "stream", true);
1349+
MessageInfo mi = new MessageInfo(m, "stream", true);
13621350
assertEquals(1, mi.getLastSeq());
13631351
assertTrue(mi.toString().contains("last_seq"));
13641352
assertNotNull(mi.toString());
13651353
}
13661354

1367-
private void validateMessageGetRequest(
1368-
long seq, String lastBySubject, String nextBySubject, boolean noHeaders, MessageGetRequest mgr) {
1355+
private void validateMessageGetRequestObject(
1356+
long seq, String lastBySubject, String nextBySubject, ZonedDateTime zdt, MessageGetRequest mgr) {
13691357
assertEquals(seq, mgr.getSequence());
13701358
assertEquals(lastBySubject, mgr.getLastBySubject());
13711359
assertEquals(nextBySubject, mgr.getNextBySubject());
13721360
assertEquals(seq > 0 && nextBySubject == null, mgr.isSequenceOnly());
13731361
assertEquals(lastBySubject != null, mgr.isLastBySubject());
13741362
assertEquals(nextBySubject != null, mgr.isNextBySubject());
1375-
assertEquals(noHeaders, mgr.isNoHeaders());
1363+
assertEquals(zdt, mgr.getStartTime());
1364+
1365+
assertFalse(mgr.isNoHeaders());
1366+
mgr.noHeaders();
1367+
assertTrue(mgr.isNoHeaders());
1368+
}
1369+
1370+
@Test
1371+
public void testMessageGetRequestObjectDeprecatedMethods() {
1372+
// coverage for deprecated methods
1373+
MessageGetRequest.seqBytes(1);
1374+
MessageGetRequest.lastBySubjectBytes(SUBJECT);
1375+
new MessageGetRequest(1);
1376+
new MessageGetRequest(SUBJECT);
1377+
1378+
// coverage for MessageInfo, has error
1379+
String json = dataAsString("GenericErrorResponse.json");
1380+
NatsMessage m = new NatsMessage("sub", null, json.getBytes(StandardCharsets.US_ASCII));
1381+
MessageInfo mi = new MessageInfo(m);
1382+
assertTrue(mi.hasError());
1383+
assertEquals(-1, mi.getLastSeq());
1384+
assertFalse(mi.toString().contains("last_seq"));
1385+
}
1386+
1387+
@Test
1388+
public void testMessageGetRequestNoHeaders() throws Exception {
1389+
jsServer.run(TestBase::atLeast2_12, nc -> {
1390+
JetStreamManagement jsm = nc.jetStreamManagement();
1391+
JetStream js = nc.jetStream();
1392+
1393+
String stream = stream();
1394+
String subject = subject();
1395+
StreamConfiguration sc = StreamConfiguration.builder()
1396+
.name(stream)
1397+
.storageType(StorageType.Memory)
1398+
.subjects(subject)
1399+
.allowDirect(true)
1400+
.build();
1401+
1402+
jsm.addStream(sc);
1403+
1404+
Headers h = new Headers();
1405+
h.put("foo", "one");
1406+
js.publish(subject, h, "data1".getBytes());
1407+
h.put("foo", "two");
1408+
js.publish(subject, h, "data22".getBytes());
1409+
1410+
MessageGetRequest mgr = MessageGetRequest.firstForSubject(subject);
1411+
MessageInfo mi = jsm.getMessage(stream, mgr);
1412+
assertEquals(stream, mi.getStream());
1413+
assertEquals(subject, mi.getSubject());
1414+
assertEquals(1, mi.getSeq());
1415+
assertNotNull(mi.getTime());
1416+
assertNotNull(mi.getData());
1417+
assertEquals(5, mi.getData().length);
1418+
assertNotNull(mi.getHeaders());
1419+
assertEquals(1, mi.getHeaders().size());
1420+
assertEquals("one", mi.getHeaders().getFirst("foo"));
1421+
1422+
mgr.noHeaders();
1423+
mi = jsm.getMessage(stream, mgr);
1424+
assertEquals(stream, mi.getStream());
1425+
assertNull(mi.getSubject());
1426+
assertEquals(-1, mi.getSeq());
1427+
assertNull(mi.getTime());
1428+
assertNotNull(mi.getData());
1429+
assertEquals(5, mi.getData().length);
1430+
assertNotNull(mi.getHeaders());
1431+
assertTrue(mi.getHeaders() == null || mi.getHeaders().isEmpty());
1432+
1433+
mgr = MessageGetRequest.lastForSubject(subject);
1434+
mi = jsm.getMessage(stream, mgr);
1435+
assertEquals(stream, mi.getStream());
1436+
assertEquals(subject, mi.getSubject());
1437+
assertEquals(2, mi.getSeq());
1438+
assertNotNull(mi.getTime());
1439+
assertNotNull(mi.getData());
1440+
assertEquals(6, mi.getData().length);
1441+
assertNotNull(mi.getHeaders());
1442+
assertEquals(1, mi.getHeaders().size());
1443+
assertEquals("two", mi.getHeaders().getFirst("foo"));
1444+
1445+
mgr.noHeaders();
1446+
mi = jsm.getMessage(stream, mgr);
1447+
assertEquals(stream, mi.getStream());
1448+
assertNull(mi.getSubject());
1449+
assertEquals(-1, mi.getSeq());
1450+
assertNull(mi.getTime());
1451+
assertNotNull(mi.getData());
1452+
assertEquals(6, mi.getData().length);
1453+
assertTrue(mi.getHeaders() == null || mi.getHeaders().isEmpty());
1454+
});
13761455
}
13771456

13781457
@Test

0 commit comments

Comments
 (0)