// 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 has been cancelled, 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();
      });

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

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

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

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