blob: 9fdd2fc100530adb8bbaf7dc8151646d32991423 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/testharness-helpers.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/mojo/public/interfaces/bindings/tests/sample_service.mojom.js"></script>
<script src="file:///gen/mojo/public/interfaces/bindings/tests/test_structs.mojom.js"></script>
<script>
'use strict';
test(() => {
var bar = new sample.Bar();
bar.alpha = 1;
bar.beta = 2;
bar.gamma = 3;
bar.type = 0x08070605;
bar.extraProperty = "banana";
var messageName = 42;
var payloadSize = sample.Bar.encodedSize;
var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize);
builder.encodeStruct(sample.Bar, bar);
var message = builder.finish();
var expectedMemory = new Uint8Array([
24, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
42, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
16, 0, 0, 0,
0, 0, 0, 0,
1, 2, 3, 0,
5, 6, 7, 8,
]);
var actualMemory = new Uint8Array(message.buffer.arrayBuffer);
assert_weak_equals(actualMemory, expectedMemory);
var reader = new mojo.internal.MessageReader(message);
assert_equals(reader.payloadSize, payloadSize);
assert_equals(reader.messageName, messageName);
var bar2 = reader.decodeStruct(sample.Bar);
assert_equals(bar2.alpha, bar.alpha);
assert_equals(bar2.beta, bar.beta);
assert_equals(bar2.gamma, bar.gamma);
assert_false("extraProperty" in bar2);
}, 'bar');
test(() => {
var foo = new sample.Foo();
foo.x = 0x212B4D5;
foo.y = 0x16E93;
foo.a = 1;
foo.b = 0;
foo.c = 3; // This will get truncated to one bit.
foo.bar = new sample.Bar();
foo.bar.alpha = 91;
foo.bar.beta = 82;
foo.bar.gamma = 73;
foo.data = [
4, 5, 6, 7, 8,
];
foo.extraBars = [
new sample.Bar(), new sample.Bar(), new sample.Bar(),
];
for (var i = 0; i < foo.extraBars.length; ++i) {
foo.extraBars[i].alpha = 1 * i;
foo.extraBars[i].beta = 2 * i;
foo.extraBars[i].gamma = 3 * i;
}
foo.name = "I am a banana";
// This is supposed to be a handle, but we fake it with an integer.
foo.source = 23423782;
foo.arrayOfArrayOfBools = [
[true], [false, true]
];
foo.arrayOfBools = [
true, false, true, false, true, false, true, true
];
var messageName = 31;
var payloadSize = 304;
var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize);
builder.encodeStruct(sample.Foo, foo);
var message = builder.finish();
var expectedMemory = new Uint8Array([
/* 0: */ 24, 0, 0, 0, 0, 0, 0, 0,
/* 8: */ 0, 0, 0, 0, 31, 0, 0, 0,
/* 16: */ 0, 0, 0, 0, 0, 0, 0, 0,
/* 24: */ 96, 0, 0, 0, 0, 0, 0, 0,
/* 32: */ 0xD5, 0xB4, 0x12, 0x02, 0x93, 0x6E, 0x01, 0,
/* 40: */ 5, 0, 0, 0, 0, 0, 0, 0,
/* 48: */ 72, 0, 0, 0, 0, 0, 0, 0,
]);
// TODO(abarth): Test more of the message's raw memory.
var actualMemory = new Uint8Array(message.buffer.arrayBuffer,
0, expectedMemory.length);
assert_weak_equals(actualMemory, expectedMemory);
var expectedHandles = [
23423782,
];
assert_weak_equals(message.handles, expectedHandles);
var reader = new mojo.internal.MessageReader(message);
assert_equals(reader.payloadSize, payloadSize);
assert_equals(reader.messageName, messageName);
var foo2 = reader.decodeStruct(sample.Foo);
assert_equals(foo2.x, foo.x);
assert_equals(foo2.y, foo.y);
assert_equals(foo2.a, foo.a & 1 ? true : false);
assert_equals(foo2.b, foo.b & 1 ? true : false);
assert_equals(foo2.c, foo.c & 1 ? true : false);
assert_weak_equals(foo2.bar, foo.bar);
assert_weak_equals(foo2.data, foo.data);
assert_weak_equals(foo2.extraBars, foo.extraBars);
assert_equals(foo2.name, foo.name);
assert_equals(foo2.source, foo.source);
assert_weak_equals(foo2.arrayOfBools, foo.arrayOfBools);
}, 'foo');
// Verify that the references to the imported Rect type in test_structs.mojom
// are generated correctly.
test(() => {
function createRect(x, y, width, height) {
var r = new mojo.test.Rect();
r.x = x;
r.y = y;
r.width = width;
r.height = height;
return r;
}
var r = new mojo.test.NamedRegion();
r.name = "rectangle";
r.rects = new Array(createRect(1, 2, 3, 4), createRect(10, 20, 30, 40));
var builder = new mojo.internal.MessageV0Builder(
1, mojo.test.NamedRegion.encodedSize);
builder.encodeStruct(mojo.test.NamedRegion, r);
var reader = new mojo.internal.MessageReader(builder.finish());
var result = reader.decodeStruct(mojo.test.NamedRegion);
assert_equals(result.name, "rectangle");
assert_weak_equals(result.rects[0], createRect(1, 2, 3, 4));
assert_weak_equals(result.rects[1], createRect(10, 20, 30, 40));
}, 'named region');
// Verify that a single boolean field in a struct is correctly decoded to
// boolean type.
test(() => {
var singleBool = new mojo.test.SingleBoolStruct();
singleBool.value = true;
var builder = new mojo.internal.MessageV0Builder(
1, mojo.test.SingleBoolStruct.encodedSize);
builder.encodeStruct(mojo.test.SingleBoolStruct, singleBool);
var reader = new mojo.internal.MessageReader(builder.finish());
var result = reader.decodeStruct(mojo.test.SingleBoolStruct);
assert_true(result.value);
}, 'single boolean struct');
test(() => {
function encodeDecode(cls, input, expectedResult, encodedSize) {
var messageName = 42;
var payloadSize = encodedSize || cls.encodedSize;
var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize);
builder.encodeStruct(cls, input)
var message = builder.finish();
var reader = new mojo.internal.MessageReader(message);
assert_equals(reader.payloadSize, payloadSize);
assert_equals(reader.messageName, messageName);
var result = reader.decodeStruct(cls);
assert_equals(result, expectedResult);
}
encodeDecode(mojo.internal.String, "banana", "banana", 24);
encodeDecode(mojo.internal.NullableString, null, null, 8);
encodeDecode(mojo.internal.Int8, -1, -1);
encodeDecode(mojo.internal.Int8, 0xff, -1);
encodeDecode(mojo.internal.Int16, -1, -1);
encodeDecode(mojo.internal.Int16, 0xff, 0xff);
encodeDecode(mojo.internal.Int16, 0xffff, -1);
encodeDecode(mojo.internal.Int32, -1, -1);
encodeDecode(mojo.internal.Int32, 0xffff, 0xffff);
encodeDecode(mojo.internal.Int32, 0xffffffff, -1);
encodeDecode(mojo.internal.Float, 1.0, 1.0);
encodeDecode(mojo.internal.Double, 1.0, 1.0);
}, 'types');
test(() => {
var aligned = [
0, // 0
8, // 1
8, // 2
8, // 3
8, // 4
8, // 5
8, // 6
8, // 7
8, // 8
16, // 9
16, // 10
16, // 11
16, // 12
16, // 13
16, // 14
16, // 15
16, // 16
24, // 17
24, // 18
24, // 19
24, // 20
];
for (var i = 0; i < aligned.length; ++i)
assert_equals(mojo.internal.align(i), aligned[i]);
}, 'align');
test(() => {
var str = "B\u03ba\u1f79"; // some UCS-2 codepoints
var messageName = 42;
var payloadSize = 24;
var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize);
var encoder = builder.createEncoder(8);
encoder.encodeStringPointer(str);
var message = builder.finish();
var expectedMemory = new Uint8Array([
/* 0: */ 24, 0, 0, 0, 0, 0, 0, 0,
/* 8: */ 0, 0, 0, 0, 42, 0, 0, 0,
/* 16: */ 0, 0, 0, 0, 0, 0, 0, 0,
/* 24: */ 8, 0, 0, 0, 0, 0, 0, 0,
/* 32: */ 14, 0, 0, 0, 6, 0, 0, 0,
/* 40: */ 0x42, 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0, 0,
]);
var actualMemory = new Uint8Array(message.buffer.arrayBuffer);
assert_weak_equals(actualMemory, expectedMemory);
var reader = new mojo.internal.MessageReader(message);
assert_equals(reader.payloadSize, payloadSize);
assert_equals(reader.messageName, messageName);
var str2 = reader.decoder.decodeStringPointer();
assert_equals(str2, str);
}, 'utf8');
test(() => {
var str = "Hello world ".repeat(100000);
var messageName = 42;
var payloadSize = 1200000;
var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize);;
var encoder = builder.createEncoder(1200000);
encoder.encodeStringPointer(str);
var message = builder.finish();
var reader = new mojo.internal.MessageReader(message);
var str2 = reader.decoder.decodeStringPointer();
assert_equals(str2, str);
}, 'very long utf8');
test(() => {
var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8);
function DummyClass() {};
var testCases = [
// method, args, invalid examples, valid examples
[encoder.encodeArrayPointer, [DummyClass], [75],
[[], null, undefined, new Uint8Array([])]],
[encoder.encodeStringPointer, [], [75, new String("foo")],
["", "bar", null, undefined]],
[encoder.encodeMapPointer, [DummyClass, DummyClass], [75],
[new Map(), null, undefined]],
];
testCases.forEach(function(test) {
var method = test[0];
var baseArgs = test[1];
var invalidExamples = test[2];
var validExamples = test[3];
var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8);
invalidExamples.forEach(function(invalid) {
assert_throws(new Error, function() {
method.apply(encoder, baseArgs.concat(invalid));
});
});
validExamples.forEach(function(valid) {
var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8);
method.apply(encoder, baseArgs.concat(valid));
});
});
}, 'typed pointer validation');
</script>