<!-- 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';
const test_desc = 'disconnect() called during a writeValue call that ' +
    'succeeds. Reject with NetworkError.';
const value = new Uint8Array([1]);
const expected = new DOMException(
    'GATT Server is disconnected. Cannot perform GATT operations. ' +
    '(Re)connect first with `device.gatt.connect`.',
    'NetworkError');
let fake_descriptor, device, descriptor;

bluetooth_test(() => getUserDescriptionDescriptor()
    .then(_ => ({fake_descriptor, device, descriptor} = _))
    .then(() => {
      switch ('writeValue') {
        case 'readValue':
          return fake_descriptor.setNextReadResponse(GATT_SUCCESS, []);
        case 'writeValue':
          return fake_descriptor.setNextWriteResponse(GATT_SUCCESS);
        default:
      }
    })
    .then(() => {
        let promise = assert_promise_rejects_with_message(
            descriptor.writeValue(value), expected);
        device.gatt.disconnect();
        return promise;
    }),
    test_desc);

</script>
