// Copyright (c) 2017, 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 Datagram receive()
/// Receive a datagram.
/// . . .
/// The maximum length of the datagram that can be received is 65503 bytes.
///
/// @description Checks that the 65504 bytes datagram can not be received.
/// @author ngl@unipro.ru
/// @issue 31733

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

var localhost = InternetAddress.loopbackIPv4;
int datagramLength = 65504;

main() async {
  RawDatagramSocket producer = await RawDatagramSocket.bind(localhost, 0);
  RawDatagramSocket receiver = await RawDatagramSocket.bind(localhost, 0);
  List<int> sList = new List<int>.filled(datagramLength, 0);
  for (int i = 0; i < datagramLength; i++) {
    sList[i] = i & 0xff;
  }
  List<List<int>> toSend = [sList];
  bool wasSent =
      await sendDatagram(producer, toSend, localhost, receiver.port);
  Expect.isTrue(wasSent, "No datagram was sent");

  List<List<int>> received = await receiveDatagram(receiver);
  if (received.length > 0){
    for (int i = 0; i < received.length; i++) {
      if (received[i] == null) {
        continue;
      }
      Expect.notEquals(datagramLength, received[i].length,
          "Wrong length of the datagram received");
    }
  }
}
