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 // try to remove pointer addresses
25 private byte[] toBytes(Object data
) throws NotSerializableException
,
27 ByteArrayOutputStream out
= new ByteArrayOutputStream();
28 new Exporter(out
).append(data
);
30 String tmp
= new String(out
.toByteArray(), "UTF-8");
31 tmp
= tmp
.replaceAll("@[0-9]*", "@REF");
32 return tmp
.getBytes("UTF-8");
35 private Object
fromBytes(byte[] data
) throws NoSuchFieldException
,
36 NoSuchMethodException
, ClassNotFoundException
,
37 NullPointerException
, IOException
{
39 InputStream in
= new ByteArrayInputStream(data
);
41 return new Importer().read(in
).getValue();
47 public SerialTest(String
[] args
) {
48 super("Serial test", args
);
50 addTest(new TestCase("Simple class Import/Export") {
52 public void test() throws Exception
{
53 Data data
= new Data(42);
55 byte[] encoded
= toBytes(data
);
56 Object redata
= fromBytes(encoded
);
57 byte[] reencoded
= toBytes(redata
);
59 assertEquals("Different data after encode/decode/encode", true,
60 Arrays
.equals(encoded
, reencoded
));
64 addTest(new TestCase() {
65 @SuppressWarnings("unused")
66 private TestCase me
= setName("Anonymous inner class");
69 public void test() throws Exception
{
70 Data data
= new Data() {
71 @SuppressWarnings("unused")
74 String encoded
= new Exporter().append(data
).toString(false,
76 Object redata
= new Importer().read(encoded
).getValue();
77 String reencoded
= new Exporter().append(redata
).toString(
79 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
80 reencoded
.replaceAll("@[0-9]*", "@REF"));
83 addTest(new TestCase() {
84 @SuppressWarnings("unused")
85 private TestCase me
= setName("Array of anonymous inner classes");
88 public void test() throws Exception
{
89 Data
[] data
= new Data
[] { new Data() {
90 @SuppressWarnings("unused")
93 String encoded
= new Exporter().append(data
).toString(false,
95 Object redata
= new Importer().read(encoded
).getValue();
96 String reencoded
= new Exporter().append(redata
).toString(
98 // Comparing the 2 strings won't be useful, because the @REFs
99 // will be ZIP-encoded; so we parse and re-encode the object
100 encoded
= new Exporter().append(data
[0]).toString(false, false);
102 reencoded
= new Exporter().append(((Data
[]) redata
)[0])
103 .toString(false, false);
104 } catch (Exception e
) {
105 fail("Cannot cast the returned data into its original object",
108 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
109 reencoded
.replaceAll("@[0-9]*", "@REF"));
112 addTest(new TestCase("URL Import/Export") {
114 public void test() throws Exception
{
115 URL data
= new URL("https://fanfan.be/");
116 String encoded
= new Exporter().append(data
).toString(false,
118 Object redata
= new Importer().read(encoded
).getValue();
119 String reencoded
= new Exporter().append(redata
).toString(
121 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
122 reencoded
.replaceAll("@[0-9]*", "@REF"));
125 addTest(new TestCase("URL-String Import/Export") {
127 public void test() throws Exception
{
128 String data
= new URL("https://fanfan.be/").toString();
129 String encoded
= new Exporter().append(data
).toString(false,
131 Object redata
= new Importer().read(encoded
).getValue();
132 String reencoded
= new Exporter().append(redata
).toString(
134 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
135 reencoded
.replaceAll("@[0-9]*", "@REF"));
136 assertEquals(data
, redata
);
139 addTest(new TestCase("URL/URL-String arrays Import/Export") {
141 public void test() throws Exception
{
142 final String url
= "https://fanfan.be/";
143 Object
[] data
= new Object
[] { new URL(url
), url
};
144 String encoded
= new Exporter().append(data
).toString(false,
146 Object redata
= new Importer().read(encoded
).getValue();
147 String reencoded
= new Exporter().append(redata
).toString(
149 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
150 reencoded
.replaceAll("@[0-9]*", "@REF"));
151 assertEquals(data
[0], ((Object
[]) redata
)[0]);
152 assertEquals(data
[1], ((Object
[]) redata
)[1]);
155 addTest(new TestCase("Import/Export with nested objects") {
157 public void test() throws Exception
{
158 Data data
= new DataObject(new Data(21));
159 String encoded
= new Exporter().append(data
).toString(false,
161 Object redata
= new Importer().read(encoded
).getValue();
162 String reencoded
= new Exporter().append(redata
).toString(
164 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
165 reencoded
.replaceAll("@[0-9]*", "@REF"));
168 addTest(new TestCase("Import/Export with nested objects forming a loop") {
170 public void test() throws Exception
{
171 DataLoop data
= new DataLoop("looping");
172 data
.next
= new DataLoop("level 2");
173 data
.next
.next
= data
;
174 String encoded
= new Exporter().append(data
).toString(false,
176 Object redata
= new Importer().read(encoded
).getValue();
177 String reencoded
= new Exporter().append(redata
).toString(
179 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
180 reencoded
.replaceAll("@[0-9]*", "@REF"));
183 addTest(new TestCase("Array in Object Import/Export") {
185 public void test() throws Exception
{
186 Object data
= new DataArray();// new String[] { "un", "deux" };
187 String encoded
= new Exporter().append(data
).toString(false,
189 Object redata
= new Importer().read(encoded
).getValue();
190 String reencoded
= new Exporter().append(redata
).toString(
192 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
193 reencoded
.replaceAll("@[0-9]*", "@REF"));
196 addTest(new TestCase("Array Import/Export") {
198 public void test() throws Exception
{
199 Object data
= new String
[] { "un", "deux" };
200 String encoded
= new Exporter().append(data
).toString(false,
202 Object redata
= new Importer().read(encoded
).getValue();
203 String reencoded
= new Exporter().append(redata
).toString(
205 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
206 reencoded
.replaceAll("@[0-9]*", "@REF"));
209 addTest(new TestCase("Enum Import/Export") {
211 public void test() throws Exception
{
212 Object data
= EnumToSend
.FANFAN
;
213 String encoded
= new Exporter().append(data
).toString(false,
215 Object redata
= new Importer().read(encoded
).getValue();
216 String reencoded
= new Exporter().append(redata
).toString(
218 assertEquals(encoded
.replaceAll("@[0-9]*", "@REF"),
219 reencoded
.replaceAll("@[0-9]*", "@REF"));
222 addTest(new TestCase("B64 and ZIP String test") {
224 public void test() throws Exception
{
225 Object data
= "Fanfan la tulipe";
226 String encoded
= new Exporter().append(data
).toString(true,
228 String redata
= (String
) new Importer().read(encoded
)
230 assertEquals("Items not identical after B64", data
, redata
);
231 encoded
= new Exporter().append(data
).toString(true, true);
232 redata
= (String
) new Importer().read(encoded
).getValue();
233 assertEquals("Items not identical after ZIP", data
, redata
);
236 addTest(new TestCase("B64 and ZIP Data test") {
238 public void test() throws Exception
{
239 Object data
= new Data(55);
240 String encoded
= new Exporter().append(data
).toString(true,
242 Data redata
= (Data
) new Importer().read(encoded
).getValue();
243 assertEquals("Items not identical after B64", data
, redata
);
244 encoded
= new Exporter().append(data
).toString(true, true);
245 redata
= (Data
) new Importer().read(encoded
).getValue();
246 assertEquals("Items not identical after ZIP", data
, redata
);
249 addTest(new TestCase("B64 and ZIP 70000 chars test") {
251 public void test() throws Exception
{
252 StringBuilder builder
= new StringBuilder();
253 for (int i
= 0; i
< 7000; i
++) {
254 builder
.append("0123456789");
256 Object data
= builder
.toString();
257 String encoded
= new Exporter().append(data
).toString(true,
259 String redata
= (String
) new Importer().read(encoded
)
261 assertEquals("Items not identical after B64", data
, redata
);
262 encoded
= new Exporter().append(data
).toString(true, true);
263 redata
= (String
) new Importer().read(encoded
).getValue();
264 assertEquals("Items not identical after ZIP", data
, redata
);
270 public String
[] data
= new String
[] { "un", "deux" };
279 public Data(int value
) {
284 public boolean equals(Object obj
) {
285 if (obj
instanceof Data
) {
286 Data other
= (Data
) obj
;
287 return other
.value
== this.value
;
294 public int hashCode() {
295 return new Integer(value
).hashCode();
299 @SuppressWarnings("unused")
300 class DataObject
extends Data
{
303 @SuppressWarnings("synthetic-access")
304 private DataObject() {
307 @SuppressWarnings("synthetic-access")
308 public DataObject(Data data
) {
313 @SuppressWarnings("unused")
314 class DataLoop
extends Data
{
315 public DataLoop next
;
316 private String value
;
318 @SuppressWarnings("synthetic-access")
322 @SuppressWarnings("synthetic-access")
323 public DataLoop(String value
) {