1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.os.cts;
18 
19 import java.io.FileDescriptor;
20 import java.io.Serializable;
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.concurrent.ExecutionException;
28 import java.util.concurrent.TimeUnit;
29 import java.util.concurrent.TimeoutException;
30 
31 import android.app.Service;
32 import android.content.ComponentName;
33 import android.content.Context;
34 import android.content.Intent;
35 import android.content.ServiceConnection;
36 import android.content.pm.Signature;
37 import android.os.BadParcelableException;
38 import android.os.Binder;
39 import android.os.Bundle;
40 import android.os.IBinder;
41 import android.os.IInterface;
42 import android.os.Parcel;
43 import android.os.ParcelFileDescriptor;
44 import android.os.Parcelable;
45 import android.test.AndroidTestCase;
46 import android.util.Log;
47 import android.util.SparseArray;
48 import android.util.SparseBooleanArray;
49 
50 import com.google.common.util.concurrent.AbstractFuture;
51 
52 public class ParcelTest extends AndroidTestCase {
53 
testObtain()54     public void testObtain() {
55         Parcel p1 = Parcel.obtain();
56         assertNotNull(p1);
57         Parcel p2 = Parcel.obtain();
58         assertNotNull(p2);
59         Parcel p3 = Parcel.obtain();
60         assertNotNull(p3);
61         Parcel p4 = Parcel.obtain();
62         assertNotNull(p4);
63         Parcel p5 = Parcel.obtain();
64         assertNotNull(p5);
65         Parcel p6 = Parcel.obtain();
66         assertNotNull(p6);
67         Parcel p7 = Parcel.obtain();
68         assertNotNull(p7);
69 
70         p1.recycle();
71         p2.recycle();
72         p3.recycle();
73         p4.recycle();
74         p5.recycle();
75         p6.recycle();
76         p7.recycle();
77     }
78 
testAppendFrom()79     public void testAppendFrom() {
80         Parcel p;
81         Parcel p2;
82         int d1;
83         int d2;
84 
85         p = Parcel.obtain();
86         d1 = p.dataPosition();
87         p.writeInt(7);
88         p.writeInt(5);
89         d2 = p.dataPosition();
90         p2 = Parcel.obtain();
91         p2.appendFrom(p, d1, d2 - d1);
92         p2.setDataPosition(0);
93         assertEquals(7, p2.readInt());
94         assertEquals(5, p2.readInt());
95         p2.recycle();
96         p.recycle();
97     }
98 
testDataAvail()99     public void testDataAvail() {
100         Parcel p;
101 
102         p = Parcel.obtain();
103         p.writeInt(7); // size 4
104         p.writeInt(5); // size 4
105         p.writeLong(7L); // size 8
106         p.writeString("7L"); // size 12
107         p.setDataPosition(0);
108         assertEquals(p.dataSize(), p.dataAvail());
109         p.readInt();
110         assertEquals(p.dataSize() - p.dataPosition(), p.dataAvail());
111         p.readInt();
112         assertEquals(p.dataSize() - p.dataPosition(), p.dataAvail());
113         p.readLong();
114         assertEquals(p.dataSize() - p.dataPosition(), p.dataAvail());
115         p.readString();
116         assertEquals(p.dataSize() - p.dataPosition(), p.dataAvail());
117         p.recycle();
118     }
119 
testDataCapacity()120     public void testDataCapacity() {
121         Parcel p;
122 
123         p = Parcel.obtain();
124         assertEquals(0, p.dataCapacity());
125         p.writeInt(7); // size 4
126         int dC1 = p.dataCapacity();
127         p.writeDouble(2.19);
128         int dC2 = p.dataCapacity();
129         assertTrue(dC2 >= dC1);
130         p.recycle();
131     }
132 
testSetDataCapacity()133     public void testSetDataCapacity() {
134         Parcel p;
135 
136         p = Parcel.obtain();
137         assertEquals(0, p.dataCapacity());
138         p.setDataCapacity(2);
139         assertEquals(2, p.dataCapacity());
140         p.setDataCapacity(1);
141         assertEquals(2, p.dataCapacity());
142         p.setDataCapacity(3);
143         assertEquals(3, p.dataCapacity());
144         p.recycle();
145     }
146 
testDataPosition()147     public void testDataPosition() {
148         Parcel p;
149 
150         p = Parcel.obtain();
151         assertEquals(0, p.dataPosition());
152         p.writeInt(7); // size 4
153         int dP1 = p.dataPosition();
154         p.writeLong(7L); // size 8
155         int dP2 = p.dataPosition();
156         assertTrue(dP2 > dP1);
157         p.recycle();
158     }
159 
testSetDataPosition()160     public void testSetDataPosition() {
161         Parcel p;
162 
163         p = Parcel.obtain();
164         assertEquals(0, p.dataSize());
165         assertEquals(0, p.dataPosition());
166         p.setDataPosition(4);
167         assertEquals(4, p.dataPosition());
168         p.setDataPosition(7);
169         assertEquals(7, p.dataPosition());
170         p.setDataPosition(0);
171         p.writeInt(7);
172         assertEquals(4, p.dataSize());
173         p.setDataPosition(4);
174         assertEquals(4, p.dataPosition());
175         p.setDataPosition(7);
176         assertEquals(7, p.dataPosition());
177         p.recycle();
178     }
179 
testDataSize()180     public void testDataSize() {
181         Parcel p;
182 
183         p = Parcel.obtain();
184         assertEquals(0, p.dataSize());
185         p.writeInt(7); // size 4
186         assertEquals(4, p.dataSize());
187         p.writeInt(5); // size 4
188         assertEquals(8, p.dataSize());
189         p.writeLong(7L); // size 8
190         assertEquals(16, p.dataSize());
191         p.recycle();
192     }
193 
testSetDataSize()194     public void testSetDataSize() {
195         Parcel p;
196 
197         p = Parcel.obtain();
198         assertEquals(0, p.dataSize());
199         p.setDataSize(5);
200         assertEquals(5, p.dataSize());
201         p.setDataSize(3);
202         assertEquals(3, p.dataSize());
203 
204         p.writeInt(3);
205         assertEquals(4, p.dataSize());
206         p.setDataSize(5);
207         assertEquals(5, p.dataSize());
208         p.setDataSize(3);
209         assertEquals(3, p.dataSize());
210         p.recycle();
211     }
212 
testEnforceInterface()213     public void testEnforceInterface() {
214         Parcel p;
215         String s = "IBinder interface token";
216 
217         p = Parcel.obtain();
218         p.writeInterfaceToken(s);
219         p.setDataPosition(0);
220         try {
221             p.enforceInterface("");
222             fail("Should throw an SecurityException");
223         } catch (SecurityException e) {
224             //expected
225         }
226         p.recycle();
227 
228         p = Parcel.obtain();
229         p.writeInterfaceToken(s);
230         p.setDataPosition(0);
231         p.enforceInterface(s);
232         p.recycle();
233     }
234 
testMarshall()235     public void testMarshall() {
236         final byte[] c = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
237                     (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
238 
239         Parcel p1 = Parcel.obtain();
240         p1.writeByteArray(c);
241         p1.setDataPosition(0);
242         byte[] d1 = p1.marshall();
243 
244         Parcel p2 = Parcel.obtain();
245         p2.unmarshall(d1, 0, d1.length);
246         p2.setDataPosition(0);
247         byte[] d2 = new byte[c.length];
248         p2.readByteArray(d2);
249 
250         for (int i = 0; i < c.length; i++) {
251             assertEquals(c[i], d2[i]);
252         }
253 
254         p1.recycle();
255         p2.recycle();
256     }
257 
258     @SuppressWarnings("unchecked")
testReadValue()259     public void testReadValue() {
260         Parcel p;
261         MockClassLoader mcl = new MockClassLoader();
262 
263         // test null
264         p = Parcel.obtain();
265         p.writeValue(null);
266         p.setDataPosition(0);
267         assertNull(p.readValue(mcl));
268         p.recycle();
269 
270         // test String
271         p = Parcel.obtain();
272         p.writeValue("String");
273         p.setDataPosition(0);
274         assertEquals("String", p.readValue(mcl));
275         p.recycle();
276 
277         // test Integer
278         p = Parcel.obtain();
279         p.writeValue(Integer.MAX_VALUE);
280         p.setDataPosition(0);
281         assertEquals(Integer.MAX_VALUE, p.readValue(mcl));
282         p.recycle();
283 
284         // test Map
285         HashMap map = new HashMap();
286         HashMap map2;
287         map.put("string", "String");
288         map.put("int", Integer.MAX_VALUE);
289         map.put("boolean", true);
290         p = Parcel.obtain();
291         p.writeValue(map);
292         p.setDataPosition(0);
293         map2 = (HashMap) p.readValue(mcl);
294         assertNotNull(map2);
295         assertEquals(map.size(), map2.size());
296         assertEquals("String", map.get("string"));
297         assertEquals(Integer.MAX_VALUE, map.get("int"));
298         assertEquals(true, map.get("boolean"));
299         p.recycle();
300 
301         // test Bundle
302         Bundle bundle = new Bundle();
303         bundle.putBoolean("boolean", true);
304         bundle.putInt("int", Integer.MAX_VALUE);
305         bundle.putString("string", "String");
306         Bundle bundle2;
307         p = Parcel.obtain();
308         p.writeValue(bundle);
309         p.setDataPosition(0);
310         bundle2 = (Bundle) p.readValue(mcl);
311         assertNotNull(bundle2);
312         assertEquals(true, bundle2.getBoolean("boolean"));
313         assertEquals(Integer.MAX_VALUE, bundle2.getInt("int"));
314         assertEquals("String", bundle2.getString("string"));
315         p.recycle();
316 
317         // test Parcelable
318         final String signatureString  = "1234567890abcdef";
319         Signature s = new Signature(signatureString);
320         p = Parcel.obtain();
321         p.writeValue(s);
322         p.setDataPosition(0);
323         assertEquals(s, p.readValue(mcl));
324         p.recycle();
325 
326         // test Short
327         p = Parcel.obtain();
328         p.writeValue(Short.MAX_VALUE);
329         p.setDataPosition(0);
330         assertEquals(Short.MAX_VALUE, p.readValue(mcl));
331         p.recycle();
332 
333         // test Long
334         p = Parcel.obtain();
335         p.writeValue(Long.MAX_VALUE);
336         p.setDataPosition(0);
337         assertEquals(Long.MAX_VALUE, p.readValue(mcl));
338         p.recycle();
339 
340         // test Float
341         p = Parcel.obtain();
342         p.writeValue(Float.MAX_VALUE);
343         p.setDataPosition(0);
344         assertEquals(Float.MAX_VALUE, p.readValue(mcl));
345         p.recycle();
346 
347         // test Double
348         p = Parcel.obtain();
349         p.writeValue(Double.MAX_VALUE);
350         p.setDataPosition(0);
351         assertEquals(Double.MAX_VALUE, p.readValue(mcl));
352         p.recycle();
353 
354         // test Boolean
355         p = Parcel.obtain();
356         p.writeValue(true);
357         p.writeValue(false);
358         p.setDataPosition(0);
359         assertTrue((Boolean) p.readValue(mcl));
360         assertFalse((Boolean) p.readValue(mcl));
361         p.recycle();
362 
363         // test CharSequence
364         p = Parcel.obtain();
365         p.writeValue((CharSequence) "CharSequence");
366         p.setDataPosition(0);
367         assertEquals("CharSequence", p.readValue(mcl));
368         p.recycle();
369 
370         // test List
371         ArrayList arrayList2 = new ArrayList();
372         arrayList2.add(Integer.MAX_VALUE);
373         arrayList2.add(true);
374         arrayList2.add(Long.MAX_VALUE);
375         ArrayList arrayList = new ArrayList();
376         p = Parcel.obtain();
377         p.writeValue(arrayList2);
378         p.setDataPosition(0);
379         assertEquals(0, arrayList.size());
380         arrayList = (ArrayList) p.readValue(mcl);
381         assertEquals(3, arrayList.size());
382         for (int i = 0; i < arrayList.size(); i++) {
383             assertEquals(arrayList.get(i), arrayList2.get(i));
384         }
385         p.recycle();
386 
387         // test SparseArray
388         SparseArray<Object> sparseArray = new SparseArray<Object>();
389         sparseArray.put(3, "String");
390         sparseArray.put(2, Long.MAX_VALUE);
391         sparseArray.put(4, Float.MAX_VALUE);
392         sparseArray.put(0, Integer.MAX_VALUE);
393         sparseArray.put(1, true);
394         sparseArray.put(10, true);
395         SparseArray<Object> sparseArray2;
396         p = Parcel.obtain();
397         p.writeValue(sparseArray);
398         p.setDataPosition(0);
399         sparseArray2 = (SparseArray<Object>) p.readValue(mcl);
400         assertNotNull(sparseArray2);
401         assertEquals(sparseArray.size(), sparseArray2.size());
402         assertEquals(sparseArray.get(0), sparseArray2.get(0));
403         assertEquals(sparseArray.get(1), sparseArray2.get(1));
404         assertEquals(sparseArray.get(2), sparseArray2.get(2));
405         assertEquals(sparseArray.get(3), sparseArray2.get(3));
406         assertEquals(sparseArray.get(4), sparseArray2.get(4));
407         assertEquals(sparseArray.get(10), sparseArray2.get(10));
408         p.recycle();
409 
410         // test boolean[]
411         boolean[] booleanArray  = {true, false, true, false};
412         boolean[] booleanArray2 = new boolean[booleanArray.length];
413         p = Parcel.obtain();
414         p.writeValue(booleanArray);
415         p.setDataPosition(0);
416         booleanArray2 = (boolean[]) p.readValue(mcl);
417         for (int i = 0; i < booleanArray.length; i++) {
418             assertEquals(booleanArray[i], booleanArray2[i]);
419         }
420         p.recycle();
421 
422         // test byte[]
423         byte[] byteArray = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
424                 (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
425         byte[] byteArray2 = new byte[byteArray.length];
426         p = Parcel.obtain();
427         p.writeValue(byteArray);
428         p.setDataPosition(0);
429         byteArray2 = (byte[]) p.readValue(mcl);
430         for (int i = 0; i < byteArray.length; i++) {
431             assertEquals(byteArray[i], byteArray2[i]);
432         }
433         p.recycle();
434 
435         // test string[]
436         String[] stringArray = {"",
437                 "a",
438                 "Hello, Android!",
439                 "A long string that is used to test the api readStringArray(),"};
440         String[] stringArray2 = new String[stringArray.length];
441         p = Parcel.obtain();
442         p.writeValue(stringArray);
443         p.setDataPosition(0);
444         stringArray2 = (String[]) p.readValue(mcl);
445         for (int i = 0; i < stringArray.length; i++) {
446             assertEquals(stringArray[i], stringArray2[i]);
447         }
448         p.recycle();
449 
450         // test IBinder
451         Binder binder;
452         Binder binder2 = new Binder();
453         p = Parcel.obtain();
454         p.writeValue(binder2);
455         p.setDataPosition(0);
456         binder = (Binder) p.readValue(mcl);
457         assertEquals(binder2, binder);
458         p.recycle();
459 
460         // test Parcelable[]
461         Signature[] signatures = {new Signature("1234"),
462                 new Signature("ABCD"),
463                 new Signature("abcd")};
464         Parcelable[] signatures2;
465         p = Parcel.obtain();
466         p.writeValue(signatures);
467         p.setDataPosition(0);
468         signatures2 = (Parcelable[]) p.readValue(mcl);
469         for (int i = 0; i < signatures.length; i++) {
470             assertEquals(signatures[i], signatures2[i]);
471         }
472         p.recycle();
473 
474         // test Object
475         Object[] objects = new Object[5];
476         objects[0] = Integer.MAX_VALUE;
477         objects[1] = true;
478         objects[2] = Long.MAX_VALUE;
479         objects[3] = "String";
480         objects[4] = Float.MAX_VALUE;
481         Object[] objects2;
482         p = Parcel.obtain();
483         p.writeValue(objects);
484         p.setDataPosition(0);
485         objects2 = (Object[]) p.readValue(mcl);
486         assertNotNull(objects2);
487         for (int i = 0; i < objects2.length; i++) {
488             assertEquals(objects[i], objects2[i]);
489         }
490         p.recycle();
491 
492         // test int[]
493         int[] intArray = {111, 11, 1, 0, -1, -11, -111};
494         int[] intArray2 = new int[intArray.length];
495         p = Parcel.obtain();
496         p.writeValue(intArray);
497         p.setDataPosition(0);
498         intArray2= (int[]) p.readValue(mcl);
499         assertNotNull(intArray2);
500         for (int i = 0; i < intArray2.length; i++) {
501             assertEquals(intArray[i], intArray2[i]);
502         }
503         p.recycle();
504 
505         // test long[]
506         long[] longArray = {111L, 11L, 1L, 0L, -1L, -11L, -111L};
507         long[] longArray2 = new long[longArray.length];
508         p = Parcel.obtain();
509         p.writeValue(longArray);
510         p.setDataPosition(0);
511         longArray2= (long[]) p.readValue(mcl);
512         assertNotNull(longArray2);
513         for (int i = 0; i < longArray2.length; i++) {
514             assertEquals(longArray[i], longArray2[i]);
515         }
516         p.recycle();
517 
518         // test byte
519         p = Parcel.obtain();
520         p.writeValue(Byte.MAX_VALUE);
521         p.setDataPosition(0);
522         assertEquals(Byte.MAX_VALUE, p.readValue(mcl));
523         p.recycle();
524 
525         // test Serializable
526         p = Parcel.obtain();
527         p.writeValue((Serializable) "Serializable");
528         p.setDataPosition(0);
529         assertEquals("Serializable", p.readValue(mcl));
530         p.recycle();
531     }
532 
testReadByte()533     public void testReadByte() {
534         Parcel p;
535 
536         p = Parcel.obtain();
537         p.writeByte((byte) 0);
538         p.setDataPosition(0);
539         assertEquals((byte) 0, p.readByte());
540         p.recycle();
541 
542         p = Parcel.obtain();
543         p.writeByte((byte) 1);
544         p.setDataPosition(0);
545         assertEquals((byte) 1, p.readByte());
546         p.recycle();
547 
548         p = Parcel.obtain();
549         p.writeByte((byte) -1);
550         p.setDataPosition(0);
551         assertEquals((byte) -1, p.readByte());
552         p.recycle();
553 
554         p = Parcel.obtain();
555         p.writeByte(Byte.MAX_VALUE);
556         p.setDataPosition(0);
557         assertEquals(Byte.MAX_VALUE, p.readByte());
558         p.recycle();
559 
560         p = Parcel.obtain();
561         p.writeByte(Byte.MIN_VALUE);
562         p.setDataPosition(0);
563         assertEquals(Byte.MIN_VALUE, p.readByte());
564         p.recycle();
565 
566         p = Parcel.obtain();
567         p.writeByte(Byte.MAX_VALUE);
568         p.writeByte((byte) 11);
569         p.writeByte((byte) 1);
570         p.writeByte((byte) 0);
571         p.writeByte((byte) -1);
572         p.writeByte((byte) -11);
573         p.writeByte(Byte.MIN_VALUE);
574         p.setDataPosition(0);
575         assertEquals(Byte.MAX_VALUE, p.readByte());
576         assertEquals((byte) 11, p.readByte());
577         assertEquals((byte) 1, p.readByte());
578         assertEquals((byte) 0, p.readByte());
579         assertEquals((byte) -1, p.readByte());
580         assertEquals((byte) -11, p.readByte());
581         assertEquals(Byte.MIN_VALUE, p.readByte());
582         p.recycle();
583     }
584 
testReadByteArray()585     public void testReadByteArray() {
586         Parcel p;
587 
588         byte[] a = {(byte) 21};
589         byte[] b = new byte[a.length];
590 
591         byte[] c = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
592                     (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
593         byte[] d = new byte[c.length];
594 
595         // test write null
596         p = Parcel.obtain();
597         p.writeByteArray(null);
598         p.setDataPosition(0);
599         try {
600             p.readByteArray(null);
601             fail("Should throw a RuntimeException");
602         } catch (RuntimeException e) {
603             //expected
604         }
605 
606         p.setDataPosition(0);
607         try {
608             p.readByteArray(b);
609             fail("Should throw a RuntimeException");
610         } catch (RuntimeException e) {
611             //expected
612         }
613         p.recycle();
614 
615         // test write byte array with length: 1
616         p = Parcel.obtain();
617         p.writeByteArray(a);
618         p.setDataPosition(0);
619         try {
620             p.readByteArray(d);
621             fail("Should throw a RuntimeException");
622         } catch (RuntimeException e) {
623             //expected
624         }
625 
626         p.setDataPosition(0);
627         p.readByteArray(b);
628         for (int i = 0; i < a.length; i++) {
629             assertEquals(a[i], b[i]);
630         }
631         p.recycle();
632 
633         // test write byte array with length: 9
634         p = Parcel.obtain();
635         p.writeByteArray(c);
636         p.setDataPosition(0);
637         try {
638             p.readByteArray(b);
639             fail("Should throw a RuntimeException");
640         } catch (RuntimeException e) {
641             //expected
642         }
643 
644         p.setDataPosition(0);
645         p.readByteArray(d);
646         for (int i = 0; i < c.length; i++) {
647             assertEquals(c[i], d[i]);
648         }
649         p.recycle();
650 
651         // Test array bounds checks (null already checked above).
652         p = Parcel.obtain();
653         try {
654             p.writeByteArray(c, -1, 1); // Negative offset.
655             fail();
656         } catch (RuntimeException expected) {
657         }
658         try {
659             p.writeByteArray(c, 0, -1); // Negative count.
660             fail();
661         } catch (RuntimeException expected) {
662         }
663         try {
664             p.writeByteArray(c, c.length + 1, 1); // High offset.
665             fail();
666         } catch (RuntimeException expected) {
667         }
668         try {
669             p.writeByteArray(c, 0, c.length + 1); // High count.
670             fail();
671         } catch (RuntimeException expected) {
672         }
673         p.recycle();
674     }
675 
testWriteByteArray()676     public void testWriteByteArray() {
677         Parcel p;
678 
679         byte[] a = {(byte) 21};
680         byte[] b = new byte[a.length];
681 
682         byte[] c = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
683                     (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
684         byte[] d = new byte[c.length - 2];
685 
686         // test write null
687         p = Parcel.obtain();
688         p.writeByteArray(null, 0, 2);
689         p.setDataPosition(0);
690         try {
691             p.readByteArray(null);
692             fail("Should throw a RuntimeException");
693         } catch (RuntimeException e) {
694             //expected
695         }
696 
697         p.setDataPosition(0);
698         try {
699             p.readByteArray(b);
700             fail("Should throw a RuntimeException");
701         } catch (RuntimeException e) {
702             //expected
703         }
704         p.recycle();
705 
706         // test with wrong offset and length
707         p = Parcel.obtain();
708         try {
709             p.writeByteArray(a, 0, 2);
710             fail("Should throw a ArrayIndexOutOfBoundsException");
711         } catch (ArrayIndexOutOfBoundsException e) {
712             //expected
713         }
714         p.recycle();
715 
716         p = Parcel.obtain();
717         try {
718             p.writeByteArray(a, -1, 1);
719             fail("Should throw a ArrayIndexOutOfBoundsException");
720         } catch (ArrayIndexOutOfBoundsException e) {
721             //expected
722         }
723         p.recycle();
724 
725         p = Parcel.obtain();
726         try {
727             p.writeByteArray(a, 0, -1);
728             fail("Should throw a ArrayIndexOutOfBoundsException");
729         } catch (ArrayIndexOutOfBoundsException e) {
730             //expected
731         }
732         p.recycle();
733 
734         // test write byte array with length: 1
735         p = Parcel.obtain();
736         p.writeByteArray(a, 0 , 1);
737         p.setDataPosition(0);
738         try {
739             p.readByteArray(d);
740             fail("Should throw a RuntimeException");
741         } catch (RuntimeException e) {
742             //expected
743         }
744 
745         p.setDataPosition(0);
746         p.readByteArray(b);
747         for (int i = 0; i < a.length; i++) {
748             assertEquals(a[i], b[i]);
749         }
750         p.recycle();
751 
752         // test write byte array with offset: 1, length: 7
753         p = Parcel.obtain();
754         p.writeByteArray(c, 1, 7);
755         p.setDataPosition(0);
756         try {
757             p.readByteArray(b);
758             fail("Should throw a RuntimeException");
759         } catch (RuntimeException e) {
760             //expected
761         }
762 
763         d = new byte[c.length - 2];
764         p.setDataPosition(0);
765         p.readByteArray(d);
766         for (int i = 0; i < d.length; i++) {
767             Log.d("Trace", "i=" + i + " d[i]=" + d[i]);
768         }
769         for (int i = 0; i < 7; i++) {
770             assertEquals(c[i + 1], d[i]);
771         }
772         p.recycle();
773     }
774 
testCreateByteArray()775     public void testCreateByteArray() {
776         Parcel p;
777 
778         byte[] a = {(byte) 21};
779         byte[] b;
780 
781         byte[] c = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
782                     (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
783         byte[] d;
784 
785         byte[] e = {};
786         byte[] f;
787 
788         // test write null
789         p = Parcel.obtain();
790         p.writeByteArray(null);
791         p.setDataPosition(0);
792         b = p.createByteArray();
793         assertNull(b);
794         p.recycle();
795 
796         // test write byte array with length: 0
797         p = Parcel.obtain();
798         p.writeByteArray(e);
799         p.setDataPosition(0);
800         f = p.createByteArray();
801         assertNotNull(f);
802         assertEquals(0, f.length);
803         p.recycle();
804 
805         // test write byte array with length: 1
806         p = Parcel.obtain();
807         p.writeByteArray(a);
808         p.setDataPosition(0);
809         b = p.createByteArray();
810         assertNotNull(b);
811         for (int i = 0; i < a.length; i++) {
812             assertEquals(a[i], b[i]);
813         }
814         p.recycle();
815 
816         // test write byte array with length: 9
817         p = Parcel.obtain();
818         p.writeByteArray(c);
819         p.setDataPosition(0);
820         d = p.createByteArray();
821         assertNotNull(d);
822         for (int i = 0; i < c.length; i++) {
823             assertEquals(c[i], d[i]);
824         }
825         p.recycle();
826     }
827 
testReadCharArray()828     public void testReadCharArray() {
829         Parcel p;
830 
831         char[] a = {'a'};
832         char[] b = new char[a.length];
833 
834         char[] c = {'a', Character.MAX_VALUE, Character.MIN_VALUE, Character.MAX_SURROGATE, Character.MIN_SURROGATE,
835                     Character.MAX_HIGH_SURROGATE, Character.MAX_LOW_SURROGATE,
836                     Character.MIN_HIGH_SURROGATE, Character.MIN_LOW_SURROGATE};
837         char[] d = new char[c.length];
838 
839         // test write null
840         p = Parcel.obtain();
841         p.writeCharArray(null);
842         p.setDataPosition(0);
843         try {
844             p.readCharArray(null);
845             fail("Should throw a RuntimeException");
846         } catch (RuntimeException e) {
847             //expected
848         }
849 
850         p.setDataPosition(0);
851         try {
852             p.readCharArray(b);
853             fail("Should throw a RuntimeException");
854         } catch (RuntimeException e) {
855             //expected
856         }
857         p.recycle();
858 
859         // test write char array with length: 1
860         p = Parcel.obtain();
861         p.writeCharArray(a);
862         p.setDataPosition(0);
863         try {
864             p.readCharArray(d);
865             fail("Should throw a RuntimeException");
866         } catch (RuntimeException e) {
867             //expected
868         }
869 
870         p.setDataPosition(0);
871         p.readCharArray(b);
872         for (int i = 0; i < a.length; i++) {
873             assertEquals(a[i], b[i]);
874         }
875         p.recycle();
876 
877         // test write char array with length: 9
878         p = Parcel.obtain();
879         p.writeCharArray(c);
880         p.setDataPosition(0);
881         try {
882             p.readCharArray(b);
883             fail("Should throw a RuntimeException");
884         } catch (RuntimeException e) {
885             //expected
886         }
887 
888         p.setDataPosition(0);
889         p.readCharArray(d);
890         for (int i = 0; i < c.length; i++) {
891             assertEquals(c[i], d[i]);
892         }
893         p.recycle();
894     }
895 
testCreateCharArray()896     public void testCreateCharArray() {
897         Parcel p;
898 
899         char[] a = {'a'};
900         char[] b;
901 
902         char[] c = {'a', Character.MAX_VALUE, Character.MIN_VALUE, Character.MAX_SURROGATE, Character.MIN_SURROGATE,
903                     Character.MAX_HIGH_SURROGATE, Character.MAX_LOW_SURROGATE,
904                     Character.MIN_HIGH_SURROGATE, Character.MIN_LOW_SURROGATE};
905         char[] d;
906 
907         char[] e = {};
908         char[] f;
909 
910         // test write null
911         p = Parcel.obtain();
912         p.writeCharArray(null);
913         p.setDataPosition(0);
914         b = p.createCharArray();
915         assertNull(b);
916         p.recycle();
917 
918         // test write char array with length: 1
919         p = Parcel.obtain();
920         p.writeCharArray(e);
921         p.setDataPosition(0);
922         f = p.createCharArray();
923         assertNotNull(e);
924         assertEquals(0, f.length);
925         p.recycle();
926 
927         // test write char array with length: 1
928         p = Parcel.obtain();
929         p.writeCharArray(a);
930         p.setDataPosition(0);
931         b = p.createCharArray();
932         assertNotNull(b);
933         for (int i = 0; i < a.length; i++) {
934             assertEquals(a[i], b[i]);
935         }
936         p.recycle();
937 
938         // test write char array with length: 9
939         p = Parcel.obtain();
940         p.writeCharArray(c);
941         p.setDataPosition(0);
942         d = p.createCharArray();
943         assertNotNull(d);
944         for (int i = 0; i < c.length; i++) {
945             assertEquals(c[i], d[i]);
946         }
947         p.recycle();
948     }
949 
testReadInt()950     public void testReadInt() {
951         Parcel p;
952 
953         p = Parcel.obtain();
954         p.writeInt(0);
955         p.setDataPosition(0);
956         assertEquals(0, p.readInt());
957         p.recycle();
958 
959         p = Parcel.obtain();
960         p.writeInt(1);
961         p.setDataPosition(0);
962         assertEquals(1, p.readInt());
963         p.recycle();
964 
965         p = Parcel.obtain();
966         p.writeInt(-1);
967         p.setDataPosition(0);
968         assertEquals(-1, p.readInt());
969         p.recycle();
970 
971         p = Parcel.obtain();
972         p.writeInt(Integer.MAX_VALUE);
973         p.setDataPosition(0);
974         assertEquals(Integer.MAX_VALUE, p.readInt());
975         p.recycle();
976 
977         p = Parcel.obtain();
978         p.writeInt(Integer.MIN_VALUE);
979         p.setDataPosition(0);
980         assertEquals(Integer.MIN_VALUE, p.readInt());
981         p.recycle();
982 
983         p = Parcel.obtain();
984         p.writeInt(Integer.MAX_VALUE);
985         p.writeInt(11);
986         p.writeInt(1);
987         p.writeInt(0);
988         p.writeInt(-1);
989         p.writeInt(-11);
990         p.writeInt(Integer.MIN_VALUE);
991         p.setDataPosition(0);
992         assertEquals(Integer.MAX_VALUE, p.readInt());
993         assertEquals(11, p.readInt());
994         assertEquals(1, p.readInt());
995         assertEquals(0, p.readInt());
996         assertEquals(-1, p.readInt());
997         assertEquals(-11, p.readInt());
998         assertEquals(Integer.MIN_VALUE, p.readInt());
999         p.recycle();
1000     }
1001 
testReadIntArray()1002     public void testReadIntArray() {
1003         Parcel p;
1004 
1005         int[] a = {21};
1006         int[] b = new int[a.length];
1007 
1008         int[] c = {Integer.MAX_VALUE, 111, 11, 1, 0, -1, -11, -111, Integer.MIN_VALUE};
1009         int[] d = new int[c.length];
1010 
1011         // test write null
1012         p = Parcel.obtain();
1013         p.writeIntArray(null);
1014         p.setDataPosition(0);
1015         try {
1016             p.readIntArray(null);
1017             fail("Should throw a RuntimeException");
1018         } catch (RuntimeException e) {
1019             //expected
1020         }
1021 
1022         p.setDataPosition(0);
1023         try {
1024             p.readIntArray(b);
1025             fail("Should throw a RuntimeException");
1026         } catch (RuntimeException e) {
1027             //expected
1028         }
1029         p.recycle();
1030 
1031         // test write int array with length: 1
1032         p = Parcel.obtain();
1033         p.writeIntArray(a);
1034         p.setDataPosition(0);
1035         try {
1036             p.readIntArray(d);
1037             fail("Should throw a RuntimeException");
1038         } catch (RuntimeException e) {
1039             //expected
1040         }
1041 
1042         p.setDataPosition(0);
1043         p.readIntArray(b);
1044         for (int i = 0; i < a.length; i++) {
1045             assertEquals(a[i], b[i]);
1046         }
1047         p.recycle();
1048 
1049         // test write int array with length: 9
1050         p = Parcel.obtain();
1051         p.writeIntArray(c);
1052         p.setDataPosition(0);
1053         try {
1054             p.readIntArray(b);
1055             fail("Should throw a RuntimeException");
1056         } catch (RuntimeException e) {
1057             //expected
1058         }
1059 
1060         p.setDataPosition(0);
1061         p.readIntArray(d);
1062         for (int i = 0; i < c.length; i++) {
1063             assertEquals(c[i], d[i]);
1064         }
1065         p.recycle();
1066     }
1067 
testCreateIntArray()1068     public void testCreateIntArray() {
1069         Parcel p;
1070 
1071         int[] a = {21};
1072         int[] b;
1073 
1074         int[] c = {Integer.MAX_VALUE, 111, 11, 1, 0, -1, -11, -111, Integer.MIN_VALUE};
1075         int[] d;
1076 
1077         int[] e = {};
1078         int[] f;
1079 
1080         // test write null
1081         p = Parcel.obtain();
1082         p.writeIntArray(null);
1083         p.setDataPosition(0);
1084         b = p.createIntArray();
1085         assertNull(b);
1086         p.recycle();
1087 
1088         // test write int array with length: 0
1089         p = Parcel.obtain();
1090         p.writeIntArray(e);
1091         p.setDataPosition(0);
1092         f = p.createIntArray();
1093         assertNotNull(e);
1094         assertEquals(0, f.length);
1095         p.recycle();
1096 
1097         // test write int array with length: 1
1098         p = Parcel.obtain();
1099         p.writeIntArray(a);
1100         p.setDataPosition(0);
1101         b = p.createIntArray();
1102         assertNotNull(b);
1103         for (int i = 0; i < a.length; i++) {
1104             assertEquals(a[i], b[i]);
1105         }
1106         p.recycle();
1107 
1108         // test write int array with length: 9
1109         p = Parcel.obtain();
1110         p.writeIntArray(c);
1111         p.setDataPosition(0);
1112         d = p.createIntArray();
1113         assertNotNull(d);
1114         for (int i = 0; i < c.length; i++) {
1115             assertEquals(c[i], d[i]);
1116         }
1117         p.recycle();
1118     }
1119 
testReadLong()1120     public void testReadLong() {
1121         Parcel p;
1122 
1123         p = Parcel.obtain();
1124         p.writeLong(0L);
1125         p.setDataPosition(0);
1126         assertEquals(0, p.readLong());
1127         p.recycle();
1128 
1129         p = Parcel.obtain();
1130         p.writeLong(1L);
1131         p.setDataPosition(0);
1132         assertEquals(1, p.readLong());
1133         p.recycle();
1134 
1135         p = Parcel.obtain();
1136         p.writeLong(-1L);
1137         p.setDataPosition(0);
1138         assertEquals(-1L, p.readLong());
1139         p.recycle();
1140 
1141         p = Parcel.obtain();
1142         p.writeLong(Long.MAX_VALUE);
1143         p.writeLong(11L);
1144         p.writeLong(1L);
1145         p.writeLong(0L);
1146         p.writeLong(-1L);
1147         p.writeLong(-11L);
1148         p.writeLong(Long.MIN_VALUE);
1149         p.setDataPosition(0);
1150         assertEquals(Long.MAX_VALUE, p.readLong());
1151         assertEquals(11L, p.readLong());
1152         assertEquals(1L, p.readLong());
1153         assertEquals(0L, p.readLong());
1154         assertEquals(-1L, p.readLong());
1155         assertEquals(-11L, p.readLong());
1156         assertEquals(Long.MIN_VALUE, p.readLong());
1157         p.recycle();
1158     }
1159 
testReadLongArray()1160     public void testReadLongArray() {
1161         Parcel p;
1162 
1163         long[] a = {21L};
1164         long[] b = new long[a.length];
1165 
1166         long[] c = {Long.MAX_VALUE, 111L, 11L, 1L, 0L, -1L, -11L, -111L, Long.MIN_VALUE};
1167         long[] d = new long[c.length];
1168 
1169         // test write null
1170         p = Parcel.obtain();
1171         p.writeLongArray(null);
1172         p.setDataPosition(0);
1173         try {
1174             p.readLongArray(null);
1175             fail("Should throw a RuntimeException");
1176         } catch (RuntimeException e) {
1177             //expected
1178         }
1179 
1180         p.setDataPosition(0);
1181         try {
1182             p.readLongArray(b);
1183             fail("Should throw a RuntimeException");
1184         } catch (RuntimeException e) {
1185             //expected
1186         }
1187         p.recycle();
1188 
1189         // test write long array with length: 1
1190         p = Parcel.obtain();
1191         p.writeLongArray(a);
1192         p.setDataPosition(0);
1193         try {
1194             p.readLongArray(d);
1195             fail("Should throw a RuntimeException");
1196         } catch (RuntimeException e) {
1197             //expected
1198         }
1199 
1200         p.setDataPosition(0);
1201         p.readLongArray(b);
1202         for (int i = 0; i < a.length; i++) {
1203             assertEquals(a[i], b[i]);
1204         }
1205         p.recycle();
1206 
1207         // test write long array with length: 9
1208         p = Parcel.obtain();
1209         p.writeLongArray(c);
1210         p.setDataPosition(0);
1211         try {
1212             p.readLongArray(b);
1213             fail("Should throw a RuntimeException");
1214         } catch (RuntimeException e) {
1215             //expected
1216         }
1217 
1218         p.setDataPosition(0);
1219         p.readLongArray(d);
1220         for (int i = 0; i < c.length; i++) {
1221             assertEquals(c[i], d[i]);
1222         }
1223         p.recycle();
1224     }
1225 
testCreateLongArray()1226     public void testCreateLongArray() {
1227         Parcel p;
1228 
1229         long[] a = {21L};
1230         long[] b;
1231 
1232         long[] c = {Long.MAX_VALUE, 111L, 11L, 1L, 0L, -1L, -11L, -111L, Long.MIN_VALUE};
1233         long[] d;
1234 
1235         long[] e = {};
1236         long[] f;
1237 
1238         // test write null
1239         p = Parcel.obtain();
1240         p.writeLongArray(null);
1241         p.setDataPosition(0);
1242         b = p.createLongArray();
1243         assertNull(b);
1244         p.recycle();
1245 
1246         // test write long array with length: 0
1247         p = Parcel.obtain();
1248         p.writeLongArray(e);
1249         p.setDataPosition(0);
1250         f = p.createLongArray();
1251         assertNotNull(e);
1252         assertEquals(0, f.length);
1253         p.recycle();
1254 
1255         // test write long array with length: 1
1256         p = Parcel.obtain();
1257         p.writeLongArray(a);
1258         p.setDataPosition(0);
1259         b = p.createLongArray();
1260         assertNotNull(b);
1261         for (int i = 0; i < a.length; i++) {
1262             assertEquals(a[i], b[i]);
1263         }
1264         p.recycle();
1265 
1266         // test write long array with length: 9
1267         p = Parcel.obtain();
1268         p.writeLongArray(c);
1269         p.setDataPosition(0);
1270         d = p.createLongArray();
1271         assertNotNull(d);
1272         for (int i = 0; i < c.length; i++) {
1273             assertEquals(c[i], d[i]);
1274         }
1275         p.recycle();
1276     }
1277 
testReadFloat()1278     public void testReadFloat() {
1279         Parcel p;
1280 
1281         p = Parcel.obtain();
1282         p.writeFloat(.0f);
1283         p.setDataPosition(0);
1284         assertEquals(.0f, p.readFloat());
1285         p.recycle();
1286 
1287         p = Parcel.obtain();
1288         p.writeFloat(0.1f);
1289         p.setDataPosition(0);
1290         assertEquals(0.1f, p.readFloat());
1291         p.recycle();
1292 
1293         p = Parcel.obtain();
1294         p.writeFloat(-1.1f);
1295         p.setDataPosition(0);
1296         assertEquals(-1.1f, p.readFloat());
1297         p.recycle();
1298 
1299         p = Parcel.obtain();
1300         p.writeFloat(Float.MAX_VALUE);
1301         p.setDataPosition(0);
1302         assertEquals(Float.MAX_VALUE, p.readFloat());
1303         p.recycle();
1304 
1305         p = Parcel.obtain();
1306         p.writeFloat(Float.MIN_VALUE);
1307         p.setDataPosition(0);
1308         assertEquals(Float.MIN_VALUE, p.readFloat());
1309         p.recycle();
1310 
1311         p = Parcel.obtain();
1312         p.writeFloat(Float.MAX_VALUE);
1313         p.writeFloat(1.1f);
1314         p.writeFloat(0.1f);
1315         p.writeFloat(.0f);
1316         p.writeFloat(-0.1f);
1317         p.writeFloat(-1.1f);
1318         p.writeFloat(Float.MIN_VALUE);
1319         p.setDataPosition(0);
1320         assertEquals(Float.MAX_VALUE, p.readFloat());
1321         assertEquals(1.1f, p.readFloat());
1322         assertEquals(0.1f, p.readFloat());
1323         assertEquals(.0f, p.readFloat());
1324         assertEquals(-0.1f, p.readFloat());
1325         assertEquals(-1.1f, p.readFloat());
1326         assertEquals(Float.MIN_VALUE, p.readFloat());
1327         p.recycle();
1328     }
1329 
testReadFloatArray()1330     public void testReadFloatArray() {
1331         Parcel p;
1332 
1333         float[] a = {2.1f};
1334         float[] b = new float[a.length];
1335 
1336         float[] c = {Float.MAX_VALUE, 11.1f, 1.1f, 0.1f, .0f, -0.1f, -1.1f, -11.1f, Float.MIN_VALUE};
1337         float[] d = new float[c.length];
1338 
1339         // test write null
1340         p = Parcel.obtain();
1341         p.writeFloatArray(null);
1342         p.setDataPosition(0);
1343         try {
1344             p.readFloatArray(null);
1345             fail("Should throw a RuntimeException");
1346         } catch (RuntimeException e) {
1347             //expected
1348         }
1349 
1350         p.setDataPosition(0);
1351         try {
1352             p.readFloatArray(b);
1353             fail("Should throw a RuntimeException");
1354         } catch (RuntimeException e) {
1355             //expected
1356         }
1357         p.recycle();
1358 
1359         // test write float array with length: 1
1360         p = Parcel.obtain();
1361         p.writeFloatArray(a);
1362         p.setDataPosition(0);
1363         try {
1364             p.readFloatArray(d);
1365             fail("Should throw a RuntimeException");
1366         } catch (RuntimeException e) {
1367             //expected
1368         }
1369 
1370         p.setDataPosition(0);
1371         p.readFloatArray(b);
1372         for (int i = 0; i < a.length; i++) {
1373             assertEquals(a[i], b[i]);
1374         }
1375         p.recycle();
1376 
1377         // test write float array with length: 9
1378         p = Parcel.obtain();
1379         p.writeFloatArray(c);
1380         p.setDataPosition(0);
1381         try {
1382             p.readFloatArray(b);
1383             fail("Should throw a RuntimeException");
1384         } catch (RuntimeException e) {
1385             //expected
1386         }
1387 
1388         p.setDataPosition(0);
1389         p.readFloatArray(d);
1390         for (int i = 0; i < c.length; i++) {
1391             assertEquals(c[i], d[i]);
1392         }
1393         p.recycle();
1394     }
1395 
testCreateFloatArray()1396     public void testCreateFloatArray() {
1397         Parcel p;
1398 
1399         float[] a = {2.1f};
1400         float[] b;
1401 
1402         float[] c = {Float.MAX_VALUE, 11.1f, 1.1f, 0.1f, .0f, -0.1f, -1.1f, -11.1f, Float.MIN_VALUE};
1403         float[] d;
1404 
1405         float[] e = {};
1406         float[] f;
1407 
1408         // test write null
1409         p = Parcel.obtain();
1410         p.writeFloatArray(null);
1411         p.setDataPosition(0);
1412         b = p.createFloatArray();
1413         assertNull(b);
1414         p.recycle();
1415 
1416         // test write float array with length: 0
1417         p = Parcel.obtain();
1418         p.writeFloatArray(e);
1419         p.setDataPosition(0);
1420         f = p.createFloatArray();
1421         assertNotNull(f);
1422         assertEquals(0, f.length);
1423         p.recycle();
1424 
1425         // test write float array with length: 1
1426         p = Parcel.obtain();
1427         p.writeFloatArray(a);
1428         p.setDataPosition(0);
1429         b = p.createFloatArray();
1430         assertNotNull(b);
1431         for (int i = 0; i < a.length; i++) {
1432             assertEquals(a[i], b[i]);
1433         }
1434         p.recycle();
1435 
1436         // test write float array with length: 9
1437         p = Parcel.obtain();
1438         p.writeFloatArray(c);
1439         p.setDataPosition(0);
1440         d = p.createFloatArray();
1441         assertNotNull(d);
1442         for (int i = 0; i < c.length; i++) {
1443             assertEquals(c[i], d[i]);
1444         }
1445         p.recycle();
1446     }
1447 
testReadDouble()1448     public void testReadDouble() {
1449         Parcel p;
1450 
1451         p = Parcel.obtain();
1452         p.writeDouble(.0d);
1453         p.setDataPosition(0);
1454         assertEquals(.0d, p.readDouble());
1455         p.recycle();
1456 
1457         p = Parcel.obtain();
1458         p.writeDouble(0.1d);
1459         p.setDataPosition(0);
1460         assertEquals(0.1d, p.readDouble());
1461         p.recycle();
1462 
1463         p = Parcel.obtain();
1464         p.writeDouble(-1.1d);
1465         p.setDataPosition(0);
1466         assertEquals(-1.1d, p.readDouble());
1467         p.recycle();
1468 
1469         p = Parcel.obtain();
1470         p.writeDouble(Double.MAX_VALUE);
1471         p.setDataPosition(0);
1472         assertEquals(Double.MAX_VALUE, p.readDouble());
1473         p.recycle();
1474 
1475         p = Parcel.obtain();
1476         p.writeDouble(Double.MIN_VALUE);
1477         p.setDataPosition(0);
1478         assertEquals(Double.MIN_VALUE, p.readDouble());
1479         p.recycle();
1480 
1481         p = Parcel.obtain();
1482         p.writeDouble(Double.MAX_VALUE);
1483         p.writeDouble(1.1d);
1484         p.writeDouble(0.1d);
1485         p.writeDouble(.0d);
1486         p.writeDouble(-0.1d);
1487         p.writeDouble(-1.1d);
1488         p.writeDouble(Double.MIN_VALUE);
1489         p.setDataPosition(0);
1490         assertEquals(Double.MAX_VALUE, p.readDouble());
1491         assertEquals(1.1d, p.readDouble());
1492         assertEquals(0.1d, p.readDouble());
1493         assertEquals(.0d, p.readDouble());
1494         assertEquals(-0.1d, p.readDouble());
1495         assertEquals(-1.1d, p.readDouble());
1496         assertEquals(Double.MIN_VALUE, p.readDouble());
1497         p.recycle();
1498     }
1499 
testReadDoubleArray()1500     public void testReadDoubleArray() {
1501         Parcel p;
1502 
1503         double[] a = {2.1d};
1504         double[] b = new double[a.length];
1505 
1506         double[] c = {Double.MAX_VALUE, 11.1d, 1.1d, 0.1d, .0d, -0.1d, -1.1d, -11.1d, Double.MIN_VALUE};
1507         double[] d = new double[c.length];
1508 
1509         // test write null
1510         p = Parcel.obtain();
1511         p.writeDoubleArray(null);
1512         p.setDataPosition(0);
1513         try {
1514             p.readDoubleArray(null);
1515             fail("Should throw a RuntimeException");
1516         } catch (RuntimeException e) {
1517             //expected
1518         }
1519 
1520         p.setDataPosition(0);
1521         try {
1522             p.readDoubleArray(b);
1523             fail("Should throw a RuntimeException");
1524         } catch (RuntimeException e) {
1525             //expected
1526         }
1527         p.recycle();
1528 
1529         // test write double array with length: 1
1530         p = Parcel.obtain();
1531         p.writeDoubleArray(a);
1532         p.setDataPosition(0);
1533         try {
1534             p.readDoubleArray(d);
1535             fail("Should throw a RuntimeException");
1536         } catch (RuntimeException e) {
1537             //expected
1538         }
1539 
1540         p.setDataPosition(0);
1541         p.readDoubleArray(b);
1542         for (int i = 0; i < a.length; i++) {
1543             assertEquals(a[i], b[i]);
1544         }
1545         p.recycle();
1546 
1547         // test write double array with length: 9
1548         p = Parcel.obtain();
1549         p.writeDoubleArray(c);
1550         p.setDataPosition(0);
1551         try {
1552             p.readDoubleArray(b);
1553             fail("Should throw a RuntimeException");
1554         } catch (RuntimeException e) {
1555             //expected
1556         }
1557 
1558         p.setDataPosition(0);
1559         p.readDoubleArray(d);
1560         for (int i = 0; i < c.length; i++) {
1561             assertEquals(c[i], d[i]);
1562         }
1563         p.recycle();
1564     }
1565 
testCreateDoubleArray()1566     public void testCreateDoubleArray() {
1567         Parcel p;
1568 
1569         double[] a = {2.1d};
1570         double[] b;
1571 
1572         double[] c = {
1573                 Double.MAX_VALUE, 11.1d, 1.1d, 0.1d, .0d, -0.1d, -1.1d, -11.1d, Double.MIN_VALUE
1574         };
1575         double[] d;
1576 
1577         double[] e = {};
1578         double[] f;
1579 
1580         // test write null
1581         p = Parcel.obtain();
1582         p.writeDoubleArray(null);
1583         p.setDataPosition(0);
1584         b = p.createDoubleArray();
1585         assertNull(b);
1586         p.recycle();
1587 
1588         // test write double array with length: 0
1589         p = Parcel.obtain();
1590         p.writeDoubleArray(e);
1591         p.setDataPosition(0);
1592         f = p.createDoubleArray();
1593         assertNotNull(f);
1594         assertEquals(0, f.length);
1595         p.recycle();
1596 
1597         // test write double array with length: 1
1598         p = Parcel.obtain();
1599         p.writeDoubleArray(a);
1600         p.setDataPosition(0);
1601         b = p.createDoubleArray();
1602         assertNotNull(b);
1603         for (int i = 0; i < a.length; i++) {
1604             assertEquals(a[i], b[i]);
1605         }
1606         p.recycle();
1607 
1608         // test write double array with length: 9
1609         p = Parcel.obtain();
1610         p.writeDoubleArray(c);
1611         p.setDataPosition(0);
1612         d = p.createDoubleArray();
1613         assertNotNull(d);
1614         for (int i = 0; i < c.length; i++) {
1615             assertEquals(c[i], d[i]);
1616         }
1617         p.recycle();
1618     }
1619 
testReadBooleanArray()1620     public void testReadBooleanArray() {
1621         Parcel p;
1622 
1623         boolean[] a = {true};
1624         boolean[] b = new boolean[a.length];
1625 
1626         boolean[] c = {true, false, true, false};
1627         boolean[] d = new boolean[c.length];
1628 
1629         // test write null
1630         p = Parcel.obtain();
1631         p.writeBooleanArray(null);
1632         p.setDataPosition(0);
1633         try {
1634             p.readIntArray(null);
1635             fail("Should throw a RuntimeException");
1636         } catch (RuntimeException e) {
1637             //expected
1638         }
1639 
1640         p.setDataPosition(0);
1641         try {
1642             p.readBooleanArray(b);
1643             fail("Should throw a RuntimeException");
1644         } catch (RuntimeException e) {
1645             //expected
1646         }
1647         p.recycle();
1648 
1649         // test write boolean array with length: 1
1650         p = Parcel.obtain();
1651         p.writeBooleanArray(a);
1652         p.setDataPosition(0);
1653         try {
1654             p.readBooleanArray(d);
1655             fail("Should throw a RuntimeException");
1656         } catch (RuntimeException e) {
1657             //expected
1658         }
1659 
1660         p.setDataPosition(0);
1661         p.readBooleanArray(b);
1662         for (int i = 0; i < a.length; i++) {
1663             assertEquals(a[i], b[i]);
1664         }
1665         p.recycle();
1666 
1667         // test write boolean array with length: 4
1668         p = Parcel.obtain();
1669         p.writeBooleanArray(c);
1670         p.setDataPosition(0);
1671         try {
1672             p.readBooleanArray(b);
1673             fail("Should throw a RuntimeException");
1674         } catch (RuntimeException e) {
1675             //expected
1676         }
1677 
1678         p.setDataPosition(0);
1679         p.readBooleanArray(d);
1680         for (int i = 0; i < c.length; i++) {
1681             assertEquals(c[i], d[i]);
1682         }
1683         p.recycle();
1684     }
1685 
testCreateBooleanArray()1686     public void testCreateBooleanArray() {
1687         Parcel p;
1688 
1689         boolean[] a = {true};
1690         boolean[] b;
1691 
1692         boolean[] c = {true, false, true, false};
1693         boolean[] d;
1694 
1695         boolean[] e = {};
1696         boolean[] f;
1697 
1698         // test write null
1699         p = Parcel.obtain();
1700         p.writeBooleanArray(null);
1701         p.setDataPosition(0);
1702         b = p.createBooleanArray();
1703         assertNull(b);
1704         p.recycle();
1705 
1706         // test write boolean array with length: 0
1707         p = Parcel.obtain();
1708         p.writeBooleanArray(e);
1709         p.setDataPosition(0);
1710         f = p.createBooleanArray();
1711         assertNotNull(f);
1712         assertEquals(0, f.length);
1713         p.recycle();
1714 
1715         // test write boolean array with length: 1
1716         p = Parcel.obtain();
1717         p.writeBooleanArray(a);
1718 
1719         p.setDataPosition(0);
1720         b = p.createBooleanArray();
1721         assertNotNull(b);
1722         for (int i = 0; i < a.length; i++) {
1723             assertEquals(a[i], b[i]);
1724         }
1725         p.recycle();
1726 
1727         // test write boolean array with length: 4
1728         p = Parcel.obtain();
1729         p.writeBooleanArray(c);
1730         p.setDataPosition(0);
1731         d = p.createBooleanArray();
1732         assertNotNull(d);
1733         for (int i = 0; i < c.length; i++) {
1734             assertEquals(c[i], d[i]);
1735         }
1736         p.recycle();
1737     }
1738 
testReadString()1739     public void testReadString() {
1740         Parcel p;
1741         final String string = "Hello, Android!";
1742 
1743         // test write null
1744         p = Parcel.obtain();
1745         p.writeString(null);
1746         p.setDataPosition(0);
1747         assertNull(p.readString());
1748         p.recycle();
1749 
1750         p = Parcel.obtain();
1751         p.writeString("");
1752         p.setDataPosition(0);
1753         assertEquals("", p.readString());
1754         p.recycle();
1755 
1756         p = Parcel.obtain();
1757         p.writeString("a");
1758         p.setDataPosition(0);
1759         assertEquals("a", p.readString());
1760         p.recycle();
1761 
1762         p = Parcel.obtain();
1763         p.writeString(string);
1764         p.setDataPosition(0);
1765         assertEquals(string, p.readString());
1766         p.recycle();
1767 
1768         p = Parcel.obtain();
1769         p.writeString(string);
1770         p.writeString("a");
1771         p.writeString("");
1772         p.setDataPosition(0);
1773         assertEquals(string, p.readString());
1774         assertEquals("a", p.readString());
1775         assertEquals("", p.readString());
1776         p.recycle();
1777     }
1778 
testReadStringArray()1779     public void testReadStringArray() {
1780         Parcel p;
1781 
1782         String[] a = {"21"};
1783         String[] b = new String[a.length];
1784 
1785         String[] c = {"",
1786                 "a",
1787                 "Hello, Android!",
1788                 "A long string that is used to test the api readStringArray(),"};
1789         String[] d = new String[c.length];
1790 
1791         // test write null
1792         p = Parcel.obtain();
1793         p.writeStringArray(null);
1794         p.setDataPosition(0);
1795         try {
1796             p.readStringArray(null);
1797             fail("Should throw a RuntimeException");
1798         } catch (RuntimeException e) {
1799             //expected
1800         }
1801 
1802         p.setDataPosition(0);
1803         try {
1804             p.readStringArray(b);
1805             fail("Should throw a RuntimeException");
1806         } catch (RuntimeException e) {
1807             //expected
1808         }
1809         p.recycle();
1810 
1811         // test write String array with length: 1
1812         p = Parcel.obtain();
1813         p.writeStringArray(a);
1814         p.setDataPosition(0);
1815         try {
1816             p.readStringArray(d);
1817             fail("Should throw a RuntimeException");
1818         } catch (RuntimeException e) {
1819             //expected
1820         }
1821 
1822         p.setDataPosition(0);
1823         p.readStringArray(b);
1824         for (int i = 0; i < a.length; i++) {
1825             assertEquals(a[i], b[i]);
1826         }
1827         p.recycle();
1828 
1829         // test write String array with length: 9
1830         p = Parcel.obtain();
1831         p.writeStringArray(c);
1832         p.setDataPosition(0);
1833         try {
1834             p.readStringArray(b);
1835             fail("Should throw a RuntimeException");
1836         } catch (RuntimeException e) {
1837             //expected
1838         }
1839 
1840         p.setDataPosition(0);
1841         p.readStringArray(d);
1842         for (int i = 0; i < c.length; i++) {
1843             assertEquals(c[i], d[i]);
1844         }
1845         p.recycle();
1846     }
1847 
testCreateStringArray()1848     public void testCreateStringArray() {
1849         Parcel p;
1850 
1851         String[] a = {"21"};
1852         String[] b;
1853 
1854         String[] c = {"",
1855                 "a",
1856                 "Hello, Android!",
1857                 "A long string that is used to test the api readStringArray(),"};
1858         String[] d;
1859 
1860         String[] e = {};
1861         String[] f;
1862 
1863         // test write null
1864         p = Parcel.obtain();
1865         p.writeStringArray(null);
1866         p.setDataPosition(0);
1867         b = p.createStringArray();
1868         assertNull(b);
1869         p.recycle();
1870 
1871         // test write String array with length: 0
1872         p = Parcel.obtain();
1873         p.writeStringArray(e);
1874         p.setDataPosition(0);
1875         f = p.createStringArray();
1876         assertNotNull(e);
1877         assertEquals(0, f.length);
1878         p.recycle();
1879 
1880         // test write String array with length: 1
1881         p = Parcel.obtain();
1882         p.writeStringArray(a);
1883         p.setDataPosition(0);
1884         b = p.createStringArray();
1885         assertNotNull(b);
1886         for (int i = 0; i < a.length; i++) {
1887             assertEquals(a[i], b[i]);
1888         }
1889         p.recycle();
1890 
1891         // test write String array with length: 9
1892         p = Parcel.obtain();
1893         p.writeStringArray(c);
1894         p.setDataPosition(0);
1895         d = p.createStringArray();
1896         assertNotNull(d);
1897         for (int i = 0; i < c.length; i++) {
1898             assertEquals(c[i], d[i]);
1899         }
1900         p.recycle();
1901     }
1902 
testReadStringList()1903     public void testReadStringList() {
1904         Parcel p;
1905 
1906         ArrayList<String> a = new ArrayList<String>();
1907         a.add("21");
1908         ArrayList<String> b = new ArrayList<String>();
1909 
1910         ArrayList<String> c = new ArrayList<String>();
1911         c.add("");
1912         c.add("a");
1913         c.add("Hello, Android!");
1914         c.add("A long string that is used to test the api readStringList(),");
1915         ArrayList<String> d = new ArrayList<String>();
1916 
1917         // test write null
1918         p = Parcel.obtain();
1919         p.writeStringList(null);
1920         p.setDataPosition(0);
1921         try {
1922             p.readStringList(null);
1923             fail("Should throw a RuntimeException");
1924         } catch (RuntimeException e) {
1925             //expected
1926         }
1927 
1928         p.setDataPosition(0);
1929         p.readStringList(b);
1930         assertTrue(0 == b.size());
1931         p.recycle();
1932 
1933         // test write String array with length: 1
1934         p = Parcel.obtain();
1935         p.writeStringList(a);
1936         p.setDataPosition(0);
1937         assertTrue(c.size() > a.size());
1938         p.readStringList(c);
1939         assertTrue(c.size() == a.size());
1940         assertEquals(a, c);
1941 
1942         p.setDataPosition(0);
1943         assertTrue(0 == b.size() && 0 != a.size());
1944         p.readStringList(b);
1945         assertEquals(a, b);
1946         p.recycle();
1947 
1948         c = new ArrayList<String>();
1949         c.add("");
1950         c.add("a");
1951         c.add("Hello, Android!");
1952         c.add("A long string that is used to test the api readStringList(),");
1953         // test write String array with length: 4
1954         p = Parcel.obtain();
1955         p.writeStringList(c);
1956         p.setDataPosition(0);
1957 
1958         assertTrue(b.size() < c.size());
1959         p.readStringList(b);
1960         assertTrue(b.size() == c.size());
1961         assertEquals(c, b);
1962 
1963         p.setDataPosition(0);
1964         assertTrue(d.size() < c.size());
1965         p.readStringList(d);
1966         assertEquals(c, d);
1967         p.recycle();
1968     }
1969 
1970     public void testCreateStringArrayList() {
1971         Parcel p;
1972 
1973         ArrayList<String> a = new ArrayList<String>();
1974         a.add("21");
1975         ArrayList<String> b;
1976 
1977         ArrayList<String> c = new ArrayList<String>();
1978         c.add("");
1979         c.add("a");
1980         c.add("Hello, Android!");
1981         c.add("A long string that is used to test the api readStringList(),");
1982         ArrayList<String> d;
1983 
1984         ArrayList<String> e = new ArrayList<String>();
1985         ArrayList<String> f = null;
1986 
1987         // test write null
1988         p = Parcel.obtain();
1989         p.writeStringList(null);
1990         p.setDataPosition(0);
1991         b = p.createStringArrayList();
1992         assertNull(b);
1993         p.recycle();
1994 
1995         // test write String array with length: 0
1996         p = Parcel.obtain();
1997         p.writeStringList(e);
1998         p.setDataPosition(0);
1999         assertNull(f);
2000         f = p.createStringArrayList();
2001         assertNotNull(f);
2002         p.recycle();
2003 
2004         // test write String array with length: 1
2005         p = Parcel.obtain();
2006         p.writeStringList(a);
2007         p.setDataPosition(0);
2008         b = p.createStringArrayList();
2009         assertEquals(a, b);
2010         p.recycle();
2011 
2012         // test write String array with length: 4
2013         p = Parcel.obtain();
2014         p.writeStringList(c);
2015         p.setDataPosition(0);
2016         d = p.createStringArrayList();
2017         assertEquals(c, d);
2018         p.recycle();
2019     }
2020 
2021     public void testReadSerializable() {
2022         Parcel p;
2023 
2024         // test write null
2025         p = Parcel.obtain();
2026         p.writeSerializable(null);
2027         p.setDataPosition(0);
2028         assertNull(p.readSerializable());
2029         p.recycle();
2030 
2031         p = Parcel.obtain();
2032         p.writeSerializable("Hello, Android!");
2033         p.setDataPosition(0);
2034         assertEquals("Hello, Android!", p.readSerializable());
2035         p.recycle();
2036     }
2037 
2038     public void testReadParcelable() {
2039         Parcel p;
2040         MockClassLoader mcl = new MockClassLoader();
2041         final String signatureString  = "1234567890abcdef";
2042         Signature s = new Signature(signatureString);
2043 
2044         // test write null
2045         p = Parcel.obtain();
2046         p.writeParcelable(null, 0);
2047         p.setDataPosition(0);
2048         assertNull(p.readParcelable(mcl));
2049         p.recycle();
2050 
2051         p = Parcel.obtain();
2052         p.writeParcelable(s, 0);
2053         p.setDataPosition(0);
2054         assertEquals(s, p.readParcelable(mcl));
2055         p.recycle();
2056     }
2057 
2058     public void testReadParcelableArray() {
2059         Parcel p;
2060         MockClassLoader mcl = new MockClassLoader();
2061         Signature[] s = {new Signature("1234"),
2062                 new Signature("ABCD"),
2063                 new Signature("abcd")};
2064 
2065         Signature[] s2 = {new Signature("1234"),
2066                 null,
2067                 new Signature("abcd")};
2068         Parcelable[] s3;
2069 
2070         // test write null
2071         p = Parcel.obtain();
2072         p.writeParcelableArray(null, 0);
2073         p.setDataPosition(0);
2074         assertNull(p.readParcelableArray(mcl));
2075         p.recycle();
2076 
2077         p = Parcel.obtain();
2078         p.writeParcelableArray(s, 0);
2079         p.setDataPosition(0);
2080         s3 = p.readParcelableArray(mcl);
2081         for (int i = 0; i < s.length; i++) {
2082             assertEquals(s[i], s3[i]);
2083         }
2084         p.recycle();
2085 
2086         p = Parcel.obtain();
2087         p.writeParcelableArray(s2, 0);
2088         p.setDataPosition(0);
2089         s3 = p.readParcelableArray(mcl);
2090         for (int i = 0; i < s2.length; i++) {
2091             assertEquals(s2[i], s3[i]);
2092         }
2093         p.recycle();
2094     }
2095 
2096     public void testReadTypedArray() {
2097         Parcel p;
2098         Signature[] s = {new Signature("1234"),
2099                 new Signature("ABCD"),
2100                 new Signature("abcd")};
2101 
2102         Signature[] s2 = {new Signature("1234"),
2103                 null,
2104                 new Signature("abcd")};
2105         Signature[] s3 = new Signature[3];
2106         Signature[] s4 = new Signature[4];
2107 
2108         // test write null
2109         p = Parcel.obtain();
2110         p.writeTypedArray(null, 0);
2111         p.setDataPosition(0);
2112         try {
2113             p.readTypedArray(s3, Signature.CREATOR);
2114             fail("should throw a RuntimeException");
2115         } catch (RuntimeException e) {
2116             //expected
2117         }
2118 
2119         p.setDataPosition(0);
2120         try {
2121             p.readTypedArray(null, Signature.CREATOR);
2122             fail("should throw a RuntimeException");
2123         } catch (RuntimeException e) {
2124             //expected
2125         }
2126         p.recycle();
2127 
2128         // test write not null
2129         p = Parcel.obtain();
2130         p.writeTypedArray(s, 0);
2131         p.setDataPosition(0);
2132         p.readTypedArray(s3, Signature.CREATOR);
2133         for (int i = 0; i < s.length; i++) {
2134             assertEquals(s[i], s3[i]);
2135         }
2136 
2137         p.setDataPosition(0);
2138         try {
2139             p.readTypedArray(null, Signature.CREATOR);
2140             fail("should throw a RuntimeException");
2141         } catch (RuntimeException e) {
2142             //expected
2143         }
2144 
2145         p.setDataPosition(0);
2146         try {
2147             p.readTypedArray(s4, Signature.CREATOR);
2148             fail("should throw a RuntimeException");
2149         } catch (RuntimeException e) {
2150             //expected
2151         }
2152         p.recycle();
2153 
2154         s3 = new Signature[s2.length];
2155         p = Parcel.obtain();
2156         p.writeTypedArray(s2, 0);
2157         p.setDataPosition(0);
2158         p.readTypedArray(s3, Signature.CREATOR);
2159         for (int i = 0; i < s.length; i++) {
2160             assertEquals(s2[i], s3[i]);
2161         }
2162         p.recycle();
2163     }
2164 
2165     public void testReadTypedArray2() {
2166         Parcel p;
2167         Signature[] s = {
2168                 new Signature("1234"), new Signature("ABCD"), new Signature("abcd")
2169         };
2170 
2171         Signature[] s2 = {
2172                 new Signature("1234"), null, new Signature("abcd")
2173         };
2174         Signature[] s3 = {
2175                 null, null, null
2176         };
2177 
2178         // test write null
2179         p = Parcel.obtain();
2180         p.writeTypedArray(null, 0);
2181         p.setDataPosition(0);
2182         p.recycle();
2183 
2184         // test write not null
2185         p = Parcel.obtain();
2186         p.writeTypedArray(s, 0);
2187         p.setDataPosition(0);
2188         p.readTypedArray(s3, Signature.CREATOR);
2189         for (int i = 0; i < s.length; i++) {
2190             assertEquals(s[i], s3[i]);
2191         }
2192         p.recycle();
2193 
2194         p = Parcel.obtain();
2195         p.writeTypedArray(s2, 0);
2196         p.setDataPosition(0);
2197         p.readTypedArray(s3, Signature.CREATOR);
2198         for (int i = 0; i < s.length; i++) {
2199             assertEquals(s2[i], s3[i]);
2200         }
2201         p.recycle();
2202     }
2203 
2204     public void testCreateTypedArray() {
2205         Parcel p;
2206         Signature[] s = {new Signature("1234"),
2207                 new Signature("ABCD"),
2208                 new Signature("abcd")};
2209 
2210         Signature[] s2 = {new Signature("1234"),
2211                 null,
2212                 new Signature("abcd")};
2213         Signature[] s3;
2214 
2215         // test write null
2216         p = Parcel.obtain();
2217         p.writeTypedArray(null, 0);
2218         p.setDataPosition(0);
2219         assertNull(p.createTypedArray(Signature.CREATOR));
2220         p.recycle();
2221 
2222         // test write not null
2223         p = Parcel.obtain();
2224         p.writeTypedArray(s, 0);
2225         p.setDataPosition(0);
2226         s3 = p.createTypedArray(Signature.CREATOR);
2227         for (int i = 0; i < s.length; i++) {
2228             assertEquals(s[i], s3[i]);
2229         }
2230         p.recycle();
2231 
2232         p = Parcel.obtain();
2233         p.writeTypedArray(s2, 0);
2234         p.setDataPosition(0);
2235         s3 = p.createTypedArray(Signature.CREATOR);
2236         for (int i = 0; i < s.length; i++) {
2237             assertEquals(s2[i], s3[i]);
2238         }
2239         p.recycle();
2240     }
2241 
2242     public void testReadTypedList() {
2243         Parcel p;
2244         ArrayList<Signature> s = new ArrayList<Signature>();
2245         s.add(new Signature("1234"));
2246         s.add(new Signature("ABCD"));
2247         s.add(new Signature("abcd"));
2248 
2249         ArrayList<Signature> s2 = new ArrayList<Signature>();
2250         s2.add(new Signature("1234"));
2251         s2.add(null);
2252 
2253         ArrayList<Signature> s3 = new ArrayList<Signature>();
2254 
2255         // test write null
2256         p = Parcel.obtain();
2257         p.writeTypedList(null);
2258         p.setDataPosition(0);
2259         p.readTypedList(s3, Signature.CREATOR);
2260         assertEquals(0, s3.size());
2261 
2262         p.setDataPosition(0);
2263         try {
2264             p.readTypedList(null, Signature.CREATOR);
2265             fail("should throw a RuntimeException");
2266         } catch (RuntimeException e) {
2267             //expected
2268         }
2269         p.recycle();
2270 
2271         // test write not null
2272         p = Parcel.obtain();
2273         p.writeTypedList(s);
2274         p.setDataPosition(0);
2275         p.readTypedList(s3, Signature.CREATOR);
2276         for (int i = 0; i < s.size(); i++) {
2277             assertEquals(s.get(i), s3.get(i));
2278         }
2279 
2280         p.setDataPosition(0);
2281         try {
2282             p.readTypedList(null, Signature.CREATOR);
2283             fail("should throw a RuntimeException");
2284         } catch (RuntimeException e) {
2285             //expected
2286         }
2287 
2288         p.setDataPosition(0);
2289         p.readTypedList(s2, Signature.CREATOR);
2290         assertEquals(s.size(), s2.size());
2291         for (int i = 0; i < s.size(); i++) {
2292             assertEquals(s.get(i), s2.get(i));
2293         }
2294         p.recycle();
2295 
2296         s2 = new ArrayList<Signature>();
2297         s2.add(new Signature("1234"));
2298         s2.add(null);
2299         p = Parcel.obtain();
2300         p.writeTypedList(s2);
2301         p.setDataPosition(0);
2302         p.readTypedList(s3, Signature.CREATOR);
2303         assertEquals(s3.size(), s2.size());
2304         for (int i = 0; i < s2.size(); i++) {
2305             assertEquals(s2.get(i), s3.get(i));
2306         }
2307         p.recycle();
2308     }
2309 
2310     public void testCreateTypedArrayList() {
2311         Parcel p;
2312         ArrayList<Signature> s = new ArrayList<Signature>();
2313         s.add(new Signature("1234"));
2314         s.add(new Signature("ABCD"));
2315         s.add(new Signature("abcd"));
2316 
2317         ArrayList<Signature> s2 = new ArrayList<Signature>();
2318         s2.add(new Signature("1234"));
2319         s2.add(null);
2320 
2321         ArrayList<Signature> s3;
2322 
2323         // test write null
2324         p = Parcel.obtain();
2325         p.writeTypedList(null);
2326         p.setDataPosition(0);
2327         assertNull(p.createTypedArrayList(Signature.CREATOR));
2328         p.recycle();
2329 
2330         // test write not null
2331         p = Parcel.obtain();
2332         p.writeTypedList(s);
2333         p.setDataPosition(0);
2334         s3 = p.createTypedArrayList(Signature.CREATOR);
2335         for (int i = 0; i < s.size(); i++) {
2336             assertEquals(s.get(i), s3.get(i));
2337         }
2338 
2339         p = Parcel.obtain();
2340         p.writeTypedList(s2);
2341         p.setDataPosition(0);
2342         s3 = p.createTypedArrayList(Signature.CREATOR);
2343         assertEquals(s3.size(), s2.size());
2344         for (int i = 0; i < s2.size(); i++) {
2345             assertEquals(s2.get(i), s3.get(i));
2346         }
2347         p.recycle();
2348     }
2349 
2350     public void testReadException() {
2351     }
2352 
2353     public void testReadException2() {
2354         Parcel p = Parcel.obtain();
2355         String msg = "testReadException2";
2356 
2357         p.writeException(new SecurityException(msg));
2358         p.setDataPosition(0);
2359         try {
2360             p.readException();
2361             fail("Should throw a SecurityException");
2362         } catch (SecurityException e) {
2363             assertEquals(msg, e.getMessage());
2364         }
2365 
2366         p.setDataPosition(0);
2367         p.writeException(new BadParcelableException(msg));
2368         p.setDataPosition(0);
2369         try {
2370             p.readException();
2371             fail("Should throw a BadParcelableException");
2372         } catch (BadParcelableException e) {
2373             assertEquals(msg, e.getMessage());
2374         }
2375 
2376         p.setDataPosition(0);
2377         p.writeException(new IllegalArgumentException(msg));
2378         p.setDataPosition(0);
2379         try {
2380             p.readException();
2381             fail("Should throw an IllegalArgumentException");
2382         } catch (IllegalArgumentException e) {
2383             assertEquals(msg, e.getMessage());
2384         }
2385 
2386         p.setDataPosition(0);
2387         p.writeException(new NullPointerException(msg));
2388         p.setDataPosition(0);
2389         try {
2390             p.readException();
2391             fail("Should throw a NullPointerException");
2392         } catch (NullPointerException e) {
2393             assertEquals(msg, e.getMessage());
2394         }
2395 
2396         p.setDataPosition(0);
2397         p.writeException(new IllegalStateException(msg));
2398         p.setDataPosition(0);
2399         try {
2400             p.readException();
2401             fail("Should throw an IllegalStateException");
2402         } catch (IllegalStateException e) {
2403             assertEquals(msg, e.getMessage());
2404         }
2405 
2406         p.setDataPosition(0);
2407         try {
2408             p.writeException(new RuntimeException());
2409             fail("Should throw an IllegalStateException");
2410         } catch (RuntimeException e) {
2411             //expected
2412         }
2413         p.recycle();
2414     }
2415 
2416     public void testWriteNoException() {
2417         Parcel p = Parcel.obtain();
2418         p.writeNoException();
2419         p.setDataPosition(0);
2420         p.readException();
2421         p.recycle();
2422     }
2423 
2424     public void testWriteFileDescriptor() {
2425         Parcel p;
2426         FileDescriptor fIn = FileDescriptor.in;
2427         ParcelFileDescriptor pfd;
2428 
2429         p = Parcel.obtain();
2430         pfd = p.readFileDescriptor();
2431         assertNull(pfd);
2432         p.recycle();
2433 
2434         p = Parcel.obtain();
2435         p.writeFileDescriptor(fIn);
2436         p.setDataPosition(0);
2437         pfd = p.readFileDescriptor();
2438         assertNotNull(pfd);
2439         assertNotNull(pfd.getFileDescriptor());
2440         p.recycle();
2441     }
2442 
2443     public void testHasFileDescriptor() {
2444         Parcel p;
2445         FileDescriptor fIn = FileDescriptor.in;
2446 
2447         p = Parcel.obtain();
2448         p.writeFileDescriptor(fIn);
2449         p.setDataPosition(0);
2450         assertTrue(p.hasFileDescriptors());
2451         p.recycle();
2452 
2453         p = Parcel.obtain();
2454         p.writeInt(111);
2455         p.setDataPosition(0);
2456         assertFalse(p.hasFileDescriptors());
2457         p.recycle();
2458     }
2459 
2460     public void testReadBundle() {
2461         Bundle bundle = new Bundle();
2462         bundle.putBoolean("boolean", true);
2463         bundle.putInt("int", Integer.MAX_VALUE);
2464         bundle.putString("string", "String");
2465 
2466         Bundle bundle2;
2467         Parcel p;
2468 
2469         // test null
2470         p = Parcel.obtain();
2471         p.writeBundle(null);
2472         p.setDataPosition(0);
2473         bundle2 = p.readBundle();
2474         assertNull(bundle2);
2475         p.recycle();
2476 
2477         // test not null
2478         bundle2 = null;
2479         p = Parcel.obtain();
2480         p.writeBundle(bundle);
2481         p.setDataPosition(0);
2482         bundle2 = p.readBundle();
2483         assertNotNull(bundle2);
2484         assertEquals(true, bundle2.getBoolean("boolean"));
2485         assertEquals(Integer.MAX_VALUE, bundle2.getInt("int"));
2486         assertEquals("String", bundle2.getString("string"));
2487         p.recycle();
2488 
2489         bundle2 = null;
2490         Parcel a = Parcel.obtain();
2491         bundle2 = new Bundle();
2492         bundle2.putString("foo", "test");
2493         a.writeBundle(bundle2);
2494         a.setDataPosition(0);
2495         bundle.readFromParcel(a);
2496         p = Parcel.obtain();
2497         p.setDataPosition(0);
2498         p.writeBundle(bundle);
2499         p.setDataPosition(0);
2500         bundle2 = p.readBundle();
2501         assertNotNull(bundle2);
2502         assertFalse(true == bundle2.getBoolean("boolean"));
2503         assertFalse(Integer.MAX_VALUE == bundle2.getInt("int"));
2504         assertFalse("String".equals( bundle2.getString("string")));
2505         a.recycle();
2506         p.recycle();
2507     }
2508 
2509     public void testReadBundle2() {
2510         Bundle b = new Bundle();
2511         b.putBoolean("boolean", true);
2512         b.putInt("int", Integer.MAX_VALUE);
2513         b.putString("string", "String");
2514 
2515         Bundle u;
2516         Parcel p;
2517         MockClassLoader m = new MockClassLoader();
2518 
2519         p = Parcel.obtain();
2520         p.writeBundle(null);
2521         p.setDataPosition(0);
2522         u = p.readBundle(m);
2523         assertNull(u);
2524         p.recycle();
2525 
2526         u = null;
2527         p = Parcel.obtain();
2528         p.writeBundle(b);
2529         p.setDataPosition(0);
2530         u = p.readBundle(m);
2531         assertNotNull(u);
2532         assertEquals(true, b.getBoolean("boolean"));
2533         assertEquals(Integer.MAX_VALUE, b.getInt("int"));
2534         assertEquals("String", b.getString("string"));
2535         p.recycle();
2536     }
2537 
2538     public void testWriteArray() {
2539         Parcel p;
2540         MockClassLoader mcl = new MockClassLoader();
2541 
2542         p = Parcel.obtain();
2543         p.writeArray(null);
2544         p.setDataPosition(0);
2545         assertNull(p.readArray(mcl));
2546         p.recycle();
2547 
2548         Object[] objects = new Object[5];
2549         objects[0] = Integer.MAX_VALUE;
2550         objects[1] = true;
2551         objects[2] = Long.MAX_VALUE;
2552         objects[3] = "String";
2553         objects[4] = Float.MAX_VALUE;
2554         Object[] objects2;
2555 
2556         p = Parcel.obtain();
2557         p.writeArray(objects);
2558         p.setDataPosition(0);
2559         objects2 = p.readArray(mcl);
2560         assertNotNull(objects2);
2561         for (int i = 0; i < objects2.length; i++) {
2562             assertEquals(objects[i], objects2[i]);
2563         }
2564         p.recycle();
2565     }
2566 
2567     public void testReadArrayList() {
2568         Parcel p;
2569         MockClassLoader mcl = new MockClassLoader();
2570 
2571         p = Parcel.obtain();
2572         p.writeArray(null);
2573         p.setDataPosition(0);
2574         assertNull(p.readArrayList(mcl));
2575         p.recycle();
2576 
2577         Object[] objects = new Object[5];
2578         objects[0] = Integer.MAX_VALUE;
2579         objects[1] = true;
2580         objects[2] = Long.MAX_VALUE;
2581         objects[3] = "String";
2582         objects[4] = Float.MAX_VALUE;
2583         ArrayList<?> objects2;
2584 
2585         p = Parcel.obtain();
2586         p.writeArray(objects);
2587         p.setDataPosition(0);
2588         objects2 = p.readArrayList(mcl);
2589         assertNotNull(objects2);
2590         for (int i = 0; i < objects2.size(); i++) {
2591             assertEquals(objects[i], objects2.get(i));
2592         }
2593         p.recycle();
2594     }
2595 
2596     @SuppressWarnings("unchecked")
2597     public void testWriteSparseArray() {
2598         Parcel p;
2599         MockClassLoader mcl = new MockClassLoader();
2600 
2601         p = Parcel.obtain();
2602         p.writeSparseArray(null);
2603         p.setDataPosition(0);
2604         assertNull(p.readSparseArray(mcl));
2605         p.recycle();
2606 
2607         SparseArray<Object> sparseArray = new SparseArray<Object>();
2608         sparseArray.put(3, "String");
2609         sparseArray.put(2, Long.MAX_VALUE);
2610         sparseArray.put(4, Float.MAX_VALUE);
2611         sparseArray.put(0, Integer.MAX_VALUE);
2612         sparseArray.put(1, true);
2613         sparseArray.put(10, true);
2614         SparseArray<Object> sparseArray2;
2615 
2616         p = Parcel.obtain();
2617         p.writeSparseArray(sparseArray);
2618         p.setDataPosition(0);
2619         sparseArray2 = p.readSparseArray(mcl);
2620         assertNotNull(sparseArray2);
2621         assertEquals(sparseArray.size(), sparseArray2.size());
2622         assertEquals(sparseArray.get(0), sparseArray2.get(0));
2623         assertEquals(sparseArray.get(1), sparseArray2.get(1));
2624         assertEquals(sparseArray.get(2), sparseArray2.get(2));
2625         assertEquals(sparseArray.get(3), sparseArray2.get(3));
2626         assertEquals(sparseArray.get(4), sparseArray2.get(4));
2627         assertEquals(sparseArray.get(10), sparseArray2.get(10));
2628         p.recycle();
2629     }
2630 
2631     public void testWriteSparseBooleanArray() {
2632         Parcel p;
2633 
2634         p = Parcel.obtain();
2635         p.writeSparseArray(null);
2636         p.setDataPosition(0);
2637         assertNull(p.readSparseBooleanArray());
2638         p.recycle();
2639 
2640         SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();
2641         sparseBooleanArray.put(3, true);
2642         sparseBooleanArray.put(2, false);
2643         sparseBooleanArray.put(4, false);
2644         sparseBooleanArray.put(0, true);
2645         sparseBooleanArray.put(1, true);
2646         sparseBooleanArray.put(10, true);
2647         SparseBooleanArray sparseBoolanArray2;
2648 
2649         p = Parcel.obtain();
2650         p.writeSparseBooleanArray(sparseBooleanArray);
2651         p.setDataPosition(0);
2652         sparseBoolanArray2 = p.readSparseBooleanArray();
2653         assertNotNull(sparseBoolanArray2);
2654         assertEquals(sparseBooleanArray.size(), sparseBoolanArray2.size());
2655         assertEquals(sparseBooleanArray.get(0), sparseBoolanArray2.get(0));
2656         assertEquals(sparseBooleanArray.get(1), sparseBoolanArray2.get(1));
2657         assertEquals(sparseBooleanArray.get(2), sparseBoolanArray2.get(2));
2658         assertEquals(sparseBooleanArray.get(3), sparseBoolanArray2.get(3));
2659         assertEquals(sparseBooleanArray.get(4), sparseBoolanArray2.get(4));
2660         assertEquals(sparseBooleanArray.get(10), sparseBoolanArray2.get(10));
2661         p.recycle();
2662     }
2663 
2664     public void testWriteStrongBinder() {
2665         Parcel p;
2666         Binder binder;
2667         Binder binder2 = new Binder();
2668 
2669         p = Parcel.obtain();
2670         p.writeStrongBinder(null);
2671         p.setDataPosition(0);
2672         assertNull(p.readStrongBinder());
2673         p.recycle();
2674 
2675         p = Parcel.obtain();
2676         p.writeStrongBinder(binder2);
2677         p.setDataPosition(0);
2678         binder = (Binder) p.readStrongBinder();
2679         assertEquals(binder2, binder);
2680         p.recycle();
2681     }
2682 
2683     public void testWriteStrongInterface() {
2684         Parcel p;
2685         MockIInterface mockInterface = new MockIInterface();
2686         MockIInterface mockIInterface2 = new MockIInterface();
2687 
2688         p = Parcel.obtain();
2689         p.writeStrongInterface(null);
2690         p.setDataPosition(0);
2691         assertNull(p.readStrongBinder());
2692         p.recycle();
2693 
2694         p = Parcel.obtain();
2695         p.writeStrongInterface(mockInterface);
2696         p.setDataPosition(0);
2697         mockIInterface2.binder = (Binder) p.readStrongBinder();
2698         assertEquals(mockInterface.binder, mockIInterface2.binder);
2699         p.recycle();
2700     }
2701 
2702     public void testWriteBinderArray() {
2703         Parcel p;
2704         IBinder[] ibinder2 = {new Binder(), new Binder()};
2705         IBinder[] ibinder3 = new IBinder[2];
2706         IBinder[] ibinder4 = new IBinder[3];
2707 
2708         p = Parcel.obtain();
2709         p.writeBinderArray(null);
2710         p.setDataPosition(0);
2711         try {
2712             p.readBinderArray(null);
2713             fail("Should throw a RuntimeException");
2714         } catch (RuntimeException e) {
2715             //expected
2716         }
2717 
2718         p.setDataPosition(0);
2719         try {
2720             p.readBinderArray(ibinder3);
2721             fail("Should throw a RuntimeException");
2722         } catch (RuntimeException e) {
2723             //expected
2724         }
2725 
2726         p.setDataPosition(0);
2727         try {
2728             p.readBinderArray(ibinder2);
2729             fail("Should throw a RuntimeException");
2730         } catch (RuntimeException e) {
2731             //expected
2732         }
2733         p.recycle();
2734 
2735         p = Parcel.obtain();
2736         p.writeBinderArray(ibinder2);
2737         p.setDataPosition(0);
2738         try {
2739             p.readBinderArray(null);
2740             fail("Should throw a RuntimeException");
2741         } catch (RuntimeException e) {
2742             //expected
2743         }
2744 
2745         p.setDataPosition(0);
2746         try {
2747             p.readBinderArray(ibinder4);
2748             fail("Should throw a RuntimeException");
2749         } catch (RuntimeException e) {
2750             //expected
2751         }
2752 
2753         p.setDataPosition(0);
2754         p.readBinderArray(ibinder3);
2755         assertNotNull(ibinder3);
2756         for (int i = 0; i < ibinder3.length; i++) {
2757             assertNotNull(ibinder3[i]);
2758             assertEquals(ibinder2[i], ibinder3[i]);
2759         }
2760         p.recycle();
2761     }
2762 
2763     public void testCreateBinderArray() {
2764         Parcel p;
2765         IBinder[] ibinder  = {};
2766         IBinder[] ibinder2 = {new Binder(), new Binder()};
2767         IBinder[] ibinder3;
2768         IBinder[] ibinder4;
2769 
2770         p = Parcel.obtain();
2771         p.writeBinderArray(null);
2772         p.setDataPosition(0);
2773         ibinder3 = p.createBinderArray();
2774         assertNull(ibinder3);
2775         p.recycle();
2776 
2777         p = Parcel.obtain();
2778         p.writeBinderArray(ibinder);
2779         p.setDataPosition(0);
2780         ibinder4 = p.createBinderArray();
2781         assertNotNull(ibinder4);
2782         assertEquals(0, ibinder4.length);
2783         p.recycle();
2784 
2785         p = Parcel.obtain();
2786         p.writeBinderArray(ibinder2);
2787         p.setDataPosition(0);
2788         ibinder3 = p.createBinderArray();
2789         assertNotNull(ibinder3);
2790         for (int i = 0; i < ibinder3.length; i++) {
2791             assertNotNull(ibinder3[i]);
2792             assertEquals(ibinder2[i], ibinder3[i]);
2793         }
2794         p.recycle();
2795     }
2796 
2797     public void testWriteBinderList() {
2798         Parcel p;
2799         ArrayList<IBinder> arrayList = new ArrayList<IBinder>();
2800         ArrayList<IBinder> arrayList2 = new ArrayList<IBinder>();
2801         arrayList2.add(new Binder());
2802         arrayList2.add(new Binder());
2803         ArrayList<IBinder> arrayList3 = new ArrayList<IBinder>();
2804         arrayList3.add(new Binder());
2805         arrayList3.add(new Binder());
2806         arrayList3.add(new Binder());
2807 
2808         p = Parcel.obtain();
2809         p.writeBinderList(null);
2810         p.setDataPosition(0);
2811         try {
2812             p.readBinderList(null);
2813             fail("Should throw a RuntimeException");
2814         } catch (RuntimeException e) {
2815             //expected
2816         }
2817         p.setDataPosition(0);
2818         assertEquals(0, arrayList.size());
2819         p.readBinderList(arrayList);
2820         assertEquals(0, arrayList.size());
2821         p.recycle();
2822 
2823         p = Parcel.obtain();
2824         p.writeBinderList(arrayList2);
2825         p.setDataPosition(0);
2826         assertEquals(0, arrayList.size());
2827         p.readBinderList(arrayList);
2828         assertEquals(2, arrayList.size());
2829         assertEquals(arrayList2, arrayList);
2830         p.recycle();
2831 
2832         p = Parcel.obtain();
2833         p.writeBinderList(arrayList2);
2834         p.setDataPosition(0);
2835         assertEquals(3, arrayList3.size());
2836         p.readBinderList(arrayList3);
2837         assertEquals(2, arrayList3.size());
2838         assertEquals(arrayList2, arrayList3);
2839         p.recycle();
2840     }
2841 
2842     public void testCreateBinderArrayList() {
2843         Parcel p;
2844         ArrayList<IBinder> arrayList = new ArrayList<IBinder>();
2845         ArrayList<IBinder> arrayList2 = new ArrayList<IBinder>();
2846         arrayList2.add(new Binder());
2847         arrayList2.add(new Binder());
2848         ArrayList<IBinder> arrayList3;
2849         ArrayList<IBinder> arrayList4;
2850 
2851         p = Parcel.obtain();
2852         p.writeBinderList(null);
2853         p.setDataPosition(0);
2854         arrayList3 = p.createBinderArrayList();
2855         assertNull(arrayList3);
2856         p.recycle();
2857 
2858         p = Parcel.obtain();
2859         p.writeBinderList(arrayList);
2860         p.setDataPosition(0);
2861         arrayList3 = p.createBinderArrayList();
2862         assertNotNull(arrayList3);
2863         assertEquals(0, arrayList3.size());
2864         p.recycle();
2865 
2866         p = Parcel.obtain();
2867         p.writeBinderList(arrayList2);
2868         p.setDataPosition(0);
2869         arrayList4 = p.createBinderArrayList();
2870         assertNotNull(arrayList4);
2871         assertEquals(arrayList2, arrayList4);
2872         p.recycle();
2873     }
2874 
2875     @SuppressWarnings("unchecked")
2876     public void testWriteMap() {
2877         Parcel p;
2878         MockClassLoader mcl = new MockClassLoader();
2879         HashMap map = new HashMap();
2880         HashMap map2 = new HashMap();
2881 
2882         p = Parcel.obtain();
2883         p.writeMap(null);
2884         p.setDataPosition(0);
2885         assertEquals(0, map2.size());
2886         p.readMap(map2, mcl);
2887         assertEquals(0, map2.size());
2888         p.recycle();
2889 
2890         map.put("string", "String");
2891         map.put("int", Integer.MAX_VALUE);
2892         map.put("boolean", true);
2893         p = Parcel.obtain();
2894         p.writeMap(map);
2895         p.setDataPosition(0);
2896         assertEquals(0, map2.size());
2897         p.readMap(map2, mcl);
2898         assertEquals(3, map2.size());
2899         assertEquals("String", map.get("string"));
2900         assertEquals(Integer.MAX_VALUE, map.get("int"));
2901         assertEquals(true, map.get("boolean"));
2902         p.recycle();
2903     }
2904 
2905     @SuppressWarnings("unchecked")
2906     public void testReadHashMap() {
2907         Parcel p;
2908         MockClassLoader mcl = new MockClassLoader();
2909         HashMap map = new HashMap();
2910         HashMap map2;
2911 
2912         p = Parcel.obtain();
2913         p.writeMap(null);
2914         p.setDataPosition(0);
2915         map2 = p.readHashMap(mcl);
2916         assertNull(map2);
2917         p.recycle();
2918 
2919         map.put("string", "String");
2920         map.put("int", Integer.MAX_VALUE);
2921         map.put("boolean", true);
2922         map2 = null;
2923         p = Parcel.obtain();
2924         p.writeMap(map);
2925         p.setDataPosition(0);
2926         map2 = p.readHashMap(mcl);
2927         assertNotNull(map2);
2928         assertEquals(3, map2.size());
2929         assertEquals("String", map.get("string"));
2930         assertEquals(Integer.MAX_VALUE, map.get("int"));
2931         assertEquals(true, map.get("boolean"));
2932         p.recycle();
2933     }
2934 
2935     @SuppressWarnings("unchecked")
2936     public void testReadList() {
2937         Parcel p;
2938         MockClassLoader mcl = new MockClassLoader();
2939         ArrayList arrayList = new ArrayList();
2940 
2941         p = Parcel.obtain();
2942         p.writeList(null);
2943         p.setDataPosition(0);
2944         assertEquals(0, arrayList.size());
2945         p.readList(arrayList, mcl);
2946         assertEquals(0, arrayList.size());
2947         p.recycle();
2948 
2949         ArrayList arrayList2 = new ArrayList();
2950         arrayList2.add(Integer.MAX_VALUE);
2951         arrayList2.add(true);
2952         arrayList2.add(Long.MAX_VALUE);
2953         arrayList2.add("String");
2954         arrayList2.add(Float.MAX_VALUE);
2955 
2956         p = Parcel.obtain();
2957         p.writeList(arrayList2);
2958         p.setDataPosition(0);
2959         assertEquals(0, arrayList.size());
2960         p.readList(arrayList, mcl);
2961         assertEquals(5, arrayList.size());
2962         for (int i = 0; i < arrayList.size(); i++) {
2963             assertEquals(arrayList.get(i), arrayList2.get(i));
2964         }
2965         p.recycle();
2966     }
2967 
2968     public void testBinderDataProtection() {
2969         Parcel p;
2970         IBinder b = new Binder();
2971 
2972         p = Parcel.obtain();
2973         final int firstIntPos = p.dataPosition();
2974         p.writeInt(1);
2975         p.writeStrongBinder(b);
2976         final int secondIntPos = p.dataPosition();
2977         p.writeInt(2);
2978         p.writeStrongBinder(b);
2979         final int thirdIntPos = p.dataPosition();
2980         p.writeInt(3);
2981 
2982         for (int pos = 0; pos <= thirdIntPos; pos++) {
2983             p.setDataPosition(pos);
2984             int value = p.readInt();
2985 
2986             // WARNING: this is using unstable APIs: these positions aren't guaranteed
2987             if (firstIntPos - 4 <= pos && pos <= firstIntPos) continue;
2988             if (secondIntPos - 4 <= pos && pos <= secondIntPos) continue;
2989             if (thirdIntPos - 4 <= pos && pos <= thirdIntPos) continue;
2990 
2991             // All other read attempts cross into protected data and will return 0
2992             assertEquals(0, value);
2993         }
2994 
2995         p.recycle();
2996     }
2997 
2998     public void testBinderDataProtectionIncrements() {
2999         Parcel p;
3000         IBinder b = new Binder();
3001 
3002         p = Parcel.obtain();
3003         final int firstIntPos = p.dataPosition();
3004         p.writeInt(1);
3005         p.writeStrongBinder(b);
3006         final int secondIntPos = p.dataPosition();
3007         p.writeInt(2);
3008         p.writeStrongBinder(b);
3009         final int thirdIntPos = p.dataPosition();
3010         p.writeInt(3);
3011         final int end = p.dataPosition();
3012 
3013         p.setDataPosition(0);
3014         int pos;
3015         do {
3016             pos = p.dataPosition();
3017             int value = p.readInt();
3018 
3019             // WARNING: this is using unstable APIs: these positions aren't guaranteed
3020             if (firstIntPos - 4 <= pos && pos <= firstIntPos) continue;
3021             if (secondIntPos - 4 <= pos && pos <= secondIntPos) continue;
3022             if (thirdIntPos - 4 <= pos && pos <= thirdIntPos) continue;
3023 
3024             assertEquals(0, value);
3025         } while(pos < end);
3026 
3027         p.recycle();
3028     }
3029 
3030     private class MockClassLoader extends ClassLoader {
3031         public MockClassLoader() {
3032             super();
3033         }
3034     }
3035 
3036     private class MockIInterface implements IInterface {
3037         public Binder binder;
3038 
3039         public MockIInterface() {
3040             binder = new Binder();
3041         }
3042 
3043         public IBinder asBinder() {
3044             return binder;
3045         }
3046     }
3047 
3048     private static boolean parcelableWithBadCreatorInitializerHasRun;
3049     private static boolean invalidCreatorIntializerHasRun;
3050 
3051     /**
3052      * A class that would be Parcelable except that it doesn't have a CREATOR field declared to be
3053      * of the correct type.
3054      */
3055     @SuppressWarnings("unused") // Referenced via reflection only
3056     private static class ParcelableWithBadCreator implements Parcelable {
3057 
3058         static {
3059             ParcelTest.parcelableWithBadCreatorInitializerHasRun = true;
3060         }
3061 
3062         private static class InvalidCreator
3063                 implements Parcelable.Creator<ParcelableWithBadCreator> {
3064 
3065             static {
3066                 invalidCreatorIntializerHasRun = true;
3067             }
3068 
3069             @Override
3070             public ParcelableWithBadCreator createFromParcel(Parcel source) {
3071                 return null;
3072             }
3073 
3074             @Override
3075             public ParcelableWithBadCreator[] newArray(int size) {
3076                 return new ParcelableWithBadCreator[0];
3077             }
3078 
3079         }
3080 
3081         // Invalid declaration: Must be declared as Parcelable.Creator or a subclass.
3082         public static Object CREATOR = new InvalidCreator();
3083 
3084         @Override
3085         public int describeContents() {
3086             return 0;
3087         }
3088 
3089         @Override
3090         public void writeToParcel(Parcel dest, int flags) {
3091 
3092         }
3093     }
3094 
3095     // http://b/1171613
3096     public void testBadStream_invalidCreator() {
3097         Parcel parcel = Parcel.obtain();
3098         // Create an invalid stream by manipulating the Parcel.
3099         parcel.writeString(getClass().getName() + "$ParcelableWithBadCreator");
3100         byte[] badData = parcel.marshall();
3101         parcel.recycle();
3102 
3103         // Now try to read the bad data.
3104         parcel = Parcel.obtain();
3105         parcel.unmarshall(badData, 0, badData.length);
3106         parcel.setDataPosition(0);
3107         try {
3108             parcel.readParcelable(getClass().getClassLoader());
3109             fail();
3110         } catch (BadParcelableException expected) {
3111         } finally {
3112             parcel.recycle();
3113         }
3114 
3115         assertFalse(invalidCreatorIntializerHasRun);
3116         assertFalse(parcelableWithBadCreatorInitializerHasRun);
3117     }
3118 
3119     private static boolean doesNotImplementParcelableInitializerHasRun;
3120 
3121     /** A class that would be Parcelable except that it does not implement Parcelable. */
3122     @SuppressWarnings("unused") // Referenced via reflection only
3123     private static class DoesNotImplementParcelable {
3124 
3125         static {
3126             doesNotImplementParcelableInitializerHasRun = true;
3127         }
3128 
3129         public static Parcelable.Creator<Object> CREATOR = new Parcelable.Creator<Object>() {
3130             @Override
3131             public Object createFromParcel(Parcel source) {
3132                 return new DoesNotImplementParcelable();
3133             }
3134 
3135             @Override
3136             public Object[] newArray(int size) {
3137                 return new Object[size];
3138             }
3139         };
3140     }
3141 
3142     // http://b/1171613
3143     public void testBadStream_objectDoesNotImplementParcelable() {
3144         Parcel parcel = Parcel.obtain();
3145         // Create an invalid stream by manipulating the Parcel.
3146         parcel.writeString(getClass().getName() + "$DoesNotImplementParcelable");
3147         byte[] badData = parcel.marshall();
3148         parcel.recycle();
3149 
3150         // Now try to read the bad data.
3151         parcel = Parcel.obtain();
3152         parcel.unmarshall(badData, 0, badData.length);
3153         parcel.setDataPosition(0);
3154         try {
3155             parcel.readParcelable(getClass().getClassLoader());
3156             fail();
3157         } catch (BadParcelableException expected) {
3158         } finally {
3159             parcel.recycle();
3160         }
3161 
3162         assertFalse(doesNotImplementParcelableInitializerHasRun);
3163     }
3164 
3165     public static class SimpleParcelable implements Parcelable {
3166         private final int value;
3167 
3168         public SimpleParcelable(int value) {
3169             this.value = value;
3170         }
3171 
3172         private SimpleParcelable(Parcel in) {
3173             this.value = in.readInt();
3174         }
3175 
3176         public int getValue() {
3177             return value;
3178         }
3179 
3180         @Override
3181         public int describeContents() {
3182             return 0;
3183         }
3184 
3185         @Override
3186         public void writeToParcel(Parcel out, int flags) {
3187             out.writeInt(value);
3188         }
3189 
3190         public static Parcelable.Creator<SimpleParcelable> CREATOR =
3191                 new Parcelable.Creator<SimpleParcelable>() {
3192 
3193             @Override
3194             public SimpleParcelable createFromParcel(Parcel source) {
3195                 return new SimpleParcelable(source);
3196             }
3197 
3198             @Override
3199             public SimpleParcelable[] newArray(int size) {
3200                 return new SimpleParcelable[size];
3201             }
3202         };
3203     }
3204 
3205     public void testReadWriteParcellableList() {
3206         Parcel parcel = Parcel.obtain();
3207 
3208         ArrayList<SimpleParcelable> list = new ArrayList<>();
3209         list.add(new SimpleParcelable(57));
3210 
3211         // Writing a |null| list to a parcel should work, and reading it back
3212         // from a parcel should clear the target list.
3213         parcel.writeParcelableList(null, 0);
3214         parcel.setDataPosition(0);
3215         parcel.readParcelableList(list, SimpleParcelable.class.getClassLoader());
3216         assertEquals(0, list.size());
3217 
3218         list.clear();
3219         list.add(new SimpleParcelable(42));
3220         list.add(new SimpleParcelable(56));
3221 
3222         parcel.setDataPosition(0);
3223         parcel.writeParcelableList(list, 0);
3224 
3225         // Populate the list with a value, we will later assert that the
3226         // value has been removed.
3227         list.clear();
3228         list.add(new SimpleParcelable(100));
3229 
3230         parcel.setDataPosition(0);
3231         parcel.readParcelableList(list, SimpleParcelable.class.getClassLoader());
3232 
3233         assertEquals(2, list.size());
3234         assertEquals(42, list.get(0).getValue());
3235         assertEquals(56, list.get(1).getValue());
3236     }
3237 
3238     // http://b/35384981
3239     public void testCreateArrayWithTruncatedParcel() {
3240         Parcel parcel = Parcel.obtain();
3241         parcel.writeByteArray(new byte[] { 'a', 'b' });
3242         byte[] marshalled = parcel.marshall();
3243 
3244         // Test that createByteArray returns null with a truncated parcel.
3245         parcel = Parcel.obtain();
3246         parcel.unmarshall(marshalled, 0, marshalled.length);
3247         parcel.setDataPosition(0);
3248         // Shorten the data size by 2 to remove padding at the end of the array.
3249         parcel.setDataSize(marshalled.length - 2);
3250         assertNull(parcel.createByteArray());
3251 
3252         // Test that readByteArray returns null with a truncated parcel.
3253         parcel = Parcel.obtain();
3254         parcel.unmarshall(marshalled, 0, marshalled.length);
3255         parcel.setDataSize(marshalled.length - 2);
3256         try {
3257             parcel.readByteArray(new byte[2]);
3258             fail();
3259         } catch (RuntimeException expected) {
3260         }
3261     }
3262 
3263     public void testMaliciousMapWrite() {
3264         class MaliciousMap<K, V> extends HashMap<K, V> {
3265             public int fakeSize = 0;
3266             public boolean armed = false;
3267 
3268             class FakeEntrySet extends HashSet<Entry<K, V>> {
3269                 public FakeEntrySet(Collection<? extends Entry<K, V>> c) {
3270                     super(c);
3271                 }
3272 
3273                 @Override
3274                 public int size() {
3275                     if (armed) {
3276                         // Only return fake size on next call, to mitigate unexpected behavior.
3277                         armed = false;
3278                         return fakeSize;
3279                     } else {
3280                         return super.size();
3281                     }
3282                 }
3283             }
3284 
3285             @Override
3286             public Set<Map.Entry<K, V>> entrySet() {
3287                 return new FakeEntrySet(super.entrySet());
3288             }
3289         }
3290 
3291         Parcel parcel = Parcel.obtain();
3292 
3293         // Fake having more Map entries than there really are
3294         MaliciousMap map = new MaliciousMap<String, String>();
3295         map.fakeSize = 1;
3296         map.armed = true;
3297         try {
3298             parcel.writeMap(map);
3299             fail("Should have thrown a BadParcelableException");
3300         } catch (BadParcelableException bpe) {
3301             // good
3302         }
3303 
3304         // Fake having fewer Map entries than there really are
3305         map = new MaliciousMap<String, String>();
3306         map.put("key", "value");
3307         map.fakeSize = 0;
3308         map.armed = true;
3309         try {
3310             parcel.writeMap(map);
3311             fail("Should have thrown a BadParcelableException");
3312         } catch (BadParcelableException bpe) {
3313             // good
3314         }
3315     }
3316 
3317     public static class ParcelExceptionConnection extends AbstractFuture<IParcelExceptionService>
3318             implements ServiceConnection {
3319         @Override
3320         public void onServiceConnected(ComponentName name, IBinder service) {
3321             set(IParcelExceptionService.Stub.asInterface(service));
3322         }
3323 
3324         @Override
3325         public void onServiceDisconnected(ComponentName name) {
3326         }
3327 
3328         @Override
3329         public IParcelExceptionService get() throws InterruptedException, ExecutionException {
3330             try {
3331                 return get(5, TimeUnit.SECONDS);
3332             } catch (TimeoutException e) {
3333                 throw new RuntimeException(e);
3334             }
3335         }
3336     }
3337 
3338     public void testExceptionOverwritesObject() throws Exception {
3339         final Intent intent = new Intent();
3340         intent.setComponent(new ComponentName(
3341                 "android.os.cts", "android.os.cts.ParcelExceptionService"));
3342 
3343         final ParcelExceptionConnection connection = new ParcelExceptionConnection();
3344 
3345         mContext.startService(intent);
3346         assertTrue(mContext.bindService(intent, connection,
3347                 Context.BIND_ABOVE_CLIENT | Context.BIND_EXTERNAL_SERVICE));
3348 
3349 
3350         Parcel data = Parcel.obtain();
3351         Parcel reply = Parcel.obtain();
3352         data.writeInterfaceToken("android.os.cts.IParcelExceptionService");
3353         IParcelExceptionService service = connection.get();
3354         try {
3355             assertTrue("Transaction failed", service.asBinder().transact(
3356                     IParcelExceptionService.Stub.TRANSACTION_writeBinderThrowException, data, reply,
3357                     0));
3358         } catch (Exception e) {
3359             fail("Exception caught from transaction: " + e);
3360         }
3361         reply.setDataPosition(0);
3362         assertTrue("Exception should have occurred on service-side",
3363                 reply.readExceptionCode() != 0);
3364         assertNull("Binder should have been overwritten by the exception",
3365                 reply.readStrongBinder());
3366     }
3367 
3368     public static class ParcelObjectFreeService extends Service {
3369 
3370         @Override
3371         public IBinder onBind(Intent intent) {
3372             return new Binder();
3373         }
3374 
3375         @Override
3376         public void onCreate() {
3377             super.onCreate();
3378 
3379             Parcel parcel = Parcel.obtain();
3380 
3381             // Construct parcel with object in it.
3382             parcel.writeInt(1);
3383             final int pos = parcel.dataPosition();
3384             parcel.writeStrongBinder(new Binder());
3385 
3386             // wipe out the object by setting data size
3387             parcel.setDataSize(pos);
3388 
3389             // recycle the parcel. This should not cause a native segfault
3390             parcel.recycle();
3391         }
3392 
3393         public static class Connection extends AbstractFuture<IBinder>
3394                 implements ServiceConnection {
3395 
3396             @Override
3397             public void onServiceConnected(ComponentName name, IBinder service) {
3398                 set(service);
3399             }
3400 
3401             @Override
3402             public void onServiceDisconnected(ComponentName name) {
3403             }
3404 
3405             @Override
3406             public IBinder get() throws InterruptedException, ExecutionException {
3407                 try {
3408                     return get(5, TimeUnit.SECONDS);
3409                 } catch (TimeoutException e) {
3410                     return null;
3411                 }
3412             }
3413         }
3414     }
3415 
3416     public void testObjectDoubleFree() throws Exception {
3417 
3418         final Intent intent = new Intent();
3419         intent.setComponent(new ComponentName(
3420                 "android.os.cts", "android.os.cts.ParcelTest$ParcelObjectFreeService"));
3421 
3422         final ParcelObjectFreeService.Connection connection =
3423                 new ParcelObjectFreeService.Connection();
3424 
3425         mContext.startService(intent);
3426         assertTrue(mContext.bindService(intent, connection,
3427                 Context.BIND_ABOVE_CLIENT | Context.BIND_EXTERNAL_SERVICE));
3428 
3429         assertNotNull("Service should have started without crashing.", connection.get());
3430     }
3431 
3432     public void testObjectResize() throws Exception {
3433         Parcel p;
3434         IBinder b1 = new Binder();
3435         IBinder b2 = new Binder();
3436 
3437         p = Parcel.obtain();
3438         p.writeStrongBinder(b1);
3439         p.setDataSize(0);
3440         p.writeStrongBinder(b2);
3441 
3442         p.setDataPosition(0);
3443         assertEquals("Object in parcel should match the binder written after the resize", b2,
3444                 p.readStrongBinder());
3445         p.recycle();
3446 
3447         p = Parcel.obtain();
3448         p.writeStrongBinder(b1);
3449         final int secondBinderPos = p.dataPosition();
3450         p.writeStrongBinder(b1);
3451         p.setDataSize(secondBinderPos);
3452         p.writeStrongBinder(b2);
3453 
3454         p.setDataPosition(0);
3455         assertEquals("Object at the start of the parcel parcel should match the first binder", b1,
3456                 p.readStrongBinder());
3457         assertEquals("Object in parcel should match the binder written after the resize", b2,
3458                 p.readStrongBinder());
3459         p.recycle();
3460     }
3461 }
3462