/*
 * 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
 *     )
 * })
 * . . .
 * If a broadcast stream is listened to more than once, each subscription will
 * have its individually timer that starts counting on listen, and the
 * subscriptions' timers can be paused individually.
 *
 * @description Checks that if a broadcast stream is listened to more than once,
 * each subscription will have its individually timer that starts counting on
 * listen.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

check(dataExpected, errorCountExpected, [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 count1 = 0;
      int count2 = 0;
      int sent = 0;
      List list1 = [];
      List list2 = [];
      int totalSent = 0;

      new Timer.periodic(const Duration(milliseconds: 40), (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 bcs = receiver.asBroadcastStream();
      Stream s = bcs.timeout(durationMs(1));
      s.listen((event) {
        list1.add(event);
        receiver.receive();
      }, onError: (e) {
        Expect.isTrue(e is TimeoutException);
        count1++;
      }, onDone: () {
      });

      Timer? timer;
      s.listen((event) {
        list2.add(event);
        timer?.cancel();
        timer = new Timer(const Duration(milliseconds: 200), () {
          Expect.isNull(receiver.receive());
          receiver.close();
        });
      }, onError: (e) {
        Expect.isTrue(e is TimeoutException);
        count2++;
      }, onDone: () {
        timer?.cancel();
        Expect.equals(count1, count2);
        Expect.deepEquals(list1, list2);
        asyncEnd();
      });
    });
  });
}

main() {
  List expected = [
    RawSocketEvent.write,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.closed
  ];
  check(expected, 4);
  check(expected.sublist(1), 4, true);
}
