// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var usb = chrome.usb;

function createErrorTest(resultCode, errorMessage) {
  return function() {
    usb.findDevices({vendorId: 0, productId: 0}, function(devices) {
      var device = devices[0];
      var transfer = new Object();
      transfer.direction = "out";
      transfer.endpoint = 1;
      transfer.data = new ArrayBuffer(0);
      usb.bulkTransfer(device, transfer, function (result) {
        if (errorMessage) {
          chrome.test.assertLastError(errorMessage);
        } else {
          chrome.test.assertNoLastError();
        }
        chrome.test.assertTrue(resultCode == result.resultCode);
        chrome.test.succeed();
      });
    });
  };
}

function createIsochronousErrorTest(resultCode, errorMessage) {
  return function() {
    usb.findDevices({vendorId: 0, productId: 0}, function(devices) {
      var device = devices[0];
      var transfer = {
        'transferInfo': {
          'direction': "in",
          'endpoint': 2,
          'length': 160
        },
        'packets': 10,
        'packetLength': 16
      };
      usb.isochronousTransfer(device, transfer, function (result) {
        if (errorMessage) {
          chrome.test.assertLastError(errorMessage);
          // Device responds with only 8-byte packets and the second half fail.
          chrome.test.assertTrue(result.data.byteLength == 40);
        } else {
          chrome.test.assertNoLastError();
          // Device responds with a full set of 10 8-byte packets.
          chrome.test.assertTrue(result.data.byteLength == 80);
        }
        chrome.test.assertTrue(resultCode == result.resultCode);
        chrome.test.succeed();
      });
    });
  };
}

var tests = [
  createErrorTest(0, undefined),
  createErrorTest(1, "Transfer failed."),
  createErrorTest(2, "Transfer timed out."),
  createIsochronousErrorTest(0, undefined),
  createIsochronousErrorTest(1, "Transfer failed."),
];

chrome.test.runTests(tests);
