// Copyright (c) 2013, 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.

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

void testHEAD(int totalConnections) {
  HttpServer.bind("127.0.0.1", 0).then((server) {
    server.listen((request) {
      var response = request.response;
      if (request.uri.path == "/test100") {
        response.contentLength = 100;
        response.close();
      } else if (request.uri.path == "/test200") {
        response.contentLength = 200;
        List<int> data = new List<int>.filled(200, 0);
        response.add(data);
        response.close();
      } else if (request.uri.path == "/testChunked100") {
        List<int> data = new List<int>.filled(100, 0);
        response.add(data);
        response.close();
      } else if (request.uri.path == "/testChunked200") {
        List<int> data = new List<int>.filled(200, 0);
        response.add(data);
        response.close();
      } else {
        assert(false);
      }
    });

    HttpClient client = new HttpClient();

    int count = 0;

    requestDone() {
      count++;
      if (count == totalConnections * 2) {
        client.close();
        server.close();
      }
    }

    for (int i = 0; i < totalConnections; i++) {
      int len = (i % 2 == 0) ? 100 : 200;
      client
          .open("HEAD", "127.0.0.1", server.port, "/test$len")
          .then((request) => request.close())
          .then((HttpClientResponse response) {
        Expect.equals(len, response.contentLength);
        response.listen((_) => Expect.fail("Data from HEAD request"),
            onDone: requestDone);
      });

      client
          .open("HEAD", "127.0.0.1", server.port, "/testChunked$len")
          .then((request) => request.close())
          .then((HttpClientResponse response) {
        Expect.equals(-1, response.contentLength);
        response.listen((_) => Expect.fail("Data from HEAD request"),
            onDone: requestDone);
      });
    }
  });
}

void main() {
  testHEAD(4);
}
