// 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 a shutdown(SocketDirection.send) of a socket,
// when the other end is already closed, does not discard unread data
// that remains in the connection.

// @dart = 2.9

import "dart:io";
import "dart:async";
import "package:expect/expect.dart";

RawServerSocket server;
RawSocket client;
Duration delay = new Duration(milliseconds: 100);

void serverListen(RawSocket serverSide) {
  var data = new List.generate(200, (i) => i % 20 + 65);
  var offset = 0;
  void serveData(RawSocketEvent event) {
    if (event == RawSocketEvent.write) {
      while (offset < data.length) {
        var written = serverSide.write(data, offset);
        offset += written;
        if (written == 0) {
          serverSide.writeEventsEnabled = true;
          return;
        }
      }
      serverSide.close();
      server.close();
    }
  }

  serverSide.listen(serveData);
}

void clientListen(RawSocketEvent event) {
  if (event == RawSocketEvent.read) {
    client.readEventsEnabled = false;
    new Future.delayed(delay, () {
      var data = client.read(100);
      if (data == null) {
        // If there is no data ready to read, wait until there is data
        // that can be read, before running the rest of the test.
        client.readEventsEnabled = true;
        return;
      }
      client.shutdown(SocketDirection.send);
      data = client.read(100);
      Expect.isNotNull(data);
      client.close();
    });
  }
}

test() async {
  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
  server.listen(serverListen);
  client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
  client.listen(clientListen);
}

void main() {
  test();
}
