.then(function(stashedObjects) {
   test.assertEq(1, stashedObjects.length);
   test.assertEq('test id', stashedObjects[0].id);
   test.assertEq([1, 2, 3, 4], stashedObjects[0].data);
   test.assertEq(1, stashedObjects[0].stashed_handles.length);
   readAndClose(core, stashedObjects[0].stashed_handles[0]);
 });
function readAndClose(core, handle) {
  var result = core.readData(handle, core.READ_DATA_FLAG_NONE);
  test.assertEq(core.RESULT_OK, result.result);
  core.close(handle);
  test.assertEq(1, result.buffer.byteLength);
  test.assertEq('a'.charCodeAt(0), new Int8Array(result.buffer)[0]);
}
 ]).then(test.callback(function(modules) {
   var connection = modules[0];
   var core = modules[1];
   var serviceProvider = modules[2];
   test.assertTrue(!!connection.Connection);
   test.assertTrue(!!core.createMessagePipe);
   test.assertTrue(!!serviceProvider.connectToService);
 }));
function writeAndClose(core, handle) {
  var data = new Int8Array(1);
  data[0] = 'a'.charCodeAt(0);
  var result = core.writeData(handle, data, core.WRITE_DATA_FLAG_NONE);
  test.assertEq(core.RESULT_OK, result.result);
  test.assertEq(1, result.numBytes);
  core.close(handle);
}
 function testCommonModulesAreAvailable() {
   var binding = require('binding');
   var sendRequest = require('sendRequest');
   var lastError = require('lastError');
   test.assertTrue(!!binding);
   test.assertTrue(!!sendRequest);
   test.assertTrue(!!lastError);
   test.succeed();
 },
 function testMojoModulesAreAvailable() {
   Promise.all([
     requireAsync('mojo/public/js/connection'),
     requireAsync('mojo/public/js/core'),
     requireAsync('content/public/renderer/service_provider'),
   ]).then(test.callback(function(modules) {
     var connection = modules[0];
     var core = modules[1];
     var serviceProvider = modules[2];
     test.assertTrue(!!connection.Connection);
     test.assertTrue(!!core.createMessagePipe);
     test.assertTrue(!!serviceProvider.connectToService);
   }));
 },
 function testEnvironment() {
   test.assertTrue(!!$Array);
   test.assertTrue(!!$Function);
   test.assertTrue(!!$JSON);
   test.assertTrue(!!$Object);
   test.assertTrue(!!$RegExp);
   test.assertTrue(!!$String);
   test.assertTrue(!!privates);
   test.assertTrue(!!define);
   test.assertTrue(!!require);
   test.assertTrue(!!requireNative);
   test.assertTrue(!!requireAsync);
   test.assertEq(undefined, chrome.runtime.lastError);
   test.assertEq(undefined, chrome.extension.lastError);
   test.succeed();
 },
 function testTestBindings() {
   var counter = 0;
   function increment() {
     counter++;
   }
   test.runWithUserGesture(increment);
   test.runWithoutUserGesture(increment);
   test.runWithModuleSystem(increment);
   test.assertEq(3, counter);
   test.assertFalse(test.isProcessingUserGesture());
   test.assertTrue(!!test.getApiFeatures());
   test.assertEq(0, test.getApiDefinitions().length);
   test.succeed();
 }
 function testPromisesRun() {
   Promise.resolve().then(test.callbackPass());
 },
 return promise.then(function(sender) {
   test.assertEq(nextIndex, expectedIndex);
   nextIndex++;
   return sender;
 });
// Checks that attempting to start a send with |sender| fails.
function sendAfterClose(sender) {
  test.assertThrows(sender.send, sender, [], 'DataSender has been closed');
}
 return sender.send(data).catch(function(result) {
   test.assertEq(expectedError, result.error);
   test.assertEq(expectedBytesSent, result.bytesSent);
   return sender;
 });
 return sender.send(data).then(function(bytesSent) {
   test.assertEq(data.byteLength, bytesSent);
   return sender;
 });
 sender.then(function(sender) {
   test.assertThrows(
       sender.cancel, sender, [], 'Cancel already in progress');
   test.assertThrows(sender.send, sender, [], 'Cancel in progress');
 });