<!-- 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="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
bluetooth_test(
    () => {
      let val = new Uint8Array([1]);
      return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter')
          .then(
              () => requestDeviceWithTrustedClick(
                  {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 => {
                  let promise = 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'));
                  gattServer.disconnect();
                  return promise;
                });
          });
    },
    'disconnect() called during a getDescriptor call that succeeds. ' +
        'Reject with NetworkError.');

</script>
