// 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 int contentLength
///  read / write
/// Gets and sets the content length of the request. If the size of the request
/// is not known in advance set content length to -1, which is also the default.
/// @description Checks that setting of contentLength value to the longer value
/// leads to error.
/// @author sgrekhov@unipro.ru

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

var localhost = InternetAddress.loopbackIPv4.address;

test(String method) async {
  asyncStart();
  String helloWorld = "Hello test world!";
  HttpServer server = await HttpServer.bind(localhost, 0);
  server.listen((HttpRequest request) {
    request.response.write(helloWorld);
    request.response.close();
  });

  String data = "Hi there ";
  HttpClient client = new HttpClient();
  client.open(method, localhost, server.port, "")
      .then((HttpClientRequest request) {
        request.contentLength = data.length + 1;
        request.write(data);
        return request.close();
      })
      .then((HttpClientResponse response) {
          Expect.fail("Error expected");
      }, onError: (e) {
        Expect.isTrue(e is HttpException);
        server.close();
        asyncEnd();
  });
}

main() {
  test("POST");
  test("DELETE");
  test("PUT");
  test("GET");
  test("HEAD");
  test("PATCH");}
