| OLD | NEW |
| (Empty) | |
| 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 |
| 5 package org.chromium.content.browser; |
| 6 |
| 7 import android.test.suitebuilder.annotation.SmallTest; |
| 8 |
| 9 import org.chromium.base.test.util.Feature; |
| 10 |
| 11 /** |
| 12 * Part of the test suite for the Java Bridge. This class tests the general use
of arrays. |
| 13 * |
| 14 * The conversions should follow |
| 15 * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in |
| 16 * which the implementation differs from the spec are marked with |
| 17 * LIVECONNECT_COMPLIANCE. |
| 18 * FIXME: Consider making our implementation more compliant, if it will not |
| 19 * break backwards-compatibility. See b/4408210. |
| 20 */ |
| 21 public class JavaBridgeArrayTest extends JavaBridgeTestBase { |
| 22 private class TestObject extends Controller { |
| 23 private boolean mBooleanValue; |
| 24 private int mIntValue; |
| 25 private String mStringValue; |
| 26 |
| 27 private int[] mIntArray; |
| 28 private int[][] mIntIntArray; |
| 29 |
| 30 private boolean mWasArrayMethodCalled; |
| 31 |
| 32 public synchronized void setBooleanValue(boolean x) { |
| 33 mBooleanValue = x; |
| 34 notifyResultIsReady(); |
| 35 } |
| 36 public synchronized void setIntValue(int x) { |
| 37 mIntValue = x; |
| 38 notifyResultIsReady(); |
| 39 } |
| 40 public synchronized void setStringValue(String x) { |
| 41 mStringValue = x; |
| 42 notifyResultIsReady(); |
| 43 } |
| 44 |
| 45 public synchronized boolean waitForBooleanValue() { |
| 46 waitForResult(); |
| 47 return mBooleanValue; |
| 48 } |
| 49 public synchronized int waitForIntValue() { |
| 50 waitForResult(); |
| 51 return mIntValue; |
| 52 } |
| 53 public synchronized String waitForStringValue() { |
| 54 waitForResult(); |
| 55 return mStringValue; |
| 56 } |
| 57 |
| 58 public synchronized void setIntArray(int[] x) { |
| 59 mIntArray = x; |
| 60 notifyResultIsReady(); |
| 61 } |
| 62 public synchronized void setIntIntArray(int[][] x) { |
| 63 mIntIntArray = x; |
| 64 notifyResultIsReady(); |
| 65 } |
| 66 |
| 67 public synchronized int[] waitForIntArray() { |
| 68 waitForResult(); |
| 69 return mIntArray; |
| 70 } |
| 71 public synchronized int[][] waitForIntIntArray() { |
| 72 waitForResult(); |
| 73 return mIntIntArray; |
| 74 } |
| 75 |
| 76 public synchronized int[] arrayMethod() { |
| 77 mWasArrayMethodCalled = true; |
| 78 return new int[] {42, 43, 44}; |
| 79 } |
| 80 |
| 81 public synchronized boolean wasArrayMethodCalled() { |
| 82 return mWasArrayMethodCalled; |
| 83 } |
| 84 } |
| 85 |
| 86 private TestObject mTestObject; |
| 87 |
| 88 @Override |
| 89 protected void setUp() throws Exception { |
| 90 super.setUp(); |
| 91 mTestObject = new TestObject(); |
| 92 setUpContentView(mTestObject, "testObject"); |
| 93 } |
| 94 |
| 95 @SmallTest |
| 96 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 97 public void testArrayLength() throws Throwable { |
| 98 executeJavaScript("testObject.setIntArray([42, 43, 44]);"); |
| 99 int[] result = mTestObject.waitForIntArray(); |
| 100 assertEquals(3, result.length); |
| 101 assertEquals(42, result[0]); |
| 102 assertEquals(43, result[1]); |
| 103 assertEquals(44, result[2]); |
| 104 } |
| 105 |
| 106 @SmallTest |
| 107 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 108 public void testPassNull() throws Throwable { |
| 109 executeJavaScript("testObject.setIntArray(null);"); |
| 110 assertNull(mTestObject.waitForIntArray()); |
| 111 } |
| 112 |
| 113 @SmallTest |
| 114 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 115 public void testPassUndefined() throws Throwable { |
| 116 executeJavaScript("testObject.setIntArray(undefined);"); |
| 117 assertNull(mTestObject.waitForIntArray()); |
| 118 } |
| 119 |
| 120 @SmallTest |
| 121 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 122 public void testPassEmptyArray() throws Throwable { |
| 123 executeJavaScript("testObject.setIntArray([]);"); |
| 124 assertEquals(0, mTestObject.waitForIntArray().length); |
| 125 } |
| 126 |
| 127 // Note that this requires being able to pass a string from JavaScript to |
| 128 // Java. |
| 129 @SmallTest |
| 130 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 131 public void testPassArrayToStringMethod() throws Throwable { |
| 132 // LIVECONNECT_COMPLIANCE: Should call toString() on array. |
| 133 executeJavaScript("testObject.setStringValue([42, 42, 42]);"); |
| 134 assertEquals("undefined", mTestObject.waitForStringValue()); |
| 135 } |
| 136 |
| 137 // Note that this requires being able to pass an integer from JavaScript to |
| 138 // Java. |
| 139 @SmallTest |
| 140 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 141 public void testPassArrayToNonStringNonArrayMethod() throws Throwable { |
| 142 // LIVECONNECT_COMPLIANCE: Should raise JavaScript exception. |
| 143 executeJavaScript("testObject.setIntValue([42, 42, 42]);"); |
| 144 assertEquals(0, mTestObject.waitForIntValue()); |
| 145 } |
| 146 |
| 147 @SmallTest |
| 148 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 149 public void testPassNonArrayToArrayMethod() throws Throwable { |
| 150 // LIVECONNECT_COMPLIANCE: Should raise JavaScript exception. |
| 151 executeJavaScript("testObject.setIntArray(42);"); |
| 152 assertNull(mTestObject.waitForIntArray()); |
| 153 } |
| 154 |
| 155 @SmallTest |
| 156 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 157 public void testObjectWithLengthProperty() throws Throwable { |
| 158 executeJavaScript("testObject.setIntArray({length: 3, 1: 42});"); |
| 159 int[] result = mTestObject.waitForIntArray(); |
| 160 assertEquals(3, result.length); |
| 161 assertEquals(0, result[0]); |
| 162 assertEquals(42, result[1]); |
| 163 assertEquals(0, result[2]); |
| 164 } |
| 165 |
| 166 @SmallTest |
| 167 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 168 public void testNonNumericLengthProperty() throws Throwable { |
| 169 // LIVECONNECT_COMPLIANCE: This should not count as an array, so we |
| 170 // should raise a JavaScript exception. |
| 171 executeJavaScript("testObject.setIntArray({length: \"foo\"});"); |
| 172 assertNull(mTestObject.waitForIntArray()); |
| 173 } |
| 174 |
| 175 @SmallTest |
| 176 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 177 public void testLengthOutOfBounds() throws Throwable { |
| 178 // LIVECONNECT_COMPLIANCE: This should not count as an array, so we |
| 179 // should raise a JavaScript exception. |
| 180 executeJavaScript("testObject.setIntArray({length: -1});"); |
| 181 assertNull(mTestObject.waitForIntArray()); |
| 182 |
| 183 // LIVECONNECT_COMPLIANCE: This should not count as an array, so we |
| 184 // should raise a JavaScript exception. |
| 185 long length = Integer.MAX_VALUE + 1L; |
| 186 executeJavaScript("testObject.setIntArray({length: " + length + "});"); |
| 187 assertNull(mTestObject.waitForIntArray()); |
| 188 |
| 189 // LIVECONNECT_COMPLIANCE: This should not count as an array, so we |
| 190 // should raise a JavaScript exception. |
| 191 length = Integer.MAX_VALUE + 1L - Integer.MIN_VALUE + 1L; |
| 192 executeJavaScript("testObject.setIntArray({length: " + length + "});"); |
| 193 assertNull(mTestObject.waitForIntArray()); |
| 194 } |
| 195 |
| 196 @SmallTest |
| 197 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 198 public void testSparseArray() throws Throwable { |
| 199 executeJavaScript("var x = [42, 43]; x[3] = 45; testObject.setIntArray(x
);"); |
| 200 int[] result = mTestObject.waitForIntArray(); |
| 201 assertEquals(4, result.length); |
| 202 assertEquals(42, result[0]); |
| 203 assertEquals(43, result[1]); |
| 204 assertEquals(0, result[2]); |
| 205 assertEquals(45, result[3]); |
| 206 } |
| 207 |
| 208 // Note that this requires being able to pass a boolean from JavaScript to |
| 209 // Java. |
| 210 @SmallTest |
| 211 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 212 public void testMethodReturningArrayNotCalled() throws Throwable { |
| 213 // We don't invoke methods which return arrays, but note that no |
| 214 // exception is raised. |
| 215 // LIVECONNECT_COMPLIANCE: Should call method and convert result to |
| 216 // JavaScript array. |
| 217 executeJavaScript("testObject.setBooleanValue(undefined === testObject.a
rrayMethod())"); |
| 218 assertTrue(mTestObject.waitForBooleanValue()); |
| 219 assertFalse(mTestObject.wasArrayMethodCalled()); |
| 220 } |
| 221 |
| 222 @SmallTest |
| 223 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 224 public void testMultiDimensionalArrayMethod() throws Throwable { |
| 225 // LIVECONNECT_COMPLIANCE: Should handle multi-dimensional arrays. |
| 226 executeJavaScript("testObject.setIntIntArray([ [42, 43], [44, 45] ]);"); |
| 227 assertNull(mTestObject.waitForIntIntArray()); |
| 228 } |
| 229 |
| 230 @SmallTest |
| 231 @Feature({"Android-WebView", "Android-JavaBridge"}) |
| 232 public void testPassMultiDimensionalArray() throws Throwable { |
| 233 // LIVECONNECT_COMPLIANCE: Should handle multi-dimensional arrays. |
| 234 executeJavaScript("testObject.setIntArray([ [42, 43], [44, 45] ]);"); |
| 235 int[] result = mTestObject.waitForIntArray(); |
| 236 assertEquals(2, result.length); |
| 237 assertEquals(0, result[0]); |
| 238 assertEquals(0, result[1]); |
| 239 } |
| 240 } |
| OLD | NEW |