blob: 0bba163358cb81ad89f958b23ed2ee02bb03deaf [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script>
<script>
'use strict';
// Verify that the mojo_test helper functions properly and Mojo bindings
// are available.
mojo_test(mojo => {
assert_true(mojo instanceof Object);
assert_true(mojo.core instanceof Object);
assert_true(mojo.router instanceof Object);
assert_true(mojo.frameInterfaces instanceof Object);
assert_true(mojo.interfaces instanceof Object);
}, 'Mojo system APIs should be available to layout tests.');
mojo_test(mojo => {
return new Promise(resolve => {
let calls = 0;
// Complete the test as soon as two requests come in for a Frobinator
// interface.
mojo.frameInterfaces.addInterfaceOverrideForTesting('Frobinator', () => {
if (++calls == 2)
resolve();
});
// Try to connect to the browser's Frobinator interface. This should be
// intercepted by the above override.
mojo.frameInterfaces.getInterface('Frobinator');
mojo.frameInterfaces.getInterface('Frobinator');
});
}, 'Frame interface provider overrides should be properly intercepted.');
mojo_test(mojo => {
return new Promise(resolve => {
let calls = 0;
// Complete the test as soon as two requests come in for a Frobinator
// interface.
mojo.interfaces.addInterfaceOverrideForTesting('Frobinator', () => {
if (++calls == 2)
resolve();
});
// Try to connect to the browser's Frobinator interface. This should be
// intercepted by the above override.
mojo.interfaces.getInterface('Frobinator');
mojo.interfaces.getInterface('Frobinator');
});
}, 'Interface provider overrides should be properly intercepted.');
mojo_test(mojo => {
return new Promise(resolve => {
let TEST_REQUEST = new Uint8Array([42, 0, 2, 3, 5, 7, 11, 13, 17, 19, 23]);
mojo.interfaces.addInterfaceOverrideForTesting('Frobinator', pipe => {
resolve(mojo_wait_for_incoming_message(mojo, pipe)
.then(message => {
assert_array_equals(new Uint8Array(message.buffer), TEST_REQUEST);
assert_array_equals(message.handles, []);
}));
});
let pipe = mojo.interfaces.getInterface('Frobinator');
assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0),
mojo.core.RESULT_OK);
});
}, 'Mock interfaces can receive messages from test code.');
mojo_test(mojo => {
let TEST_REQUEST = new Uint8Array([1, 2, 3, 4, 5]);
let EXPECTED_RESPONSE = new Uint8Array([5, 4, 3, 2, 1]);
// Mock interface should respond to any message with its reverse.
mojo.interfaces.addInterfaceOverrideForTesting('Reversinator', pipe => {
mojo_wait_for_incoming_message(mojo, pipe)
.then(message => {
let response = new Uint8Array(message.buffer);
response.reverse();
assert_equals(mojo.core.writeMessage(pipe, response, [], 0),
mojo.core.RESULT_OK);
});
});
let pipe = mojo.interfaces.getInterface('Reversinator');
assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0),
mojo.core.RESULT_OK);
return mojo_wait_for_incoming_message(mojo, pipe)
.then(response => {
assert_array_equals(new Uint8Array(response.buffer), EXPECTED_RESPONSE);
assert_array_equals(response.handles, []);
});
}, 'Test code can receive response messages from mock interfaces.');
mojo_test(() => {
return new Promise(resolve => {
let iframe = document.createElement('iframe');
let listener = result => {
document.body.removeChild(iframe);
window.removeEventListener('message', listener);
assert_true(result.data);
resolve();
}
window.addEventListener('message', listener);
iframe.setAttribute('src', 'resources/mojo-helpers-inner.html');
document.body.appendChild(iframe);
});
}, 'Mojo bindings are accessible from iframes');
mojo_test(() => {
return new Promise(resolve => {
let popup;
let listener = result => {
popup.close();
window.removeEventListener('message', listener);
assert_true(result.data);
resolve();
}
window.addEventListener('message', listener);
popup = window.open('resources/mojo-helpers-inner.html');
});
}, 'Mojo bindings are accessible from popups');
</script>