<!-- Generated by //third_party/blink/web_tests/bluetooth/generate.py -->
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
  let promise;
  return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter')
    .then(() => requestDeviceWithTrustedClick({
      filters: [{services: ['health_thermometer']}]}))
    .then(device => device.gatt.connect())
    .then(gattServer => gattServer.getPrimaryService('health_thermometer'))
    .then(service => service.getCharacteristic('measurement_interval'))
    .then(characteristic => {
      return assert_promise_rejects_with_message(
        characteristic.getDescriptor('invalid-name'),
          new DOMException(
              'Failed to execute \'getDescriptor\' on ' +
                  '\'BluetoothRemoteGATTCharacteristic\': Invalid Descriptor name: ' +
                  '\'invalid-name\'. ' +
                  'It must be a valid UUID alias (e.g. 0x1234), ' +
                  'UUID (lowercase hex characters e.g. ' +
                  '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
                  'or recognized standard name from ' +
                  'https://www.bluetooth.com/specifications/gatt/descriptors' +
                  ' e.g. \'gatt.characteristic_presentation_format\'.',
              'TypeError'));

    })
}, 'Test to ensure getDescriptor throws when called with an invalid name.');

</script>
