<!-- 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(() => {
  return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter')
    .then(() => requestDeviceWithTrustedClick({
      filters: [{services: ['health_thermometer']}],
      optionalServices: [request_disconnection_service_uuid]}))
    .then(device => device.gatt.connect())
    .then(gattServer => {
      let services;
      return gattServer
        .getPrimaryServices()
        .then(s => {
          // Convert to array if necessary.
          services = [].concat(s);
          return get_request_disconnection(gattServer);
        })
        .then(requestDisconnection => requestDisconnection())
        .then(() => gattServer.connect())
        .then(() => services);
    })
    .then(services => {
      let promises = Promise.resolve();
      for (let service of services) {
        if (service.uuid == request_disconnection_service_uuid) {
          continue;
        }
        let error = new DOMException(
          'Service with UUID ' + service.uuid +
          ' is no longer valid. Remember to retrieve the service ' +
          'again after reconnecting.',
          'InvalidStateError');
        promises = promises.then(() =>
          assert_promise_rejects_with_message(
            service.getCharacteristic('measurement_interval'),
            error));
        promises = promises.then(() =>
          assert_promise_rejects_with_message(
            service.getCharacteristics(),
            error));
        promises = promises.then(() =>
          assert_promise_rejects_with_message(
            service.getCharacteristics('measurement_interval'),
            error));
      }
      return promises;
    });
}, 'Calls on services after device disconnects and we reconnect. ' +
   'Should reject with InvalidStateError.');

</script>
