blob: 0e16973fa1e94fbc102cd03a1fc20e913648b9ae [file] [log] [blame]
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01001package eu.mulk.jgvariant.core;
2
3import static java.nio.ByteOrder.LITTLE_ENDIAN;
4import static java.nio.charset.StandardCharsets.UTF_8;
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +01005import static org.junit.jupiter.api.Assertions.assertAll;
6import static org.junit.jupiter.api.Assertions.assertArrayEquals;
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01007import static org.junit.jupiter.api.Assertions.assertEquals;
8
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +01009import java.nio.ByteBuffer;
10import java.util.List;
11import java.util.Optional;
12import org.junit.jupiter.api.Test;
13
14/**
15 * Tests based on the examples given in <a
16 * href="https://people.gnome.org/~desrt/gvariant-serialisation.pdf">~desrt/gvariant-serialisation.pdf</a>.
17 */
18class DecoderTest {
19
20 @Test
21 void testString() {
22 var data = new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010023 var decoder = Decoder.ofString(UTF_8);
24 assertEquals("hello world", decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010025 }
26
27 @Test
28 void testMaybe() {
29 var data =
30 new byte[] {0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00, 0x00};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010031 var decoder = Decoder.ofMaybe(Decoder.ofString(UTF_8));
32 assertEquals(Optional.of("hello world"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010033 }
34
35 @Test
36 void testBooleanArray() {
37 var data = new byte[] {0x01, 0x00, 0x00, 0x01, 0x01};
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010038 var decoder = Decoder.ofArray(Decoder.ofBoolean());
39 assertEquals(List.of(true, false, false, true, true), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010040 }
41
42 @Test
43 void testStructure() {
44 var data =
45 new byte[] {
46 0x66, 0x6F, 0x6F, 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x04
47 };
48
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010049 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010050
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010051 var decoder = Decoder.ofStructure(TestRecord.class, Decoder.ofString(UTF_8), Decoder.ofInt());
52 assertEquals(new TestRecord("foo", -1), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010053 }
54
55 @Test
56 void testComplexStructureArray() {
57 var data =
58 new byte[] {
59 0x68,
60 0x69,
61 0x00,
62 0x00,
63 (byte) 0xfe,
64 (byte) 0xff,
65 (byte) 0xff,
66 (byte) 0xff,
67 0x03,
68 0x00,
69 0x00,
70 0x00,
71 0x62,
72 0x79,
73 0x65,
74 0x00,
75 (byte) 0xff,
76 (byte) 0xff,
77 (byte) 0xff,
78 (byte) 0xff,
79 0x04,
80 0x09,
81 0x15
82 };
83
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010084 record TestRecord(String s, int i) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010085
86 var decoder =
87 Decoder.ofArray(
88 Decoder.ofStructure(
89 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010090 Decoder.ofString(UTF_8),
91 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010092 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +010093 List.of(new TestRecord("hi", -2), new TestRecord("bye", -1)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +010094 decoder.decode(ByteBuffer.wrap(data)));
95 }
96
97 @Test
98 void testStringArray() {
99 var data =
100 new byte[] {
101 0x69, 0x00, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E,
102 0x67, 0x73, 0x3F, 0x00, 0x02, 0x06, 0x0a, 0x13
103 };
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100104 var decoder = Decoder.ofArray(Decoder.ofString(UTF_8));
105 assertEquals(List.of("i", "can", "has", "strings?"), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100106 }
107
108 @Test
109 void testNestedStructure() {
110 var data =
111 new byte[] {
112 0x69, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
113 0x73, 0x3F, 0x00, 0x04, 0x0d, 0x05
114 };
115
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100116 record TestChild(byte b, String s) {}
117 record TestParent(TestChild tc, List<String> as) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100118
119 var decoder =
120 Decoder.ofStructure(
121 TestParent.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100122 Decoder.ofStructure(TestChild.class, Decoder.ofByte(), Decoder.ofString(UTF_8)),
123 Decoder.ofArray(Decoder.ofString(UTF_8)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100124
125 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100126 new TestParent(new TestChild((byte) 0x69, "can"), List.of("has", "strings?")),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100127 decoder.decode(ByteBuffer.wrap(data)));
128 }
129
130 @Test
Matthias Andreas Benkard55c34812021-12-14 21:51:10 +0100131 void testNestedStructureVariant() {
132 var data =
133 new byte[] {
134 0x69, 0x63, 0x61, 0x6E, 0x00, 0x68, 0x61, 0x73, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
135 0x73, 0x3F, 0x00, 0x04, 0x0d, 0x05, 0x00, 0x28, 0x28, 0x79, 0x73, 0x29, 0x61, 0x73, 0x29
136 };
137
138 var decoder = Decoder.ofVariant();
139 var result = (Object[]) decoder.decode(ByteBuffer.wrap(data));
140
141 assertAll(
142 () -> assertEquals(2, result.length),
143 () -> assertArrayEquals(new Object[] {(byte) 0x69, "can"}, (Object[]) result[0]),
144 () -> assertEquals(List.of("has", "strings?"), result[1]));
145 }
146
147 @Test
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100148 void testSimpleStructure() {
149 var data = new byte[] {0x60, 0x70};
150
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100151 record TestRecord(byte b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100152
153 var decoder =
154 Decoder.ofStructure(
155 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100156 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
157 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100158
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100159 assertEquals(new TestRecord((byte) 0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100160 }
161
162 @Test
163 void testPaddedStructureRight() {
164 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
165
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100166 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100167
168 var decoder =
169 Decoder.ofStructure(
170 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100171 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
172 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100173
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100174 assertEquals(new TestRecord(0x60, (byte) 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100175 }
176
177 @Test
178 void testPaddedStructureLeft() {
179 var data = new byte[] {0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00};
180
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100181 record TestRecord(byte b1, int b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100182
183 var decoder =
184 Decoder.ofStructure(
185 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100186 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN),
187 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100188
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100189 assertEquals(new TestRecord((byte) 0x60, 0x70), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100190 }
191
192 @Test
193 void testSimpleStructureArray() {
194 var data =
195 new byte[] {
196 0x60,
197 0x00,
198 0x00,
199 0x00,
200 0x70,
201 0x00,
202 0x00,
203 0x00,
204 (byte) 0x88,
205 0x02,
206 0x00,
207 0x00,
208 (byte) 0xF7,
209 0x00,
210 0x00,
211 0x00
212 };
213
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100214 record TestRecord(int b1, byte b2) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100215
216 var decoder =
217 Decoder.ofArray(
218 Decoder.ofStructure(
219 TestRecord.class,
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100220 Decoder.ofInt().withByteOrder(LITTLE_ENDIAN),
221 Decoder.ofByte().withByteOrder(LITTLE_ENDIAN)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100222
223 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100224 List.of(new TestRecord(96, (byte) 0x70), new TestRecord(648, (byte) 0xf7)),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100225 decoder.decode(ByteBuffer.wrap(data)));
226 }
227
228 @Test
229 void testByteArray() {
230 var data = new byte[] {0x04, 0x05, 0x06, 0x07};
231
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100232 var decoder = Decoder.ofArray(Decoder.ofByte());
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100233
234 assertEquals(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100235 List.of((byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07),
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100236 decoder.decode(ByteBuffer.wrap(data)));
237 }
238
239 @Test
240 void testIntegerArray() {
241 var data = new byte[] {0x04, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00};
242
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100243 var decoder = Decoder.ofArray(Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100244
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100245 assertEquals(List.of(4, 258), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100246 }
247
248 @Test
249 void testDictionaryEntry() {
250 var data =
251 new byte[] {0x61, 0x20, 0x6B, 0x65, 0x79, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x06};
252
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100253 record TestEntry(String key, int value) {}
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100254
255 var decoder =
256 Decoder.ofStructure(
Matthias Andreas Benkard35f7a202021-12-14 19:29:26 +0100257 TestEntry.class, Decoder.ofString(UTF_8), Decoder.ofInt().withByteOrder(LITTLE_ENDIAN));
258 assertEquals(new TestEntry("a key", 514), decoder.decode(ByteBuffer.wrap(data)));
Matthias Andreas Benkard261532a2021-12-12 20:09:27 +0100259 }
260}