// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// This test checks that setting writeEventsEnabled on a socket that is
// closed for read (the other end has closed for write) does not send
// an additional READ_CLOSED event.

import "dart:async";
import "dart:io";

import "package:expect/expect.dart";
import "package:expect/async_helper.dart";

final Duration delay = new Duration(milliseconds: 100);
final List<int> data = new List.generate(100, (i) => i % 20 + 65);
late RawServerSocket server;
late RawSocket client;
bool serverReadClosedReceived = false;
bool serverFirstWrite = true;

void serverListen(RawSocket serverSide) {
  void serveData(RawSocketEvent event) {
    switch (event) {
      case RawSocketEvent.write:
        serverSide.write(data);
        if (serverFirstWrite) {
          serverFirstWrite = false;
          new Future.delayed(delay, () {
            serverSide.writeEventsEnabled = true;
          });
        } else {
          new Future.delayed(delay, () async {
            Expect.isTrue(serverReadClosedReceived);
            serverSide.shutdown(SocketDirection.send);
            await server.close();
            asyncEnd();
          });
        }
        break;
      case RawSocketEvent.readClosed:
        Expect.isFalse(serverReadClosedReceived);
        serverReadClosedReceived = true;
        break;
    }
  }

  serverSide.listen(serveData);
}

Future test() async {
  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
  server.listen(serverListen);
  client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
  client.shutdown(SocketDirection.send);
  client.listen((RawSocketEvent event) {
    if (event == RawSocketEvent.read) {
      client.read();
    }
  });
}

void main() {
  asyncStart();
  test();
}
