JavaBridgeArrayCoercionTest.java revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser;
6
7import android.test.suitebuilder.annotation.SmallTest;
8
9import org.chromium.base.test.util.DisabledTest;
10import org.chromium.base.test.util.Feature;
11
12/**
13 * Part of the test suite for the Java Bridge. This class tests that we correctly convert
14 * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects.
15 *
16 * The conversions should follow
17 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
18 * which the implementation differs from the spec are marked with
19 * LIVECONNECT_COMPLIANCE.
20 * FIXME: Consider making our implementation more compliant, if it will not
21 * break backwards-compatibility. See b/4408210.
22 */
23public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
24    private class TestObject extends Controller {
25        private final Object mObjectInstance;
26        private final CustomType mCustomTypeInstance;
27
28        private boolean[] mBooleanArray;
29        private byte[] mByteArray;
30        private char[] mCharArray;
31        private short[] mShortArray;
32        private int[] mIntArray;
33        private long[] mLongArray;
34        private float[] mFloatArray;
35        private double[] mDoubleArray;
36        private String[] mStringArray;
37        private Object[] mObjectArray;
38        private CustomType[] mCustomTypeArray;
39
40        public TestObject() {
41            mObjectInstance = new Object();
42            mCustomTypeInstance = new CustomType();
43        }
44
45        public Object getObjectInstance() {
46            return mObjectInstance;
47        }
48        public CustomType getCustomTypeInstance() {
49            return mCustomTypeInstance;
50        }
51
52        public synchronized void setBooleanArray(boolean[] x) {
53            mBooleanArray = x;
54            notifyResultIsReady();
55        }
56        public synchronized void setByteArray(byte[] x) {
57            mByteArray = x;
58            notifyResultIsReady();
59        }
60        public synchronized void setCharArray(char[] x) {
61            mCharArray = x;
62            notifyResultIsReady();
63        }
64        public synchronized void setShortArray(short[] x) {
65            mShortArray = x;
66            notifyResultIsReady();
67        }
68        public synchronized void setIntArray(int[] x) {
69            mIntArray = x;
70            notifyResultIsReady();
71        }
72        public synchronized void setLongArray(long[] x) {
73            mLongArray = x;
74            notifyResultIsReady();
75        }
76        public synchronized void setFloatArray(float[] x) {
77            mFloatArray = x;
78            notifyResultIsReady();
79        }
80        public synchronized void setDoubleArray(double[] x) {
81            mDoubleArray = x;
82            notifyResultIsReady();
83        }
84        public synchronized void setStringArray(String[] x) {
85            mStringArray = x;
86            notifyResultIsReady();
87        }
88        public synchronized void setObjectArray(Object[] x) {
89            mObjectArray = x;
90            notifyResultIsReady();
91        }
92        public synchronized void setCustomTypeArray(CustomType[] x) {
93            mCustomTypeArray = x;
94            notifyResultIsReady();
95        }
96
97        public synchronized boolean[] waitForBooleanArray() {
98            waitForResult();
99            return mBooleanArray;
100        }
101        public synchronized byte[] waitForByteArray() {
102            waitForResult();
103            return mByteArray;
104        }
105        public synchronized char[] waitForCharArray() {
106            waitForResult();
107            return mCharArray;
108        }
109        public synchronized short[] waitForShortArray() {
110            waitForResult();
111            return mShortArray;
112        }
113        public synchronized int[] waitForIntArray() {
114            waitForResult();
115            return mIntArray;
116        }
117        public synchronized long[] waitForLongArray() {
118            waitForResult();
119            return mLongArray;
120        }
121        public synchronized float[] waitForFloatArray() {
122            waitForResult();
123            return mFloatArray;
124        }
125        public synchronized double[] waitForDoubleArray() {
126            waitForResult();
127            return mDoubleArray;
128        }
129        public synchronized String[] waitForStringArray() {
130            waitForResult();
131            return mStringArray;
132        }
133        public synchronized Object[] waitForObjectArray() {
134            waitForResult();
135            return mObjectArray;
136        }
137        public synchronized CustomType[] waitForCustomTypeArray() {
138            waitForResult();
139            return mCustomTypeArray;
140        }
141    }
142
143    // Two custom types used when testing passing objects.
144    private static class CustomType {
145    }
146
147    private TestObject mTestObject;
148
149    @Override
150    protected void setUp() throws Exception {
151        super.setUp();
152        mTestObject = new TestObject();
153        setUpContentView(mTestObject, "testObject");
154    }
155
156    // Note that all tests use a single element array for simplicity. We test
157    // multiple elements elsewhere.
158
159    // Test passing an array of JavaScript numbers in the int32 range to a
160    // method which takes a Java array.
161    @SmallTest
162    @Feature({"AndroidWebView", "Android-JavaBridge"})
163    public void testPassNumberInt32() throws Throwable {
164        executeJavaScript("testObject.setBooleanArray([0]);");
165        assertFalse(mTestObject.waitForBooleanArray()[0]);
166        // LIVECONNECT_COMPLIANCE: Should convert to boolean.
167        executeJavaScript("testObject.setBooleanArray([42]);");
168        assertFalse(mTestObject.waitForBooleanArray()[0]);
169
170        executeJavaScript("testObject.setByteArray([42]);");
171        assertEquals(42, mTestObject.waitForByteArray()[0]);
172
173        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
174        executeJavaScript("testObject.setCharArray([42]);");
175        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
176
177        executeJavaScript("testObject.setShortArray([42]);");
178        assertEquals(42, mTestObject.waitForShortArray()[0]);
179
180        executeJavaScript("testObject.setIntArray([42]);");
181        assertEquals(42, mTestObject.waitForIntArray()[0]);
182
183        executeJavaScript("testObject.setLongArray([42]);");
184        assertEquals(42L, mTestObject.waitForLongArray()[0]);
185
186        executeJavaScript("testObject.setFloatArray([42]);");
187        assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
188
189        executeJavaScript("testObject.setDoubleArray([42]);");
190        assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
191
192        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
193        executeJavaScript("testObject.setObjectArray([42]);");
194        assertNull(mTestObject.waitForObjectArray());
195
196        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
197        executeJavaScript("testObject.setStringArray([42]);");
198        assertNull(mTestObject.waitForStringArray()[0]);
199
200        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
201        executeJavaScript("testObject.setCustomTypeArray([42]);");
202        assertNull(mTestObject.waitForCustomTypeArray());
203    }
204
205    // Test passing an array of JavaScript numbers in the double range to a
206    // method which takes a Java array.
207    @SmallTest
208    @Feature({"AndroidWebView", "Android-JavaBridge"})
209    public void testPassNumberDouble() throws Throwable {
210        // LIVECONNECT_COMPLIANCE: Should convert to boolean.
211        executeJavaScript("testObject.setBooleanArray([42.1]);");
212        assertFalse(mTestObject.waitForBooleanArray()[0]);
213
214        executeJavaScript("testObject.setByteArray([42.1]);");
215        assertEquals(42, mTestObject.waitForByteArray()[0]);
216
217        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
218        executeJavaScript("testObject.setCharArray([42.1]);");
219        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
220
221        executeJavaScript("testObject.setShortArray([42.1]);");
222        assertEquals(42, mTestObject.waitForShortArray()[0]);
223
224        executeJavaScript("testObject.setIntArray([42.1]);");
225        assertEquals(42, mTestObject.waitForIntArray()[0]);
226
227        executeJavaScript("testObject.setLongArray([42.1]);");
228        assertEquals(42L, mTestObject.waitForLongArray()[0]);
229
230        executeJavaScript("testObject.setFloatArray([42.1]);");
231        assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
232
233        executeJavaScript("testObject.setDoubleArray([42.1]);");
234        assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
235
236        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
237        executeJavaScript("testObject.setObjectArray([42.1]);");
238        assertNull(mTestObject.waitForObjectArray());
239
240        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
241        executeJavaScript("testObject.setStringArray([42.1]);");
242        assertNull(mTestObject.waitForStringArray()[0]);
243
244        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
245        executeJavaScript("testObject.setCustomTypeArray([42.1]);");
246        assertNull(mTestObject.waitForCustomTypeArray());
247    }
248
249    // Test passing an array of JavaScript NaN values to a method which takes a
250    // Java array.
251    @SmallTest
252    @Feature({"AndroidWebView", "Android-JavaBridge"})
253    public void testPassNumberNaN() throws Throwable {
254        executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
255        assertFalse(mTestObject.waitForBooleanArray()[0]);
256
257        executeJavaScript("testObject.setByteArray([Number.NaN]);");
258        assertEquals(0, mTestObject.waitForByteArray()[0]);
259
260        executeJavaScript("testObject.setCharArray([Number.NaN]);");
261        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
262
263        executeJavaScript("testObject.setShortArray([Number.NaN]);");
264        assertEquals(0, mTestObject.waitForShortArray()[0]);
265
266        executeJavaScript("testObject.setIntArray([Number.NaN]);");
267        assertEquals(0, mTestObject.waitForIntArray()[0]);
268
269        executeJavaScript("testObject.setLongArray([Number.NaN]);");
270        assertEquals(0L, mTestObject.waitForLongArray()[0]);
271
272        executeJavaScript("testObject.setFloatArray([Number.NaN]);");
273        assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
274
275        executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
276        assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
277
278        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
279        executeJavaScript("testObject.setObjectArray([Number.NaN]);");
280        assertNull(mTestObject.waitForObjectArray());
281
282        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
283        executeJavaScript("testObject.setStringArray([Number.NaN]);");
284        assertNull(mTestObject.waitForStringArray()[0]);
285
286        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
287        executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
288        assertNull(mTestObject.waitForCustomTypeArray());
289    }
290
291    // Test passing an array of JavaScript infinity values to a method which
292    // takes a Java array.
293    @SmallTest
294    @Feature({"AndroidWebView", "Android-JavaBridge"})
295    public void testPassNumberInfinity() throws Throwable {
296        executeJavaScript("testObject.setBooleanArray([Infinity]);");
297        assertFalse(mTestObject.waitForBooleanArray()[0]);
298
299        executeJavaScript("testObject.setByteArray([Infinity]);");
300        assertEquals(-1, mTestObject.waitForByteArray()[0]);
301
302        // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
303        executeJavaScript("testObject.setCharArray([Infinity]);");
304        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
305
306        executeJavaScript("testObject.setShortArray([Infinity]);");
307        assertEquals(-1, mTestObject.waitForShortArray()[0]);
308
309        executeJavaScript("testObject.setIntArray([Infinity]);");
310        assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
311
312        executeJavaScript("testObject.setLongArray([Infinity]);");
313        assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]);
314
315        executeJavaScript("testObject.setFloatArray([Infinity]);");
316        assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
317
318        executeJavaScript("testObject.setDoubleArray([Infinity]);");
319        assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
320
321        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
322        executeJavaScript("testObject.setObjectArray([Infinity]);");
323        assertNull(mTestObject.waitForObjectArray());
324
325        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
326        executeJavaScript("testObject.setStringArray([Infinity]);");
327        assertNull(mTestObject.waitForStringArray()[0]);
328
329        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
330        executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
331        assertNull(mTestObject.waitForCustomTypeArray());
332    }
333
334    // Test passing an array of JavaScript boolean values to a method which
335    // takes a Java array.
336    @SmallTest
337    @Feature({"AndroidWebView", "Android-JavaBridge"})
338    public void testPassBoolean() throws Throwable {
339        executeJavaScript("testObject.setBooleanArray([true]);");
340        assertTrue(mTestObject.waitForBooleanArray()[0]);
341        executeJavaScript("testObject.setBooleanArray([false]);");
342        assertFalse(mTestObject.waitForBooleanArray()[0]);
343
344        // LIVECONNECT_COMPLIANCE: Should be 1.
345        executeJavaScript("testObject.setByteArray([true]);");
346        assertEquals(0, mTestObject.waitForByteArray()[0]);
347        executeJavaScript("testObject.setByteArray([false]);");
348        assertEquals(0, mTestObject.waitForByteArray()[0]);
349
350        // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
351        executeJavaScript("testObject.setCharArray([true]);");
352        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
353        executeJavaScript("testObject.setCharArray([false]);");
354        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
355
356        // LIVECONNECT_COMPLIANCE: Should be 1.
357        executeJavaScript("testObject.setShortArray([true]);");
358        assertEquals(0, mTestObject.waitForShortArray()[0]);
359        executeJavaScript("testObject.setShortArray([false]);");
360        assertEquals(0, mTestObject.waitForShortArray()[0]);
361
362        // LIVECONNECT_COMPLIANCE: Should be 1.
363        executeJavaScript("testObject.setIntArray([true]);");
364        assertEquals(0, mTestObject.waitForIntArray()[0]);
365        executeJavaScript("testObject.setIntArray([false]);");
366        assertEquals(0, mTestObject.waitForIntArray()[0]);
367
368        // LIVECONNECT_COMPLIANCE: Should be 1.
369        executeJavaScript("testObject.setLongArray([true]);");
370        assertEquals(0L, mTestObject.waitForLongArray()[0]);
371        executeJavaScript("testObject.setLongArray([false]);");
372        assertEquals(0L, mTestObject.waitForLongArray()[0]);
373
374        // LIVECONNECT_COMPLIANCE: Should be 1.0.
375        executeJavaScript("testObject.setFloatArray([true]);");
376        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
377        executeJavaScript("testObject.setFloatArray([false]);");
378        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
379
380        // LIVECONNECT_COMPLIANCE: Should be 1.0.
381        executeJavaScript("testObject.setDoubleArray([true]);");
382        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
383        executeJavaScript("testObject.setDoubleArray([false]);");
384        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
385
386        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
387        executeJavaScript("testObject.setObjectArray([true]);");
388        assertNull(mTestObject.waitForObjectArray());
389
390        // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
391        executeJavaScript("testObject.setStringArray([true]);");
392        assertNull(mTestObject.waitForStringArray()[0]);
393
394        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
395        executeJavaScript("testObject.setCustomTypeArray([true]);");
396        assertNull(mTestObject.waitForCustomTypeArray());
397    }
398
399    // Test passing an array of JavaScript strings to a method which takes a
400    // Java array.
401    @SmallTest
402    @Feature({"AndroidWebView", "Android-JavaBridge"})
403    public void testPassString() throws Throwable {
404        // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
405        executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
406        assertFalse(mTestObject.waitForBooleanArray()[0]);
407
408        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
409        executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
410        assertEquals(0, mTestObject.waitForByteArray()[0]);
411
412        // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
413        executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
414        assertEquals(0, mTestObject.waitForCharArray()[0]);
415
416        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
417        executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
418        assertEquals(0, mTestObject.waitForShortArray()[0]);
419
420        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
421        executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
422        assertEquals(0, mTestObject.waitForIntArray()[0]);
423
424        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
425        executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
426        assertEquals(0L, mTestObject.waitForLongArray()[0]);
427
428        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
429        executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
430        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
431
432        // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
433        executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
434        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
435
436        // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
437        executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
438        assertNull(mTestObject.waitForObjectArray());
439
440        executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
441        assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
442
443        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
444        executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
445        assertNull(mTestObject.waitForCustomTypeArray());
446    }
447
448    // Test passing an array of JavaScript objects to a method which takes a
449    // Java array.
450    @SmallTest
451    @Feature({"AndroidWebView", "Android-JavaBridge"})
452    public void testPassJavaScriptObject() throws Throwable {
453        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
454        executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
455        assertFalse(mTestObject.waitForBooleanArray()[0]);
456
457        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
458        executeJavaScript("testObject.setByteArray([{foo: 42}]);");
459        assertEquals(0, mTestObject.waitForByteArray()[0]);
460
461        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
462        executeJavaScript("testObject.setCharArray([{foo: 42}]);");
463        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
464
465        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
466        executeJavaScript("testObject.setShortArray([{foo: 42}]);");
467        assertEquals(0, mTestObject.waitForShortArray()[0]);
468
469        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
470        executeJavaScript("testObject.setIntArray([{foo: 42}]);");
471        assertEquals(0, mTestObject.waitForIntArray()[0]);
472
473        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
474        executeJavaScript("testObject.setLongArray([{foo: 42}]);");
475        assertEquals(0L, mTestObject.waitForLongArray()[0]);
476
477        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
478        executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
479        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
480
481        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
482        executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
483        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
484
485        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
486        executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
487        assertNull(mTestObject.waitForObjectArray());
488
489        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
490        executeJavaScript("testObject.setStringArray([{foo: 42}]);");
491        assertNull(mTestObject.waitForStringArray()[0]);
492
493        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
494        executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
495        assertNull(mTestObject.waitForCustomTypeArray());
496    }
497
498    // Test passing an array of Java objects to a method which takes a Java
499    // array.
500    @SmallTest
501    @Feature({"AndroidWebView", "Android-JavaBridge"})
502    public void testPassJavaObject() throws Throwable {
503        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
504        executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
505        assertFalse(mTestObject.waitForBooleanArray()[0]);
506
507        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
508        executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
509        assertEquals(0, mTestObject.waitForByteArray()[0]);
510
511        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
512        executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
513        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
514
515        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
516        executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
517        assertEquals(0, mTestObject.waitForShortArray()[0]);
518
519        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
520        executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
521        assertEquals(0, mTestObject.waitForIntArray()[0]);
522
523        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
524        executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
525        assertEquals(0L, mTestObject.waitForLongArray()[0]);
526
527        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
528        executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
529        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
530
531        // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
532        executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
533        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
534
535        // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
536        executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
537        assertNull(mTestObject.waitForObjectArray());
538
539        // LIVECONNECT_COMPLIANCE: Should call toString() on object.
540        executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
541        assertNull(mTestObject.waitForStringArray()[0]);
542
543        // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
544        executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
545        assertNull(mTestObject.waitForCustomTypeArray());
546        executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
547        assertNull(mTestObject.waitForCustomTypeArray());
548    }
549
550    // Test passing an array of JavaScript null values to a method which takes
551    // a Java array.
552    @SmallTest
553    @Feature({"AndroidWebView", "Android-JavaBridge"})
554    public void testPassNull() throws Throwable {
555        executeJavaScript("testObject.setByteArray([null]);");
556        assertEquals(0, mTestObject.waitForByteArray()[0]);
557
558        executeJavaScript("testObject.setCharArray([null]);");
559        assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
560
561        executeJavaScript("testObject.setShortArray([null]);");
562        assertEquals(0, mTestObject.waitForShortArray()[0]);
563
564        executeJavaScript("testObject.setIntArray([null]);");
565        assertEquals(0, mTestObject.waitForIntArray()[0]);
566
567        executeJavaScript("testObject.setLongArray([null]);");
568        assertEquals(0L, mTestObject.waitForLongArray()[0]);
569
570        executeJavaScript("testObject.setFloatArray([null]);");
571        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
572
573        executeJavaScript("testObject.setDoubleArray([null]);");
574        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
575
576        executeJavaScript("testObject.setBooleanArray([null]);");
577        assertFalse(mTestObject.waitForBooleanArray()[0]);
578
579        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
580        executeJavaScript("testObject.setObjectArray([null]);");
581        assertNull(mTestObject.waitForObjectArray());
582
583        executeJavaScript("testObject.setStringArray([null]);");
584        assertNull(mTestObject.waitForStringArray()[0]);
585
586        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
587        executeJavaScript("testObject.setCustomTypeArray([null]);");
588        assertNull(mTestObject.waitForCustomTypeArray());
589    }
590
591    // Test passing an array of JavaScript undefined values to a method which
592    // takes a Java array.
593    @SmallTest
594    @Feature({"AndroidWebView", "Android-JavaBridge"})
595    public void testPassUndefined() throws Throwable {
596        executeJavaScript("testObject.setByteArray([undefined]);");
597        assertEquals(0, mTestObject.waitForByteArray()[0]);
598
599        executeJavaScript("testObject.setCharArray([undefined]);");
600        assertEquals(0, mTestObject.waitForCharArray()[0]);
601
602        executeJavaScript("testObject.setShortArray([undefined]);");
603        assertEquals(0, mTestObject.waitForShortArray()[0]);
604
605        executeJavaScript("testObject.setIntArray([undefined]);");
606        assertEquals(0, mTestObject.waitForIntArray()[0]);
607
608        executeJavaScript("testObject.setLongArray([undefined]);");
609        assertEquals(0L, mTestObject.waitForLongArray()[0]);
610
611        executeJavaScript("testObject.setFloatArray([undefined]);");
612        assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
613
614        executeJavaScript("testObject.setDoubleArray([undefined]);");
615        assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
616
617        executeJavaScript("testObject.setBooleanArray([undefined]);");
618        assertEquals(false, mTestObject.waitForBooleanArray()[0]);
619
620        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
621        executeJavaScript("testObject.setObjectArray([undefined]);");
622        assertNull(mTestObject.waitForObjectArray());
623
624        executeJavaScript("testObject.setStringArray([undefined]);");
625        assertNull(mTestObject.waitForStringArray()[0]);
626
627        // LIVECONNECT_COMPLIANCE: Should create array and pass null.
628        executeJavaScript("testObject.setCustomTypeArray([undefined]);");
629        assertNull(mTestObject.waitForCustomTypeArray());
630    }
631}
632