<!-- 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(gattServer => get_request_disconnection(gattServer))
            .then(requestDisconnection => requestDisconnection())
            .then(
                () => assert_promise_rejects_with_message(
                    device.gatt.getPrimaryService('heart_rate'),
                    new DOMException(
                        'GATT Server is disconnected. ' +
                            'Cannot retrieve services. ' +
                            '(Re)connect first with `device.gatt.connect`.',
                        'NetworkError')));
      });
}, 'Device disconnects before getPrimaryService. Reject with NetworkError.');

</script>
