1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.lang3;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertThrows;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24
25 import java.io.ByteArrayInputStream;
26 import java.io.IOException;
27 import java.io.InvalidObjectException;
28 import java.io.ObjectInputStream;
29
30 import org.apache.commons.lang3.reflect.FieldUtils;
31 import org.junit.jupiter.api.Test;
32
33
34
35
36 class CharRangeReadObjectTest {
37
38 private static Object deserialize(final byte[] bytes) throws IOException, ClassNotFoundException {
39 try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
40 return ois.readObject();
41 }
42 }
43
44 @Test
45 void testForgedInvertedRangeIsRejected() throws Exception {
46
47 assertEquals(CharRange.isIn('a', 'e'), CharRange.isIn('e', 'a'));
48 final CharRange seed = CharRange.isIn('a', 'e');
49 FieldUtils.writeDeclaredField(seed, "start", 'z', true);
50 FieldUtils.writeDeclaredField(seed, "end", 'a', true);
51 assertThrows(InvalidObjectException.class, () -> deserialize(SerializationUtils.serialize(seed)));
52 assertThrows(SerializationException.class, () -> SerializationUtils.roundtrip(seed));
53 }
54
55 @Test
56 void testRoundTripPreservesRange() throws Exception {
57 final CharRange range = CharRange.isIn('a', 'e');
58 final CharRange roundtrip = SerializationUtils.roundtrip(range);
59 assertEquals(range, roundtrip);
60 assertTrue(roundtrip.contains('c'));
61 assertFalse(roundtrip.contains('z'));
62 }
63 }