Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 import static org.assertj.core.api.Assertions.assertThat;
      4 import static org.junit.Assert.assertEquals;
      5 import static org.junit.Assert.assertTrue;
      6 import static org.junit.Assert.fail;
      7 
      8 import android.accounts.Account;
      9 import android.os.Bundle;
     10 import android.os.Parcel;
     11 import java.util.ArrayList;
     12 import java.util.Arrays;
     13 import java.util.HashMap;
     14 import java.util.List;
     15 import org.junit.After;
     16 import org.junit.Before;
     17 import org.junit.Ignore;
     18 import org.junit.Test;
     19 import org.junit.runner.RunWith;
     20 import org.robolectric.RobolectricTestRunner;
     21 
     22 @RunWith(RobolectricTestRunner.class)
     23 public class ShadowParcelTest {
     24 
     25   private Parcel parcel;
     26 
     27   @Before
     28   public void setup() {
     29     parcel = Parcel.obtain();
     30   }
     31 
     32   @After
     33   public void tearDown() {
     34     parcel.recycle();
     35   }
     36 
     37   @Test
     38   public void testObtain() {
     39     assertThat(parcel).isNotNull();
     40   }
     41 
     42   @Test
     43   public void testReadIntWhenEmpty() {
     44     assertThat(parcel.readInt()).isEqualTo(0);
     45   }
     46 
     47   @Test
     48   public void testReadLongWhenEmpty() {
     49     assertThat(parcel.readLong()).isEqualTo(0L);
     50   }
     51 
     52   @Test
     53   public void testReadStringWhenEmpty() {
     54     assertThat(parcel.readString()).isNull();
     55   }
     56 
     57   @Test
     58   public void testReadStrongBinderWhenEmpty() {
     59     assertThat(parcel.readStrongBinder()).isNull();
     60   }
     61 
     62   @Test
     63   public void testReadWriteSingleString() {
     64     String val = "test";
     65     parcel.writeString(val);
     66     parcel.setDataPosition(0);
     67     assertThat(parcel.readString()).isEqualTo(val);
     68   }
     69 
     70   @Test
     71   public void testWriteNullString() {
     72     parcel.writeString(null);
     73     parcel.setDataPosition(0);
     74     assertThat(parcel.readString()).isNull();
     75   }
     76 
     77   @Test
     78   public void testWriteEmptyString() {
     79     parcel.writeString("");
     80     parcel.setDataPosition(0);
     81     assertThat(parcel.readString()).isEmpty();
     82   }
     83 
     84   @Test
     85   public void testReadWriteMultipleStrings() {
     86     for (int i = 0; i < 10; ++i) {
     87       parcel.writeString(Integer.toString(i));
     88     }
     89     parcel.setDataPosition(0);
     90     for (int i = 0; i < 10; ++i) {
     91       assertThat(parcel.readString()).isEqualTo(Integer.toString(i));
     92     }
     93     // now try to read past the number of items written and see what happens
     94     assertThat(parcel.readString()).isNull();
     95   }
     96 
     97   @Test
     98   public void testReadWriteSingleInt() {
     99     int val = 5;
    100     parcel.writeInt(val);
    101     parcel.setDataPosition(0);
    102     assertThat(parcel.readInt()).isEqualTo(val);
    103   }
    104 
    105   @Test
    106   public void testReadWriteIntArray() throws Exception {
    107     final int[] ints = { 1, 2 };
    108     parcel.writeIntArray(ints);
    109     parcel.setDataPosition(0);
    110     final int[] ints2 = new int[ints.length];
    111     parcel.readIntArray(ints2);
    112     assertTrue(Arrays.equals(ints, ints2));
    113   }
    114 
    115   @Test
    116   public void testWriteAndCreateNullIntArray() throws Exception {
    117     parcel.writeIntArray(null);
    118     parcel.setDataPosition(0);
    119     assertThat(parcel.createIntArray()).isNull();
    120   }
    121 
    122   @Test
    123   public void testReadWriteLongArray() throws Exception {
    124     final long[] longs = { 1, 2 };
    125     parcel.writeLongArray(longs);
    126     parcel.setDataPosition(0);
    127     final long[] longs2 = new long[longs.length];
    128     parcel.readLongArray(longs2);
    129     assertTrue(Arrays.equals(longs, longs2));
    130   }
    131 
    132   @Test
    133   public void testWriteAndCreateNullLongArray() throws Exception {
    134     parcel.writeLongArray(null);
    135     parcel.setDataPosition(0);
    136     assertThat(parcel.createLongArray()).isNull();
    137   }
    138 
    139   @Test
    140   public void testReadWriteSingleFloat() {
    141     float val = 5.2f;
    142     parcel.writeFloat(val);
    143     parcel.setDataPosition(0);
    144     assertThat(parcel.readFloat()).isEqualTo(val);
    145   }
    146 
    147   @Test
    148   public void testReadWriteFloatArray() throws Exception {
    149     final float[] floats = { 1.1f, 2.0f };
    150     parcel.writeFloatArray(floats);
    151     parcel.setDataPosition(0);
    152     final float[] floats2 = new float[floats.length];
    153     parcel.readFloatArray(floats2);
    154     assertTrue(Arrays.equals(floats, floats2));
    155   }
    156 
    157   @Test
    158   public void testWriteAndCreateNullFloatArray() throws Exception {
    159     parcel.writeFloatArray(null);
    160     parcel.setDataPosition(0);
    161     assertThat(parcel.createFloatArray()).isNull();
    162   }
    163 
    164   @Test
    165   public void testReadWriteDoubleArray() throws Exception {
    166     final double[] doubles = { 1.1f, 2.0f };
    167     parcel.writeDoubleArray(doubles);
    168     parcel.setDataPosition(0);
    169     final double[] doubles2 = new double[doubles.length];
    170     parcel.readDoubleArray(doubles2);
    171     assertTrue(Arrays.equals(doubles, doubles2));
    172   }
    173 
    174   @Test
    175   public void testWriteAndCreateNullDoubleArray() throws Exception {
    176     parcel.writeDoubleArray(null);
    177     parcel.setDataPosition(0);
    178     assertThat(parcel.createDoubleArray()).isNull();
    179   }
    180 
    181   @Test
    182   public void testReadWriteStringArray() throws Exception {
    183     final String[] strings = { "foo", "bar" };
    184     parcel.writeStringArray(strings);
    185     parcel.setDataPosition(0);
    186     final String[] strings2 = new String[strings.length];
    187     parcel.readStringArray(strings2);
    188     assertTrue(Arrays.equals(strings, strings2));
    189   }
    190 
    191   @Test
    192   public void testWriteAndCreateNullStringArray() throws Exception {
    193     parcel.writeStringArray(null);
    194     parcel.setDataPosition(0);
    195     assertThat(parcel.createStringArray()).isNull();
    196   }
    197 
    198   @Test
    199   public void testWriteAndCreateByteArray() {
    200     byte[] bytes = new byte[] { -1, 2, 3, 127 };
    201     parcel.writeByteArray(bytes);
    202     parcel.setDataPosition(0);
    203     byte[] actualBytes = parcel.createByteArray();
    204     assertTrue(Arrays.equals(bytes, actualBytes));
    205   }
    206 
    207   @Test
    208   public void testWriteAndCreateNullByteArray() throws Exception {
    209     parcel.writeByteArray(null);
    210     parcel.setDataPosition(0);
    211     assertThat(parcel.createByteArray()).isNull();
    212   }
    213 
    214   @Test
    215   public void testWriteAndCreateByteArray_lengthZero() {
    216     byte[] bytes = new byte[] {};
    217     parcel.writeByteArray(bytes);
    218     parcel.setDataPosition(0);
    219     byte[] actualBytes = parcel.createByteArray();
    220     assertTrue(Arrays.equals(bytes, actualBytes));
    221   }
    222 
    223   @Test
    224   public void testReadWriteMultipleInts() {
    225     for (int i = 0; i < 10; ++i) {
    226       parcel.writeInt(i);
    227     }
    228     parcel.setDataPosition(0);
    229     for (int i = 0; i < 10; ++i) {
    230       assertThat(parcel.readInt()).isEqualTo(i);
    231     }
    232     // now try to read past the number of items written and see what happens
    233     assertThat(parcel.readInt()).isEqualTo(0);
    234   }
    235 
    236   @Test
    237   public void testReadWriteSingleByte() {
    238     byte val = 1;
    239     parcel.writeByte(val);
    240     parcel.setDataPosition(0);
    241     assertThat(parcel.readByte()).isEqualTo(val);
    242   }
    243 
    244   @Test
    245   public void testReadWriteMultipleBytes() {
    246     for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
    247       parcel.writeByte(i);
    248     }
    249     parcel.setDataPosition(0);
    250     for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
    251       assertThat(parcel.readByte()).isEqualTo(i);
    252     }
    253     // now try to read past the number of items written and see what happens
    254     assertThat(parcel.readByte()).isEqualTo((byte) 0);
    255   }
    256 
    257   @Test
    258   public void testReadWriteStringInt() {
    259     for (int i = 0; i < 10; ++i) {
    260       parcel.writeString(Integer.toString(i));
    261       parcel.writeInt(i);
    262     }
    263     parcel.setDataPosition(0);
    264     for (int i = 0; i < 10; ++i) {
    265       assertThat(parcel.readString()).isEqualTo(Integer.toString(i));
    266       assertThat(parcel.readInt()).isEqualTo(i);
    267     }
    268     // now try to read past the number of items written and see what happens
    269     assertThat(parcel.readString()).isNull();
    270     assertThat(parcel.readInt()).isEqualTo(0);
    271   }
    272 
    273   @Test(expected = ClassCastException.class)
    274   public void testWriteStringReadInt() {
    275     String val = "test";
    276     parcel.writeString(val);
    277     parcel.setDataPosition(0);
    278     parcel.readInt();
    279   }
    280 
    281   @Test(expected = ClassCastException.class)
    282   public void testWriteIntReadString() {
    283     int val = 9;
    284     parcel.writeInt(val);
    285     parcel.setDataPosition(0);
    286     parcel.readString();
    287   }
    288 
    289   @Test
    290   public void testReadWriteSingleLong() {
    291     long val = 5;
    292     parcel.writeLong(val);
    293     parcel.setDataPosition(0);
    294     assertThat(parcel.readLong()).isEqualTo(val);
    295   }
    296 
    297   @Test
    298   public void testReadWriteMultipleLongs() {
    299     for (long i = 0; i < 10; ++i) {
    300       parcel.writeLong(i);
    301     }
    302     parcel.setDataPosition(0);
    303     for (long i = 0; i < 10; ++i) {
    304       assertThat(parcel.readLong()).isEqualTo(i);
    305     }
    306     // now try to read past the number of items written and see what happens
    307     assertThat(parcel.readLong()).isEqualTo(0L);
    308   }
    309 
    310   @Test
    311   public void testReadWriteStringLong() {
    312     for (long i = 0; i < 10; ++i) {
    313       parcel.writeString(Long.toString(i));
    314       parcel.writeLong(i);
    315     }
    316     parcel.setDataPosition(0);
    317     for (long i = 0; i < 10; ++i) {
    318       assertThat(parcel.readString()).isEqualTo(Long.toString(i));
    319       assertThat(parcel.readLong()).isEqualTo(i);
    320     }
    321     // now try to read past the number of items written and see what happens
    322     assertThat(parcel.readString()).isNull();
    323     assertThat(parcel.readLong()).isEqualTo(0L);
    324   }
    325 
    326   @Test(expected = ClassCastException.class)
    327   public void testWriteStringReadLong() {
    328     String val = "test";
    329     parcel.writeString(val);
    330     parcel.setDataPosition(0);
    331     parcel.readLong();
    332   }
    333 
    334   @Test(expected = ClassCastException.class)
    335   public void testWriteLongReadString() {
    336     long val = 9;
    337     parcel.writeLong(val);
    338     parcel.setDataPosition(0);
    339     parcel.readString();
    340   }
    341 
    342   @Test
    343   public void testReadWriteParcelable() {
    344     Account a1 = new Account("name", "type");
    345     parcel.writeParcelable(a1, 0);
    346     parcel.setDataPosition(0);
    347 
    348     Account a2 = parcel.readParcelable(Account.class.getClassLoader());
    349     assertEquals(a1, a2);
    350   }
    351 
    352   @Test
    353   public void testReadWriteBundle() {
    354     Bundle b1 = new Bundle();
    355     b1.putString("hello", "world");
    356     parcel.writeBundle(b1);
    357     parcel.setDataPosition(0);
    358     Bundle b2 = parcel.readBundle();
    359 
    360     assertEquals("world", b2.getString("hello"));
    361 
    362     parcel.setDataPosition(0);
    363     parcel.writeBundle(b1);
    364     parcel.setDataPosition(0);
    365     b2 = parcel.readBundle(null /* ClassLoader */);
    366     assertEquals("world", b2.getString("hello"));
    367   }
    368 
    369   @Test
    370   public void testCreateStringArrayList() throws Exception {
    371     parcel.writeStringList(Arrays.asList("str1", "str2"));
    372     parcel.setDataPosition(0);
    373 
    374     List<String> actual = parcel.createStringArrayList();
    375     assertEquals(2, actual.size());
    376     assertEquals("str1", actual.get(0));
    377     assertEquals("str2", actual.get(1));
    378   }
    379 
    380   @Test
    381   public void testWriteTypedListAndCreateTypedArrayList() throws Exception {
    382     TestParcelable normal = new TestParcelable(23);
    383     ArrayList<TestParcelable> normals = new ArrayList<>();
    384     normals.add(normal);
    385 
    386     parcel.writeTypedList(normals);
    387     parcel.setDataPosition(0);
    388     List<org.robolectric.shadows.TestParcelable> rehydrated = parcel
    389         .createTypedArrayList(TestParcelable.CREATOR);
    390 
    391     assertEquals(1, rehydrated.size());
    392     assertEquals(23, rehydrated.get(0).contents);
    393   }
    394 
    395   @Test
    396   public void testReadAndWriteStringList() throws Exception {
    397     ArrayList<String> original = new ArrayList<>();
    398     List<String> rehydrated = new ArrayList<>();
    399     original.add("str1");
    400     original.add("str2");
    401     parcel.writeStringList(original);
    402     parcel.setDataPosition(0);
    403     parcel.readStringList(rehydrated);
    404     assertEquals(2, rehydrated.size());
    405     assertEquals("str1", rehydrated.get(0));
    406     assertEquals("str2", rehydrated.get(1));
    407   }
    408 
    409   @Test
    410   public void testReadWriteMap() throws Exception {
    411     HashMap<String, String> original = new HashMap<>();
    412     original.put("key", "value");
    413     parcel.writeMap(original);
    414     parcel.setDataPosition(0);
    415     HashMap<String, String> rehydrated = parcel.readHashMap(null);
    416 
    417     assertEquals("value", rehydrated.get("key"));
    418   }
    419 
    420   @Test
    421   public void testCreateStringArray() {
    422     String[] strs = { "a1", "b2" };
    423     parcel.writeStringArray(strs);
    424     parcel.setDataPosition(0);
    425     String[] newStrs = parcel.createStringArray();
    426     assertTrue(Arrays.equals(strs, newStrs));
    427   }
    428 
    429   @Test
    430   public void testDataPositionAfterSomeWrites() {
    431     parcel.writeInt(1);
    432     assertThat(parcel.dataPosition()).isEqualTo(4);
    433 
    434     parcel.writeFloat(5);
    435     assertThat(parcel.dataPosition()).isEqualTo(8);
    436 
    437     parcel.writeDouble(37);
    438     assertThat(parcel.dataPosition()).isEqualTo(16);
    439   }
    440 
    441   @Test
    442   public void testDataPositionAfterSomeReads() {
    443     parcel.writeInt(1);
    444     parcel.writeFloat(5);
    445     parcel.writeDouble(37);
    446     parcel.setDataPosition(0);
    447 
    448     parcel.readInt();
    449     assertThat(parcel.dataPosition()).isEqualTo(4);
    450 
    451     parcel.readFloat();
    452     assertThat(parcel.dataPosition()).isEqualTo(8);
    453 
    454     parcel.readDouble();
    455     assertThat(parcel.dataPosition()).isEqualTo(16);
    456   }
    457 
    458   @Test
    459   public void testDataSizeAfterSomeWrites() {
    460     parcel.writeInt(1);
    461     assertThat(parcel.dataSize()).isEqualTo(4);
    462 
    463     parcel.writeFloat(5);
    464     assertThat(parcel.dataSize()).isEqualTo(8);
    465 
    466     parcel.writeDouble(37);
    467     assertThat(parcel.dataSize()).isEqualTo(16);
    468   }
    469 
    470   @Test
    471   public void testDataAvail() {
    472     parcel.writeInt(1);
    473     parcel.writeFloat(5);
    474     parcel.writeDouble(6);
    475     parcel.setDataPosition(4);
    476 
    477     assertThat(parcel.dataAvail()).isEqualTo(12);
    478   }
    479 
    480   @Test
    481   public void testSetDataPositionIntoMiddleOfParcel() {
    482     parcel.writeInt(1);
    483     parcel.writeFloat(5);
    484     parcel.writeDouble(6);
    485     parcel.setDataPosition(4);
    486 
    487     assertThat(parcel.readFloat()).isEqualTo(5);
    488   }
    489 
    490   @Test
    491   public void testSetDataPositionToEmptyString() {
    492     parcel.writeString("");
    493     parcel.setDataPosition(parcel.dataPosition());
    494     parcel.writeString("something else");
    495 
    496     parcel.setDataPosition(0);
    497     assertThat(parcel.readString()).isEmpty();
    498   }
    499 
    500   @Test
    501   public void testAppendFrom() {
    502     parcel.writeInt(1);
    503     parcel.writeInt(2);
    504     parcel.writeInt(3);
    505     parcel.writeInt(4);
    506 
    507     Parcel parcel2 = Parcel.obtain();
    508     parcel2.appendFrom(parcel, 4, 8);
    509     parcel2.setDataPosition(0);
    510 
    511     assertThat(parcel2.readInt()).isEqualTo(2);
    512     assertThat(parcel2.readInt()).isEqualTo(3);
    513     assertThat(parcel2.dataSize()).isEqualTo(8);
    514   }
    515 
    516   @Test
    517   public void testMarshallAndUnmarshall() {
    518     parcel.writeInt(1);
    519     parcel.writeString("hello");
    520     parcel.writeDouble(25);
    521     parcel.writeFloat(1.25f);
    522     parcel.writeByte((byte) 0xAF);
    523 
    524     byte[] rawBytes = parcel.marshall();
    525     Parcel parcel2 = Parcel.obtain();
    526     parcel2.unmarshall(rawBytes, 0, rawBytes.length);
    527 
    528     assertThat(parcel2.readInt()).isEqualTo(1);
    529     assertThat(parcel2.readString()).isEqualTo("hello");
    530     assertThat(parcel2.readDouble()).isEqualTo(25.0);
    531     assertThat(parcel2.readFloat()).isEqualTo(1.25f);
    532     assertThat(parcel2.readByte()).isEqualTo((byte) 0xAF);
    533   }
    534 
    535   @Test @Ignore("Needs implementation in ShadowParcel.ByteBuffer")
    536   public void testSetDataSize() {
    537     parcel.setDataSize(8);
    538     assertThat(parcel.dataSize()).isEqualTo(8);
    539   }
    540 
    541   @Test @Ignore("Needs implementation in ShadowParcel.ByteBuffer")
    542   public void testSetDataCapacity() {
    543     parcel.setDataCapacity(8);
    544     assertThat(parcel.dataCapacity()).isEqualTo(8);
    545   }
    546 
    547   @Test
    548   public void testWriteAndEnforceCompatibleInterface() {
    549     parcel.writeInterfaceToken("com.example.IMyInterface");
    550     parcel.setDataPosition(0);
    551     parcel.enforceInterface("com.example.IMyInterface");
    552     // Nothing explodes
    553   }
    554 
    555   @Test
    556   public void testWriteAndEnforceIncompatibleInterface() {
    557     parcel.writeInterfaceToken("com.example.Derp");
    558     parcel.setDataPosition(0);
    559     try {
    560       parcel.enforceInterface("com.example.IMyInterface");
    561       fail("Expected SecurityException");
    562     } catch (SecurityException e) {
    563       // Expected
    564     }
    565   }
    566 }
    567