// 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.

// @dart = 2.9

/// @assertion Future<E> drain<E>([E futureValue ])
/// Discards all data on the stream, but signals when it's done or an error
/// occurred.
///
/// When subscribing using drain, cancelOnError will be true. This means that the
/// future will complete with the first error on the stream and then cancel the
/// subscription.
///
/// In case of a done event the future completes with the given futureValue.
///
/// @description Checks that when all events are received with this stream,
/// [drain] discards all this events from the stream and returns given value.
/// @author ngl@unipro.ru

import "dart:async";
import "dart:io";
import "../http_utils.dart";
import "../../../Utils/expect.dart";

var localhost = InternetAddress.loopbackIPv4;

Future<dynamic> checkDrain(var value) async {
  RawDatagramSocket producer = await RawDatagramSocket.bind(localhost, 0);
  RawDatagramSocket receiver = await RawDatagramSocket.bind(localhost, 0);
  List<List<int>> toSend = [[0, 1, 2, 3], [1, 2, 3], [2, 3], [3], [4, 5], [5]];
  List<RawSocketEvent> received = [];
  Completer<dynamic> completer = new Completer<dynamic>();
  Future<dynamic> f = completer.future;
  Duration delay = const Duration(seconds: 2);

  bool wasSent = await sendDatagram(producer, toSend, localhost, receiver.port);
  Expect.isTrue(wasSent, "No datagram was sent");

  Stream bcs = receiver.asBroadcastStream();
  Future v = bcs.drain(value);
  v.then((drainValue) {
    if (!completer.isCompleted) {
      completer.complete(drainValue);
    }
    return f;
  });

  bcs.listen((event) {
    received.add(event);
    receiver.receive();
  });

  new Future.delayed(delay, () {
    if (!completer.isCompleted) {
      receiver.close();
    }
  });
  return f;
}

main() async {
  int attempts = 5;

  toCheck(var value) async {
    for (int i = 0; i < attempts; i++) {
      var received_value = await checkDrain(value);
      if (received_value == value) {
        break;
      }
      if (i == attempts - 1) {
        print('$received_value of drain not found. Look like test failed.');
      }
    }
  }

  await toCheck(null);
  await toCheck(18);
  await toCheck('abc');
  await toCheck(RawSocketEvent.write);
  await toCheck(RawSocketEvent.read);
  await toCheck(RawSocketEvent.closed);
  await toCheck(RawSocketEvent.readClosed);
}
