// 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 != null && 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 != null && ss2.isPaused) {
          Expect.fail('Should not be here.');
        }
      });
    });
  });
}

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