/*
 * 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
 * StreamSubscription<RawSocketEvent> listen(
 *     void onData(
 *         T event
 *     ), {
 *     Function onError,
 *     void onDone(),
 *     bool cancelOnError
 * })
 * Adds a subscription to this stream.
 * . . .
 * While a subscription is paused, or when it has been cancelled, the
 * subscription doesn't receive events and none of the event handler functions
 * are called.
 *
 * @description Checks that while a subscription is paused, the subscription
 * doesn't receive events and none of the event handler functions are called.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

check(int n) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      StreamSubscription ss1 = null;
      StreamSubscription ss2 = null;
      int counter1 = 0;
      int counter2 = 0;
      int counter = 0;
      for (int i = 0; i < 9; i++) {
        producer.send([i], address, receiver.port);
      }
      producer.close();

      Stream bcs = receiver.asBroadcastStream();
      new Timer(const Duration(milliseconds: 200), () {
        Expect.isNull(receiver.receive());
        receiver.close();
      });

      ss1 = bcs.listen((event) {
        counter1++;
      }, onError: (e) {
        Expect.fail('Should not be here.');
      }, onDone: () {
        if (ss1.isPaused) {
          Expect.fail('Should not be here.');
        }
      });

      bcs.listen((event) {
        counter++;
        receiver.receive();
        if (counter == n) {
          ss1.pause();
          ss2.pause();
        }
        if (counter == 9) {
          Expect.isTrue(counter1 <= n);
          Expect.equals(counter, 9);
          Expect.isTrue(counter2 <= n);
          ss1.resume();
          ss2.resume();
        }
      }, onDone: () {
        asyncEnd();
      });

      ss2 = bcs.listen((event) {
        counter2++;
      }, onError: (e) {
        Expect.fail('Should not be here.');
      }, onDone: () {
        if (ss2.isPaused) {
          Expect.fail('Should not be here.');
        }
      });
    });
  });
}

main() {
  for (int i = 1; i < 10; i ++) {
    check(i);
  }
}
