/*
 * Copyright (c) 2018, 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.
 */
/**
 * @assertion
 * Stream<RawSocketEvent> timeout (
 *     Duration timeLimit, {
 *     void onTimeout(
 *         EventSink<T> sink
 *     )
 * })
 * . . .
 * Whenever more than timeLimit passes between two events from this stream, the
 * onTimeout function is called, which can emit further events on the returned
 * stream.
 *
 * The countdown doesn't start until the returned stream is listened to. The
 * countdown is reset every time an event is forwarded from this stream, or when
 * the stream is paused and resumed.
 *
 * @description Checks that whenever more than timeLimit passes between two
 * events from this stream, the onTimeout function is called, which can emit
 * further events on the returned stream.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

check(List dataExpected, [bool no_write_events = false]) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      if (no_write_events) {
        receiver.writeEventsEnabled = false;
      }
      int count = 0;
      int sent = 0;
      List list = [];
      bool writeDataNotNull = false;
      int totalSent = 0;

      new Timer.periodic(const Duration(milliseconds: 20), (timer) {
        totalSent += producer.send([sent], address, receiver.port);
        sent++;
        if (sent > 2) {
          timer.cancel();
          if (totalSent != sent) {
            Expect.fail('$totalSent messages were sent instead of $sent.');
          }
          producer.close();
        }
      });

      Stream s = receiver.timeout(const Duration(milliseconds: 5),
          onTimeout: (EventSink sink) {
        count++;
      });
      Timer? timer;
      s.listen((event) {
        list.add(event);
        Datagram? d = receiver.receive();
        if (event == RawSocketEvent.write && d != null) {
          writeDataNotNull = true;
        }
        timer?.cancel();
        timer = new Timer(const Duration(milliseconds: 200), () {
          Expect.isNull(receiver.receive());
          receiver.close();
        });
      }, onDone: () {
        Expect.isTrue(count > 0);
        if (writeDataNotNull) {
          dataExpected.removeAt(1);
        }
        Expect.deepEquals(dataExpected, list);
        timer?.cancel();
        asyncEnd();
      });
    });
  });
}

main() {
  check([
    RawSocketEvent.write,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.closed
  ]);
  check([
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.closed
  ], true);
}
