<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/bluetooth/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
  let val = new Uint8Array([1]);
  return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter')
      .then(
          () => requestDeviceWithKeyDown(
              {filters: [{services: ['health_thermometer']}]}))
      .then(device => device.gatt.connect())
      .then(gattServer => {
        return gattServer.getPrimaryService('health_thermometer')
            .then(service => service.getCharacteristic('measurement_interval'))
            .then(measurement_interval => {
              gattServer.disconnect();
              return assert_promise_rejects_with_message(
                  measurement_interval.getDescriptor(user_description.name),
                  new DOMException(
                      'GATT Server is disconnected. Cannot retrieve descriptors. ' +
                          '(Re)connect first with `device.gatt.connect`.',
                      'NetworkError'));
            });
      });
}, 'disconnect() called before getDescriptor. Reject with NetworkError.');

</script>
