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

// @dart = 2.9

/// @assertion void add(List<int> data)
///  Adds byte data to the target consumer, ignoring encoding.
///
/// The encoding does not apply to this method, and the data list is passed
/// directly to the target consumer as a stream event.
///
/// This function must not be called when a stream is currently being added using
/// addStream.
///
/// This operation is non-blocking. See flush or done for how to get any errors
/// generated by this call.
///
/// The data list should not be modified after it has been passed to add.
/// @description Checks that this method adds byte data to the target consumer.
/// Test long list
/// @author sgrekhov@unipro.ru

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

var localhost = InternetAddress.loopbackIPv4.address;

List<int> list = new List(1000);

test(String method) async {
  asyncStart();
  String helloWorld = "Hello test world!";
  HttpServer server = await HttpServer.bind(localhost, 0);
  server.listen((HttpRequest request) {
    request.toList().then((data) {
      Expect.listEquals([list], data);
      request.response.write(helloWorld);
      request.response.close();
      server.close();
    });
  });

  HttpClient client = new HttpClient();
  client.open(method, localhost, server.port, "")
      .then((HttpClientRequest request) {
    request.contentLength = list.length;
    request.add(list);
    return request.close();
  }).then((HttpClientResponse response) {
    response.cast<List<int>>().transform(utf8.decoder).listen((content) {});
    asyncEnd();
  });
}

main() {
  for (var i = 0; i < list.length; i++) {
    list[i] = i % 255;
  }
  test("get");
  test("head");
  test("delete");
  test("put");
  test("post");
  test("patch");
}
