Skip to content

Commit eaf0116

Browse files
committed
Add Value#readBuffer tests for ArrayBuffer objects.
1 parent 4628dad commit eaf0116

File tree

2 files changed

+71
-29
lines changed

2 files changed

+71
-29
lines changed

graal-js/src/com.oracle.truffle.js.test/src/com/oracle/truffle/js/test/JSTest.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,27 @@ public static void assertTStringEquals(String a, Object b) {
8989
}
9090

9191
public static void assertThrows(Runnable test, Consumer<PolyglotException> exceptionVerifier) {
92+
assertThrows(test, PolyglotException.class, exceptionVerifier);
93+
}
94+
95+
public static <T extends Throwable> void assertThrows(Runnable test, Class<T> exceptionType, Consumer<T> exceptionVerifier) {
9296
try {
9397
test.run();
94-
fail("should have thrown");
95-
} catch (PolyglotException e) {
96-
exceptionVerifier.accept(e);
98+
fail("should have thrown " + exceptionType.getSimpleName());
99+
} catch (Throwable e) {
100+
if (exceptionType.isInstance(e)) {
101+
exceptionVerifier.accept(exceptionType.cast(e));
102+
} else {
103+
throw e;
104+
}
97105
}
98106
}
99107

108+
public static <T extends Throwable> void assertThrows(Runnable test, Class<T> exceptionType) {
109+
assertThrows(test, exceptionType, (T e) -> {
110+
});
111+
}
112+
100113
public static void assertThrows(Runnable test, JSErrorType expectedJSError) {
101114
try {
102115
test.run();

graal-js/src/com.oracle.truffle.js.test/src/com/oracle/truffle/js/test/interop/InteropByteBufferTest.java

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import static com.oracle.truffle.js.lang.JavaScriptLanguage.ID;
4444
import static com.oracle.truffle.js.test.JSTest.assertThrows;
45+
import static org.junit.Assert.assertArrayEquals;
4546
import static org.junit.Assert.assertEquals;
4647
import static org.junit.Assert.assertTrue;
4748

@@ -185,19 +186,20 @@ public void testArrayBufferInteropHeap() {
185186

186187
private static void testArrayBufferInteropCommon(boolean direct) {
187188
try (Context cx = JSTest.newContextBuilder().option(JSContextOptions.DIRECT_BYTE_BUFFER_NAME, Boolean.toString(direct)).build()) {
188-
Value buffer = cx.eval("js", "" +
189-
"const ab = new ArrayBuffer(25);" +
190-
"let ia = new Int8Array(ab);" +
191-
"ia[0] = 41;" +
192-
"ia[1] = 42;" +
193-
"ia[2] = 43;" +
194-
"ia[3] = 44;" +
195-
"ia = new Int32Array(ab, 4, 2);" +
196-
"ia[0] = 45;" +
197-
"ia[1] = 46;" +
198-
"ia = new BigInt64Array(ab, 16, 1);" +
199-
"ia[0] = 2n ** 63n - 43n;" +
200-
"ab;");
189+
Value buffer = cx.eval("js", """
190+
const ab = new ArrayBuffer(25);
191+
let ia = new Int8Array(ab);
192+
ia[0] = 41;
193+
ia[1] = 42;
194+
ia[2] = 43;
195+
ia[3] = 44;
196+
ia = new Int32Array(ab, 4, 2);
197+
ia[0] = 45;
198+
ia[1] = 46;
199+
ia = new BigInt64Array(ab, 16, 1);
200+
ia[0] = 2n ** 63n - 43n;
201+
ab;
202+
""");
201203
assertEquals(25, buffer.getBufferSize());
202204
assertEquals(buffer.readBufferByte(0), 41);
203205
assertEquals(buffer.readBufferByte(1), 42);
@@ -218,6 +220,16 @@ private static void testArrayBufferInteropCommon(boolean direct) {
218220
assertTrue(buffer.isBufferWritable());
219221
buffer.writeBufferLong(ByteOrder.nativeOrder(), 16, Double.doubleToRawLongBits(Double.NEGATIVE_INFINITY));
220222
assertEquals(buffer.readBufferDouble(ByteOrder.nativeOrder(), 16), Double.NEGATIVE_INFINITY, 0.0);
223+
224+
byte[] dst = new byte[4];
225+
buffer.readBuffer(0, dst, 0, 4);
226+
assertArrayEquals(new byte[]{41, 42, 43, 44}, dst);
227+
buffer.readBuffer(3, dst, 2, 2);
228+
assertArrayEquals(new byte[]{41, 42, 44, (byte) (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? 45 : 0)}, dst);
229+
230+
assertThrows(() -> buffer.readBuffer(-1, new byte[4], 0, 0), IndexOutOfBoundsException.class);
231+
assertThrows(() -> buffer.readBuffer(0, new byte[24], 0, 25), IndexOutOfBoundsException.class);
232+
assertThrows(() -> buffer.readBuffer(1, new byte[25], 0, 25), IndexOutOfBoundsException.class);
221233
}
222234
}
223235

@@ -233,15 +245,14 @@ private static void testDataViewBackedByHostByteBuffer(boolean direct, boolean v
233245
ByteBuffer buffer = direct ? ByteBuffer.allocateDirect(32) : ByteBuffer.allocate(32);
234246
try (Context context = JSTest.newContextBuilder().allowHostAccess(HostAccess.newBuilder().allowBufferAccess(true).build()).build()) {
235247
context.getBindings(ID).putMember("bb", buffer);
236-
Value dataView = context.eval(ID, "" +
237-
"const ab = " + (viaArrayBuffer ? "new ArrayBuffer(bb)" : "bb") + ";" +
238-
"let dv = new DataView(ab);" +
239-
"dv;");
240-
context.eval(ID, "" +
241-
"dv.setInt8(0, 41);" +
242-
"dv.setInt8(1, dv.getInt8(0) + 1);" +
243-
"dv.setUint8(2, dv.getUint8(1) + 1);" +
244-
"dv.setInt32(3, -44, true);");
248+
Value arrayBuffer = context.eval(ID, "const ab = " + (viaArrayBuffer ? "new ArrayBuffer(bb)" : "bb") + "; ab;");
249+
Value dataView = context.eval(ID, "let dv = new DataView(ab); dv;");
250+
context.eval(ID, """
251+
dv.setInt8(0, 41);
252+
dv.setInt8(1, dv.getInt8(0) + 1);
253+
dv.setUint8(2, dv.getUint8(1) + 1);
254+
dv.setInt32(3, -44, true);
255+
""");
245256
assertEquals(41, buffer.get(0));
246257
assertEquals(42, buffer.get(1));
247258
assertEquals(43, buffer.get(2));
@@ -265,6 +276,16 @@ private static void testDataViewBackedByHostByteBuffer(boolean direct, boolean v
265276
context.eval(ID, "dv.setBigInt64(24, 1742123762643437888n, false);");
266277
assertEquals(4614256656552045848L, dataView.invokeMember("getBigInt64", 24, true).asLong());
267278
assertEquals(Math.PI, dataView.invokeMember("getFloat64", 24, true).asDouble(), 0.0);
279+
280+
byte[] dst = new byte[4];
281+
arrayBuffer.readBuffer(0, dst, 0, 4);
282+
assertArrayEquals(new byte[]{41, 42, 43, 44}, dst);
283+
arrayBuffer.readBuffer(2, dst, 1, 3);
284+
assertArrayEquals(new byte[]{41, 43, 44, -1}, dst);
285+
286+
assertThrows(() -> arrayBuffer.readBuffer(-1, new byte[4], 0, 0), IndexOutOfBoundsException.class);
287+
assertThrows(() -> arrayBuffer.readBuffer(0, new byte[31], 0, 32), IndexOutOfBoundsException.class);
288+
assertThrows(() -> arrayBuffer.readBuffer(1, new byte[33], 0, 32), IndexOutOfBoundsException.class);
268289
}
269290
}
270291

@@ -287,11 +308,19 @@ public void testDetachedInteropArrayBuffer() {
287308
try (Context context = JSTest.newContextBuilder().allowHostAccess(hostAccess).allowExperimentalOptions(true).option("js.debug-builtin", "true").option("js.v8-compat", "true").build()) {
288309
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{1, 2, 3});
289310
context.getBindings("js").putMember("buffer", buffer);
290-
Value byteLength = context.eval(ID, "" +
291-
"var arrayBuffer = new ArrayBuffer(buffer);\n" +
292-
"Debug.typedArrayDetachBuffer(arrayBuffer);\n" +
293-
"arrayBuffer.byteLength;");
311+
Value byteLength = context.eval(ID, """
312+
var arrayBuffer = new ArrayBuffer(buffer);
313+
Debug.typedArrayDetachBuffer(arrayBuffer);
314+
arrayBuffer.byteLength;
315+
""");
294316
assertEquals(0, byteLength.asInt());
317+
318+
Value arrayBuffer = context.getBindings(ID).getMember("arrayBuffer");
319+
assertTrue(arrayBuffer.hasBufferElements());
320+
assertThrows(() -> arrayBuffer.readBuffer(0, new byte[1], 0, 1), IndexOutOfBoundsException.class);
321+
322+
// even reading zero bytes is not allowed for detached buffers
323+
assertThrows(() -> arrayBuffer.readBuffer(0, new byte[0], 0, 0), IndexOutOfBoundsException.class);
295324
}
296325
}
297326

0 commit comments

Comments
 (0)