1 package be
.nikiroo
.utils
.test_code
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
5 import java
.io
.IOException
;
6 import java
.io
.InputStream
;
7 import java
.io
.NotSerializableException
;
9 import java
.util
.Arrays
;
11 import be
.nikiroo
.utils
.serial
.Exporter
;
12 import be
.nikiroo
.utils
.serial
.Importer
;
13 import be
.nikiroo
.utils
.test
.TestCase
;
14 import be
.nikiroo
.utils
.test
.TestLauncher
;
16 class SerialTest
extends TestLauncher
{
18 * Required for Import/Export of objects.
24 private void encodeRecodeTest(TestCase test
, Object data
) throws Exception
{
25 byte[] encoded
= toBytes(data
,true);
26 Object redata
= fromBytes(encoded
);
27 byte[] reencoded
= toBytes(redata
,true);
29 test
.assertEquals("Different data after encode/decode/encode", true,
30 Arrays
.equals(encoded
, reencoded
));
33 // try to remove pointer addresses
34 private byte[] toBytes(Object data
, boolean clearRefs
) throws NotSerializableException
,
36 ByteArrayOutputStream out
= new ByteArrayOutputStream();
37 new Exporter(out
).append(data
);
41 String tmp
= new String(out
.toByteArray(), "UTF-8");
42 tmp
= tmp
.replaceAll("@[0-9]*", "@REF");
43 return tmp
.getBytes("UTF-8");
46 return out
.toByteArray();
49 private Object
fromBytes(byte[] data
) throws NoSuchFieldException
,
50 NoSuchMethodException
, ClassNotFoundException
,
51 NullPointerException
, IOException
{
53 InputStream in
= new ByteArrayInputStream(data
);
55 return new Importer().read(in
).getValue();
61 public SerialTest(String
[] args
) {
62 super("Serial test", args
);
64 addTest(new TestCase("Simple class Import/Export") {
66 public void test() throws Exception
{
67 Data data
= new Data(42);
68 encodeRecodeTest(this, data
);
72 addTest(new TestCase() {
73 @SuppressWarnings("unused")
74 private TestCase me
= setName("Anonymous inner class");
77 public void test() throws Exception
{
78 Data data
= new Data() {
79 @SuppressWarnings("unused")
82 encodeRecodeTest(this, data
);
85 addTest(new TestCase() {
86 @SuppressWarnings("unused")
87 private TestCase me
= setName("Array of anonymous inner classes");
90 public void test() throws Exception
{
91 Data
[] data
= new Data
[] { new Data() {
92 @SuppressWarnings("unused")
96 byte[] encoded
= toBytes(data
,false);
97 Object redata
= fromBytes(encoded
);
99 // Comparing the 2 arrays won't be useful, because the @REFs
100 // will be ZIP-encoded; so we parse and re-encode each object
102 byte[] encoded1
= toBytes(data
[0],true);
103 byte[] reencoded1
= toBytes(((Data
[])redata
)[0],true);
105 assertEquals("Different data after encode/decode/encode", true,
106 Arrays
.equals(encoded1
, reencoded1
));
110 addTest(new TestCase("URL Import/Export") {
112 public void test() throws Exception {
113 URL data = new URL("https://fanfan.be/");
114 String encoded = new Exporter().append(data).toString(false,
116 Object redata = new Importer().read(encoded).getValue();
117 String reencoded = new Exporter().append(redata).toString(
119 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
120 reencoded.replaceAll("@[0-9]*", "@REF"));
123 addTest(new TestCase("URL-String Import/Export") {
125 public void test() throws Exception {
126 String data = new URL("https://fanfan.be/").toString();
127 String encoded = new Exporter().append(data).toString(false,
129 Object redata = new Importer().read(encoded).getValue();
130 String reencoded = new Exporter().append(redata).toString(
132 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
133 reencoded.replaceAll("@[0-9]*", "@REF"));
134 assertEquals(data, redata);
137 addTest(new TestCase("URL/URL-String arrays Import/Export") {
139 public void test() throws Exception {
140 final String url = "https://fanfan.be/";
141 Object[] data = new Object[] { new URL(url), url };
142 String encoded = new Exporter().append(data).toString(false,
144 Object redata = new Importer().read(encoded).getValue();
145 String reencoded = new Exporter().append(redata).toString(
147 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
148 reencoded.replaceAll("@[0-9]*", "@REF"));
149 assertEquals(data[0], ((Object[]) redata)[0]);
150 assertEquals(data[1], ((Object[]) redata)[1]);
153 addTest(new TestCase("Import/Export with nested objects") {
155 public void test() throws Exception {
156 Data data = new DataObject(new Data(21));
157 String encoded = new Exporter().append(data).toString(false,
159 Object redata = new Importer().read(encoded).getValue();
160 String reencoded = new Exporter().append(redata).toString(
162 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
163 reencoded.replaceAll("@[0-9]*", "@REF"));
166 addTest(new TestCase("Import/Export with nested objects forming a loop") {
168 public void test() throws Exception {
169 DataLoop data = new DataLoop("looping");
170 data.next = new DataLoop("level 2");
171 data.next.next = data;
172 String encoded = new Exporter().append(data).toString(false,
174 Object redata = new Importer().read(encoded).getValue();
175 String reencoded = new Exporter().append(redata).toString(
177 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
178 reencoded.replaceAll("@[0-9]*", "@REF"));
181 addTest(new TestCase("Array in Object Import/Export") {
183 public void test() throws Exception {
184 Object data = new DataArray();// new String[] { "un", "deux" };
185 String encoded = new Exporter().append(data).toString(false,
187 Object redata = new Importer().read(encoded).getValue();
188 String reencoded = new Exporter().append(redata).toString(
190 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
191 reencoded.replaceAll("@[0-9]*", "@REF"));
194 addTest(new TestCase("Array Import/Export") {
196 public void test() throws Exception {
197 Object data = new String[] { "un", "deux" };
198 String encoded = new Exporter().append(data).toString(false,
200 Object redata = new Importer().read(encoded).getValue();
201 String reencoded = new Exporter().append(redata).toString(
203 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
204 reencoded.replaceAll("@[0-9]*", "@REF"));
207 addTest(new TestCase("Enum Import/Export") {
209 public void test() throws Exception {
210 Object data = EnumToSend.FANFAN;
211 String encoded = new Exporter().append(data).toString(false,
213 Object redata = new Importer().read(encoded).getValue();
214 String reencoded = new Exporter().append(redata).toString(
216 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
217 reencoded.replaceAll("@[0-9]*", "@REF"));
220 addTest(new TestCase("B64 and ZIP String test") {
222 public void test() throws Exception {
223 Object data = "Fanfan la tulipe";
224 String encoded = new Exporter().append(data).toString(true,
226 String redata = (String) new Importer().read(encoded)
228 assertEquals("Items not identical after B64", data, redata);
229 encoded = new Exporter().append(data).toString(true, true);
230 redata = (String) new Importer().read(encoded).getValue();
231 assertEquals("Items not identical after ZIP", data, redata);
234 addTest(new TestCase("B64 and ZIP Data test") {
236 public void test() throws Exception {
237 Object data = new Data(55);
238 String encoded = new Exporter().append(data).toString(true,
240 Data redata = (Data) new Importer().read(encoded).getValue();
241 assertEquals("Items not identical after B64", data, redata);
242 encoded = new Exporter().append(data).toString(true, true);
243 redata = (Data) new Importer().read(encoded).getValue();
244 assertEquals("Items not identical after ZIP", data, redata);
247 addTest(new TestCase("B64 and ZIP 70000 chars test") {
249 public void test() throws Exception {
250 StringBuilder builder = new StringBuilder();
251 for (int i = 0; i < 7000; i++) {
252 builder.append("0123456789");
254 Object data = builder.toString();
255 String encoded = new Exporter().append(data).toString(true,
257 String redata = (String) new Importer().read(encoded)
259 assertEquals("Items not identical after B64", data, redata);
260 encoded = new Exporter().append(data).toString(true, true);
261 redata = (String) new Importer().read(encoded).getValue();
262 assertEquals("Items not identical after ZIP", data, redata);
269 public String
[] data
= new String
[] { "un", "deux" };
278 public Data(int value
) {
283 public boolean equals(Object obj
) {
284 if (obj
instanceof Data
) {
285 Data other
= (Data
) obj
;
286 return other
.value
== this.value
;
293 public int hashCode() {
294 return new Integer(value
).hashCode();
298 @SuppressWarnings("unused")
299 class DataObject
extends Data
{
302 @SuppressWarnings("synthetic-access")
303 private DataObject() {
306 @SuppressWarnings("synthetic-access")
307 public DataObject(Data data
) {
312 @SuppressWarnings("unused")
313 class DataLoop
extends Data
{
314 public DataLoop next
;
315 private String value
;
317 @SuppressWarnings("synthetic-access")
321 @SuppressWarnings("synthetic-access")
322 public DataLoop(String value
) {