Skip to content

Commit 862c451

Browse files
Adds RelpParser tests (#51)
* Adds RelpParser tests, removes getState() from RelpParser * Changes messages to be a bit more readable * Readd getState() * Removes legal testcase * Fixes testNegativeTxnr() test * Parse multiple messages in row * Changes multipleLastNewlines to cause IllegalStateException * readds testDataAFterLastNewline() * Adds note to test * Adds note to test
1 parent 42ddaf0 commit 862c451

1 file changed

Lines changed: 181 additions & 0 deletions

File tree

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
/*
2+
Java Reliable Event Logging Protocol Library RLP-01
3+
Copyright (C) 2021, 2022 Suomen Kanuuna Oy
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
*/
17+
18+
package com.teragrep.rlp_01;
19+
20+
import org.junit.jupiter.api.Assertions;
21+
import org.junit.jupiter.api.Disabled;
22+
import org.junit.jupiter.api.Test;
23+
24+
import java.nio.charset.StandardCharsets;
25+
import java.util.HashMap;
26+
27+
public class RelpParserTest {
28+
public RelpParser createParser(String message) {
29+
RelpParser parser = new RelpParser();
30+
for(byte b : message.getBytes()) {
31+
parser.parse(b);
32+
}
33+
return parser;
34+
}
35+
36+
@Test
37+
public void testHappyPath() {
38+
RelpParser parser = createParser("2 rsp 6 200 OK\n");
39+
Assertions.assertEquals(2, parser.getTxnId(), "parser getTxnId() differs");
40+
Assertions.assertEquals("rsp", parser.getCommandString(), "parser getCommandString() differs");
41+
Assertions.assertEquals(6, parser.getLength(), "parser getLength() differs");
42+
Assertions.assertEquals("200 OK", StandardCharsets.UTF_8.decode(parser.getData()).toString(), "parser.getData() differs");
43+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
44+
}
45+
46+
@Test
47+
public void testNegativeTxnr() {
48+
Assertions.assertThrows(IllegalArgumentException.class, () -> createParser("-2 rsp 6 200 OK\n"));
49+
}
50+
51+
@Test
52+
public void testNegativeLength() {
53+
Assertions.assertThrows(IllegalArgumentException.class, () -> createParser("2 rsp -6 200 OK\n"));
54+
}
55+
56+
@Test
57+
public void testEndsWithoutNL() {
58+
RelpParser parser = createParser("2 rsp 6 200 OK");
59+
Assertions.assertFalse(parser.isComplete(), "parser isComplete() differs");
60+
}
61+
62+
@Test
63+
public void testCommandInvalid() {
64+
Assertions.assertThrows(IllegalStateException.class, () -> createParser("2 horse 6 200 OK\n"));
65+
}
66+
67+
@Test
68+
public void testCommandOpen() {
69+
RelpParser parser = createParser("0 open 0\n");
70+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
71+
Assertions.assertEquals("open", parser.getCommandString(), "parser getCommandString() differs");
72+
}
73+
74+
@Test
75+
public void testCommandClose() {
76+
RelpParser parser = createParser("0 close 0\n");
77+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
78+
Assertions.assertEquals("close", parser.getCommandString(), "parser getCommandString() differs");
79+
}
80+
81+
@Test
82+
public void testCommandAbort() {
83+
RelpParser parser = createParser("0 abort 0\n");
84+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
85+
Assertions.assertEquals("abort", parser.getCommandString(), "parser getCommandString() differs");
86+
}
87+
88+
@Test
89+
public void testCommandServerClose() {
90+
RelpParser parser = createParser("0 serverclose 0\n");
91+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
92+
Assertions.assertEquals("serverclose", parser.getCommandString(), "parser getCommandString() differs");
93+
}
94+
95+
@Test
96+
public void testCommandSyslog() {
97+
RelpParser parser = createParser("0 syslog 0\n");
98+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
99+
Assertions.assertEquals("syslog", parser.getCommandString(), "parser getCommandString() differs");
100+
}
101+
102+
@Test
103+
public void testCommandResponse() {
104+
RelpParser parser = createParser("0 rsp 0\n");
105+
Assertions.assertTrue(parser.isComplete(), "parser isComplete() differs");
106+
Assertions.assertEquals("rsp", parser.getCommandString(), "parser getCommandString() differs");
107+
}
108+
109+
@Test
110+
public void testReset() {
111+
RelpParser parser = createParser("0 rsp 6 200 OK\n");
112+
parser.reset();
113+
Assertions.assertFalse(parser.isComplete(), "parser isComplete() differs");
114+
Assertions.assertEquals(-1, parser.getTxnId(), "parser getTxnId() differs");
115+
Assertions.assertEquals("", parser.getCommandString(), "parser getCommandString() differs");
116+
Assertions.assertEquals(-1, parser.getLength(), "parser getLength() differs");
117+
Assertions.assertNull(parser.getData(), "parser getData() differs");
118+
}
119+
120+
@Test
121+
public void testNonNumericTxnId() {
122+
Assertions.assertThrows(NumberFormatException.class, () -> createParser("Seven rsp 6 200 OK\n"));
123+
}
124+
125+
@Test
126+
public void testNonNumericLength() {
127+
Assertions.assertThrows(NumberFormatException.class, () -> createParser("0 rsp six 200 OK\n"));
128+
}
129+
130+
@Test
131+
public void testTooLongMessage() {
132+
Assertions.assertThrows(IllegalStateException.class, () -> createParser("0 rsp 6 My Message Is Too Long"));
133+
}
134+
135+
@Test
136+
public void testMultipleLastNewlines() {
137+
// Feeding the parser after it has finished causes Illegal State
138+
Assertions.assertThrows(IllegalStateException.class, () -> createParser("0 rsp 3 six\n\n\n\n\n\n"));
139+
}
140+
141+
@Test
142+
public void testDataAfterLastNewline() {
143+
// Feeding the parser after it has finished causes Illegal State
144+
Assertions.assertThrows(IllegalStateException.class, () -> createParser("0 rsp 3 six\n\nBonjour"));
145+
}
146+
147+
@Test
148+
public void testMultipleMessagesInRow() {
149+
String message = "0 rsp 3 six\n1 rsp 4 four\n2 rsp 5 five!\n";
150+
HashMap<Integer, String> results = new HashMap<>();
151+
RelpParser parser = new RelpParser();
152+
for(byte b : message.getBytes()) {
153+
parser.parse(b);
154+
if(parser.isComplete()) {
155+
results.put(parser.getTxnId(), StandardCharsets.UTF_8.decode(parser.getData()).toString());
156+
parser.reset();
157+
}
158+
}
159+
Assertions.assertEquals("six", results.get(0), "parser getData() differs");
160+
Assertions.assertEquals("four", results.get(1), "parser getData() differs");
161+
Assertions.assertEquals("five!", results.get(2), "parser getData() differs");
162+
}
163+
164+
@Disabled(value="Triggers BufferOverflow and is not gracefully handled")
165+
@Test
166+
public void testVeryLongTxnId() {
167+
createParser("99999999999999999999 rsp 6 200 OK\n");
168+
}
169+
170+
@Disabled(value="Triggers BufferOverflow and is not gracefully handled")
171+
@Test
172+
public void testVeryLongCommand() {
173+
createParser("0 ThisShouldBeVeryLongCommandThatBreaksThings 6 200 OK\n");
174+
}
175+
176+
@Disabled(value="Triggers BufferOverflow and is not gracefully handled")
177+
@Test
178+
public void testVeryLongContentLength() {
179+
createParser("0 rsp 99999999999999999999 200 OK\n");
180+
}
181+
}

0 commit comments

Comments
 (0)