<!-- 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(t => {
  return setBluetoothFakeAdapter('DisconnectingHeartRateAdapter')
    .then(() => requestDeviceWithTrustedClick({
      filters: [{services: ['heart_rate']}],
      optionalServices: [request_disconnection_service_uuid]
    }))
    .then(device => {
      return device.gatt.connect()
        .then(gatt => get_request_disconnection(gatt))
        .then(requestDisconnection => {
          requestDisconnection();
          return assert_promise_rejects_with_message(
            device.gatt.getPrimaryServices(),
            new DOMException('GATT Server is disconnected. ' +
                             'Cannot retrieve services. ' +
                             '(Re)connect first with `device.gatt.connect`.',
                             'NetworkError'));
        });
    });
}, 'Device disconnects during a getPrimaryServices call that succeeds. Reject ' +
   'with NetworkError.');

</script>
