Skip to content

Commit 397138c

Browse files
authored
compat: add test for deserializing stringref enabled and disabled (#17990)
1 parent 86ee4df commit 397138c

File tree

3 files changed

+222
-0
lines changed

3 files changed

+222
-0
lines changed

logstash-core/src/test/java/org/logstash/EventTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@
2121
package org.logstash;
2222

2323
import java.io.IOException;
24+
import java.io.InputStream;
2425
import java.math.BigDecimal;
2526
import java.math.BigInteger;
27+
import java.nio.charset.StandardCharsets;
2628
import java.util.ArrayList;
2729
import java.util.Arrays;
2830
import java.util.Collection;
2931
import java.util.Collections;
3032
import java.util.HashMap;
33+
import java.util.HexFormat;
3134
import java.util.List;
3235
import java.util.Map;
3336
import org.jruby.RubyString;
@@ -41,6 +44,7 @@
4144
import static org.hamcrest.MatcherAssert.assertThat;
4245
import static org.junit.Assert.assertEquals;
4346
import static org.junit.Assert.assertFalse;
47+
import static org.junit.Assert.assertNotNull;
4448
import static org.junit.Assert.assertNull;
4549
import static org.junit.Assert.assertTrue;
4650
import static org.logstash.Event.getIllegalTagsAction;
@@ -143,6 +147,24 @@ public void bigNumsBinaryRoundtrip() throws Exception {
143147
assertEquals(bd, deserialized.getField("bd"));
144148
}
145149

150+
@Test
151+
public void deserializeStringrefExtensionEnabled() throws Exception {
152+
byte[] stringrefCBOR = loadAnnotatedCBORFixture("stringref-enabled.annotated-cbor.txt");
153+
Event event = Event.deserialize(stringrefCBOR);
154+
event.getField("[event][original]");
155+
assertEquals("stringref", event.getField("test"));
156+
assertEquals(true, event.getField("[extension][enabled]"));
157+
}
158+
159+
@Test
160+
public void deserializeStringrefExtensionDisabled() throws Exception {
161+
byte[] stringrefCBOR = loadAnnotatedCBORFixture("stringref-disabled.annotated-cbor.txt");
162+
Event event = Event.deserialize(stringrefCBOR);
163+
event.getField("[event][original]");
164+
assertEquals("stringref", event.getField("test"));
165+
assertEquals(true, event.getField("[extension][enabled]"));
166+
}
167+
146168
@Test
147169
public void testBareToJson() throws Exception {
148170
Event e = new Event();
@@ -600,4 +622,19 @@ private void withIllegalTagsAction(final Event.IllegalTagsAction temporaryIllega
600622
Event.setIllegalTagsAction(previous.toString());
601623
}
602624
}
625+
626+
static byte[] loadAnnotatedCBORFixture(String name) throws IOException {
627+
try (InputStream resourceAsStream = EventTest.class.getResourceAsStream(name)) {
628+
assertNotNull(resourceAsStream);
629+
630+
String annotated = new String(resourceAsStream.readAllBytes(), StandardCharsets.UTF_8);
631+
// annotated CBOR: strip #-initiated line comments, then strip whitespace to get hex
632+
String hexBytes = annotated.replaceAll("#.*(\\n|$)", "").replaceAll("\\s", "");
633+
634+
// result should be even number of hex digits
635+
assert hexBytes.matches("(?i:[0-9a-f]{2})*");
636+
637+
return HexFormat.of().parseHex(hexBytes);
638+
}
639+
}
603640
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
9f # array(*)
2+
71 # text(17)
3+
6a6176612e7574696c2e486173684d6170 # "java.util.HashMap"
4+
bf # map(*)
5+
64 # text(4)
6+
44415441 # "DATA"
7+
9f # array(*)
8+
78 19 # text(25)
9+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
10+
7665727465644d6170 # "vertedMap"
11+
bf # map(*)
12+
64 # text(4)
13+
686f7374 # "host"
14+
9f # array(*)
15+
78 19 # text(25)
16+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
17+
7665727465644d6170 # "vertedMap"
18+
bf # map(*)
19+
68 # text(8)
20+
686f73746e616d65 # "hostname"
21+
9f # array(*)
22+
74 # text(20)
23+
6f72672e6a727562792e52756279537472696e67 # "org.jruby.RubyString"
24+
67 # text(7)
25+
70657268617073 # "perhaps"
26+
ff # break
27+
ff # break
28+
ff # break
29+
65 # text(5)
30+
6576656e74 # "event"
31+
9f # array(*)
32+
78 19 # text(25)
33+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
34+
7665727465644d6170 # "vertedMap"
35+
bf # map(*)
36+
68 # text(8)
37+
6f726967696e616c # "original"
38+
9f # array(*)
39+
74 # text(20)
40+
6f72672e6a727562792e52756279537472696e67 # "org.jruby.RubyString"
41+
78 32 # text(50)
42+
7b2274657374223a22737472696e6772 # "{\"test\":\"stringr"
43+
6566222c22657874656e73696f6e223a # "ef\",\"extension\":"
44+
7b22656e61626c6564223a747275657d # "{\"enabled\":true}"
45+
7d0a # "}\n"
46+
ff # break
47+
ff # break
48+
ff # break
49+
68 # text(8)
50+
4076657273696f6e # "@version"
51+
61 # text(1)
52+
31 # "1"
53+
69 # text(9)
54+
657874656e73696f6e # "extension"
55+
9f # array(*)
56+
78 19 # text(25)
57+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
58+
7665727465644d6170 # "vertedMap"
59+
bf # map(*)
60+
67 # text(7)
61+
656e61626c6564 # "enabled"
62+
f5 # true, simple(21)
63+
ff # break
64+
ff # break
65+
6a # text(10)
66+
4074696d657374616d70 # "@timestamp"
67+
9f # array(*)
68+
76 # text(22)
69+
6f72672e6c6f6773746173682e54696d657374616d70 # "org.logstash.Timestamp"
70+
78 1b # text(27)
71+
323032352d30372d32385431363a3432 # "2025-07-28T16:42"
72+
3a32342e3432313434365a # ":24.421446Z"
73+
ff # break
74+
64 # text(4)
75+
74657374 # "test"
76+
9f # array(*)
77+
74 # text(20)
78+
6f72672e6a727562792e52756279537472696e67 # "org.jruby.RubyString"
79+
69 # text(9)
80+
737472696e67726566 # "stringref"
81+
ff # break
82+
ff # break
83+
ff # break
84+
64 # text(4)
85+
4d455441 # "META"
86+
9f # array(*)
87+
78 19 # text(25)
88+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
89+
7665727465644d6170 # "vertedMap"
90+
bf # map(*)
91+
ff # break
92+
ff # break
93+
ff # break
94+
ff # break
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
d9 0100 # tag(256)
2+
9f # array(*)
3+
71 # text(17)
4+
6a6176612e7574696c2e486173684d6170 # "java.util.HashMap"
5+
bf # map(*)
6+
64 # text(4)
7+
44415441 # "DATA"
8+
9f # array(*)
9+
78 19 # text(25)
10+
6f72672e6c6f6773746173682e436f6e # "org.logstash.Con"
11+
7665727465644d6170 # "vertedMap"
12+
bf # map(*)
13+
64 # text(4)
14+
74657374 # "test"
15+
9f # array(*)
16+
74 # text(20)
17+
6f72672e6a727562792e52756279537472696e67 # "org.jruby.RubyString"
18+
69 # text(9)
19+
737472696e67726566 # "stringref"
20+
ff # break
21+
68 # text(8)
22+
4076657273696f6e # "@version"
23+
61 # text(1)
24+
31 # "1"
25+
69 # text(9)
26+
657874656e73696f6e # "extension"
27+
9f # array(*)
28+
d8 19 # tag(25)
29+
02 # unsigned(2)
30+
bf # map(*)
31+
67 # text(7)
32+
656e61626c6564 # "enabled"
33+
f5 # true, simple(21)
34+
ff # break
35+
ff # break
36+
6a # text(10)
37+
4074696d657374616d70 # "@timestamp"
38+
9f # array(*)
39+
76 # text(22)
40+
6f72672e6c6f6773746173682e54696d657374616d70 # "org.logstash.Timestamp"
41+
78 1b # text(27)
42+
323032352d30372d32385431353a3433 # "2025-07-28T15:43"
43+
3a35332e3334303537325a # ":53.340572Z"
44+
ff # break
45+
65 # text(5)
46+
6576656e74 # "event"
47+
9f # array(*)
48+
d8 19 # tag(25)
49+
02 # unsigned(2)
50+
bf # map(*)
51+
68 # text(8)
52+
6f726967696e616c # "original"
53+
9f # array(*)
54+
d8 19 # tag(25)
55+
04 # unsigned(4)
56+
78 32 # text(50)
57+
7b2274657374223a22737472696e6772 # "{\"test\":\"stringr"
58+
6566222c22657874656e73696f6e223a # "ef\",\"extension\":"
59+
7b22656e61626c6564223a747275657d # "{\"enabled\":true}"
60+
7d0a # "}\n"
61+
ff # break
62+
ff # break
63+
ff # break
64+
64 # text(4)
65+
686f7374 # "host"
66+
9f # array(*)
67+
d8 19 # tag(25)
68+
02 # unsigned(2)
69+
bf # map(*)
70+
68 # text(8)
71+
686f73746e616d65 # "hostname"
72+
9f # array(*)
73+
d8 19 # tag(25)
74+
04 # unsigned(4)
75+
67 # text(7)
76+
70657268617073 # "perhaps"
77+
ff # break
78+
ff # break
79+
ff # break
80+
ff # break
81+
ff # break
82+
64 # text(4)
83+
4d455441 # "META"
84+
9f # array(*)
85+
d8 19 # tag(25)
86+
02 # unsigned(2)
87+
bf # map(*)
88+
ff # break
89+
ff # break
90+
ff # break
91+
ff # break

0 commit comments

Comments
 (0)