chromium/chrome/test/data/extensions/api_test/bluetooth_low_energy/notify_characteristic_value_changed_error_conditions/runtest.js

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function failOnError(result) {
  if (chrome.runtime.lastError || !result) {
    chrome.test.fail(chrome.runtime.lastError.message);
    return true;
  }
  return false;
}

function failOnSuccess() {
  if (!chrome.runtime.lastError) {
    chrome.test.fail('lastError not set, operation succeeded.');
    return true;
  }
  return false;
}

var service = { uuid: '00001234-0000-1000-8000-00805f9b34fb', isPrimary: true };
chrome.bluetoothLowEnergy.createService(service, function(serviceId) {
  if (failOnError(serviceId))
    return;

  var characteristic1 = { uuid: '00001234-0000-1000-8000-00805f9b34fa',
    properties: ['notify']};
  var characteristic2 = { uuid: '00001234-0000-1000-8000-00805f9b34fa',
    properties: ['indicate']};
  chrome.bluetoothLowEnergy.createCharacteristic(characteristic1, serviceId,
        function(characteristicId1) {
    if (failOnError(characteristicId1))
        return;
    chrome.bluetoothLowEnergy.createCharacteristic(characteristic2, serviceId,
          function(characteristicId2) {
      if (failOnError(characteristicId2))
          return;

      var bytes = [0xBA, 0xAD, 0x72, 0xF0, 0x0D, 0x65];
      var newValue = (new Uint8Array(bytes)).buffer;
      // Notifying without registering first. Should fail.
      chrome.bluetoothLowEnergy.notifyCharacteristicValueChanged(
          characteristicId1, {value: newValue, shouldIndicate: false},
          function() {
        if (failOnSuccess())
          return;
        chrome.bluetoothLowEnergy.registerService(serviceId, function() {
          if (failOnError('result'))
            return;
          // Using notify with indicate property. Should fail.
          chrome.bluetoothLowEnergy.notifyCharacteristicValueChanged(
              characteristicId2, {value: newValue, shouldIndicate: false},
              function() {
            if (failOnSuccess())
              return;
            // Using indicate with notify property. Should fail.
            chrome.bluetoothLowEnergy.notifyCharacteristicValueChanged(
                characteristicId1, {value: newValue, shouldIndicate: true},
                function() {
              if (failOnSuccess())
                return;
              chrome.test.succeed();
            });
          });
        });
      });
    });
  });
});