1/*
2 * Copyright (C) 2007 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
17package android.os;
18
19import android.os.IInterface;
20import android.os.Parcel;
21import android.os.Parcelable;
22import android.test.suitebuilder.annotation.SmallTest;
23import com.google.android.collect.Lists;
24import junit.framework.TestCase;
25
26import java.util.List;
27
28public class AidlTest extends TestCase {
29
30    private IAidlTest mRemote;
31
32    @Override
33    protected void setUp() throws Exception {
34        super.setUp();
35        AidlObject mLocal = new AidlObject();
36        mRemote = IAidlTest.Stub.asInterface(mLocal);
37    }
38
39    private static boolean check(TestParcelable p, int n, String s) {
40        return p.mAnInt == n &&
41                ((s == null && p.mAString == null) || s.equals(p.mAString));
42    }
43
44    public static class TestParcelable implements Parcelable {
45        public int mAnInt;
46        public String mAString;
47
48        public TestParcelable() {
49        }
50
51        public TestParcelable(int i, String s) {
52            mAnInt = i;
53            mAString = s;
54        }
55
56        public int describeContents() {
57            return 0;
58        }
59
60        public void writeToParcel(Parcel parcel, int flags) {
61            parcel.writeInt(mAnInt);
62            parcel.writeString(mAString);
63        }
64
65        public void readFromParcel(Parcel parcel) {
66            mAnInt = parcel.readInt();
67            mAString = parcel.readString();
68        }
69
70        public static final Parcelable.Creator<TestParcelable> CREATOR
71                = new Parcelable.Creator<TestParcelable>() {
72            public TestParcelable createFromParcel(Parcel parcel) {
73                return new TestParcelable(parcel.readInt(),
74                        parcel.readString());
75            }
76
77            public TestParcelable[] newArray(int size) {
78                return new TestParcelable[size];
79            }
80        };
81
82        public String toString() {
83            return super.toString() + " {" + mAnInt + "/" + mAString + "}";
84        }
85    }
86
87    private static class AidlObject extends IAidlTest.Stub {
88        public IInterface queryLocalInterface(String descriptor) {
89            // overriding this to return null makes asInterface always
90            // generate a proxy
91            return null;
92        }
93
94        public int intMethod(int a) {
95            return a;
96        }
97
98        public TestParcelable parcelableIn(TestParcelable p) {
99            p.mAnInt++;
100            return p;
101        }
102
103        public TestParcelable parcelableOut(TestParcelable p) {
104            p.mAnInt = 44;
105            return p;
106        }
107
108        public TestParcelable parcelableInOut(TestParcelable p) {
109            p.mAnInt++;
110            return p;
111        }
112
113        public TestParcelable listParcelableLonger(List<TestParcelable> list, int index) {
114            list.add(list.get(index));
115            return list.get(index);
116        }
117
118        public int listParcelableShorter(List<TestParcelable> list, int index) {
119            list.remove(index);
120            return list.size();
121        }
122
123        public boolean[] booleanArray(boolean[] a0, boolean[] a1, boolean[] a2) {
124            for (int i = 0; i < a0.length && i < a2.length; i++) {
125                a2[i] = a0[i];
126            }
127            for (int i = 0; i < a0.length && i < a1.length; i++) {
128                a1[i] = a0[i];
129            }
130            return a0;
131        }
132
133        public char[] charArray(char[] a0, char[] a1, char[] a2) {
134            for (int i = 0; i < a0.length && i < a2.length; i++) {
135                a2[i] = a0[i];
136            }
137            for (int i = 0; i < a0.length && i < a1.length; i++) {
138                a1[i] = a0[i];
139            }
140            return a0;
141        }
142
143        public int[] intArray(int[] a0, int[] a1, int[] a2) {
144            for (int i = 0; i < a0.length && i < a2.length; i++) {
145                a2[i] = a0[i];
146            }
147            for (int i = 0; i < a0.length && i < a1.length; i++) {
148                a1[i] = a0[i];
149            }
150            return a0;
151        }
152
153        public long[] longArray(long[] a0, long[] a1, long[] a2) {
154            for (int i = 0; i < a0.length && i < a2.length; i++) {
155                a2[i] = a0[i];
156            }
157            for (int i = 0; i < a0.length && i < a1.length; i++) {
158                a1[i] = a0[i];
159            }
160            return a0;
161        }
162
163        public float[] floatArray(float[] a0, float[] a1, float[] a2) {
164            for (int i = 0; i < a0.length && i < a2.length; i++) {
165                a2[i] = a0[i];
166            }
167            for (int i = 0; i < a0.length && i < a1.length; i++) {
168                a1[i] = a0[i];
169            }
170            return a0;
171        }
172
173        public double[] doubleArray(double[] a0, double[] a1, double[] a2) {
174            for (int i = 0; i < a0.length && i < a2.length; i++) {
175                a2[i] = a0[i];
176            }
177            for (int i = 0; i < a0.length && i < a1.length; i++) {
178                a1[i] = a0[i];
179            }
180            return a0;
181        }
182
183        public String[] stringArray(String[] a0, String[] a1, String[] a2) {
184            for (int i = 0; i < a0.length && i < a2.length; i++) {
185                a2[i] = a0[i];
186            }
187            for (int i = 0; i < a0.length && i < a1.length; i++) {
188                a1[i] = a0[i];
189            }
190            return a0;
191        }
192
193        public TestParcelable[] parcelableArray(TestParcelable[] a0,
194                TestParcelable[] a1, TestParcelable[] a2) {
195            return null;
196        }
197
198        public void voidSecurityException() {
199            throw new SecurityException("gotcha!");
200        }
201
202        public int intSecurityException() {
203            throw new SecurityException("gotcha!");
204        }
205    }
206
207    @SmallTest
208    public void testInt() throws Exception {
209        int result = mRemote.intMethod(42);
210        assertEquals(42, result);
211    }
212
213    @SmallTest
214    public void testParcelableIn() throws Exception {
215        TestParcelable arg = new TestParcelable(43, "hi");
216        TestParcelable result = mRemote.parcelableIn(arg);
217        assertNotSame(arg, result);
218
219        assertEquals(43, arg.mAnInt);
220        assertEquals(44, result.mAnInt);
221    }
222
223    @SmallTest
224    public void testParcelableOut() throws Exception {
225        TestParcelable arg = new TestParcelable(43, "hi");
226        TestParcelable result = mRemote.parcelableOut(arg);
227        assertNotSame(arg, result);
228        assertEquals(44, arg.mAnInt);
229    }
230
231    @SmallTest
232    public void testParcelableInOut() throws Exception {
233        TestParcelable arg = new TestParcelable(43, "hi");
234        TestParcelable result = mRemote.parcelableInOut(arg);
235        assertNotSame(arg, result);
236        assertEquals(44, arg.mAnInt);
237    }
238
239    @SmallTest
240    public void testListParcelableLonger() throws Exception {
241        List<TestParcelable> list = Lists.newArrayList();
242        list.add(new TestParcelable(33, "asdf"));
243        list.add(new TestParcelable(34, "jkl;"));
244
245        TestParcelable result = mRemote.listParcelableLonger(list, 1);
246
247//        System.out.println("result=" + result);
248//        for (TestParcelable p : list) {
249//            System.out.println("longer: " + p);
250//        }
251
252        assertEquals("jkl;", result.mAString);
253        assertEquals(34, result.mAnInt);
254
255        assertEquals(3, list.size());
256        assertTrue("out parameter 0: " + list.get(0), check(list.get(0), 33, "asdf"));
257        assertTrue("out parameter 1: " + list.get(1), check(list.get(1), 34, "jkl;"));
258        assertTrue("out parameter 2: " + list.get(2), check(list.get(2), 34, "jkl;"));
259
260        assertNotSame(list.get(1), list.get(2));
261    }
262
263    @SmallTest
264    public void testListParcelableShorter() throws Exception {
265        List<TestParcelable> list = Lists.newArrayList();
266        list.add(new TestParcelable(33, "asdf"));
267        list.add(new TestParcelable(34, "jkl;"));
268        list.add(new TestParcelable(35, "qwerty"));
269
270        int result = mRemote.listParcelableShorter(list, 2);
271
272//        System.out.println("result=" + result);
273//        for (TestParcelable p : list) {
274//            System.out.println("shorter: " + p);
275//        }
276
277        assertEquals(2, result);
278        assertEquals(2, list.size());
279        assertTrue("out parameter 0: " + list.get(0), check(list.get(0), 33, "asdf"));
280        assertTrue("out parameter 1: " + list.get(1), check(list.get(1), 34, "jkl;"));
281
282        assertNotSame(list.get(0), list.get(1));
283    }
284
285    @SmallTest
286    public void testArrays() throws Exception {
287        // boolean
288        boolean[] b0 = new boolean[]{true};
289        boolean[] b1 = new boolean[]{false, true};
290        boolean[] b2 = new boolean[]{true, false, true};
291        boolean[] br = mRemote.booleanArray(b0, b1, b2);
292
293        assertEquals(1, br.length);
294        assertTrue(br[0]);
295
296        assertTrue(b1[0]);
297        assertFalse(b1[1]);
298
299        assertTrue(b2[0]);
300        assertFalse(b2[1]);
301        assertTrue(b2[2]);
302
303        // char
304        char[] c0 = new char[]{'a'};
305        char[] c1 = new char[]{'b', 'c'};
306        char[] c2 = new char[]{'d', 'e', 'f'};
307        char[] cr = mRemote.charArray(c0, c1, c2);
308
309        assertEquals(1, cr.length);
310        assertEquals('a', cr[0]);
311
312        assertEquals('a', c1[0]);
313        assertEquals('\0', c1[1]);
314
315        assertEquals('a', c2[0]);
316        assertEquals('e', c2[1]);
317        assertEquals('f', c2[2]);
318
319        // int
320        int[] i0 = new int[]{34};
321        int[] i1 = new int[]{38, 39};
322        int[] i2 = new int[]{42, 43, 44};
323        int[] ir = mRemote.intArray(i0, i1, i2);
324
325        assertEquals(1, ir.length);
326        assertEquals(34, ir[0]);
327
328        assertEquals(34, i1[0]);
329        assertEquals(0, i1[1]);
330
331        assertEquals(34, i2[0]);
332        assertEquals(43, i2[1]);
333        assertEquals(44, i2[2]);
334
335        // long
336        long[] l0 = new long[]{50};
337        long[] l1 = new long[]{51, 52};
338        long[] l2 = new long[]{53, 54, 55};
339        long[] lr = mRemote.longArray(l0, l1, l2);
340
341        assertEquals(1, lr.length);
342        assertEquals(50, lr[0]);
343
344        assertEquals(50, l1[0]);
345        assertEquals(0, l1[1]);
346
347        assertEquals(50, l2[0]);
348        assertEquals(54, l2[1]);
349        assertEquals(55, l2[2]);
350
351        // float
352        float[] f0 = new float[]{90.1f};
353        float[] f1 = new float[]{90.2f, 90.3f};
354        float[] f2 = new float[]{90.4f, 90.5f, 90.6f};
355        float[] fr = mRemote.floatArray(f0, f1, f2);
356
357        assertEquals(1, fr.length);
358        assertEquals(90.1f, fr[0]);
359
360        assertEquals(90.1f, f1[0]);
361        assertEquals(0f, f1[1], 0.0f);
362
363        assertEquals(90.1f, f2[0]);
364        assertEquals(90.5f, f2[1]);
365        assertEquals(90.6f, f2[2]);
366
367        // double
368        double[] d0 = new double[]{100.1};
369        double[] d1 = new double[]{100.2, 100.3};
370        double[] d2 = new double[]{100.4, 100.5, 100.6};
371        double[] dr = mRemote.doubleArray(d0, d1, d2);
372
373        assertEquals(1, dr.length);
374        assertEquals(100.1, dr[0]);
375
376        assertEquals(100.1, d1[0]);
377        assertEquals(0, d1[1], 0.0);
378
379        assertEquals(100.1, d2[0]);
380        assertEquals(100.5, d2[1]);
381        assertEquals(100.6, d2[2]);
382
383        // String
384        String[] s0 = new String[]{"s0[0]"};
385        String[] s1 = new String[]{"s1[0]", "s1[1]"};
386        String[] s2 = new String[]{"s2[0]", "s2[1]", "s2[2]"};
387        String[] sr = mRemote.stringArray(s0, s1, s2);
388
389        assertEquals(1, sr.length);
390        assertEquals("s0[0]", sr[0]);
391
392        assertEquals("s0[0]", s1[0]);
393        assertNull(s1[1]);
394
395        assertEquals("s0[0]", s2[0]);
396        assertEquals("s2[1]", s2[1]);
397        assertEquals("s2[2]", s2[2]);
398    }
399
400    @SmallTest
401    public void testVoidSecurityException() throws Exception {
402        boolean good = false;
403        try {
404            mRemote.voidSecurityException();
405        } catch (SecurityException e) {
406            good = true;
407        }
408        assertEquals(good, true);
409    }
410
411    @SmallTest
412    public void testIntSecurityException() throws Exception {
413        boolean good = false;
414        try {
415            mRemote.intSecurityException();
416        } catch (SecurityException e) {
417            good = true;
418        }
419        assertEquals(good, true);
420    }
421}
422
423