// 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 "package:http_io/http_io.dart";
import "package:test/test.dart";

void doExpect(HttpClient client, String url, String error) {
  expect(() => client.getUrl(Uri.parse(url)),
      throwsA(predicate((e) => e.toString().contains(error))));
}

void testInvalidUrl() {
  HttpClient client = new HttpClient();
  List<List<String>> tests = <List<String>>[
    <String>["ftp://www.google.com", "Unsupported scheme"],
    <String>["httpx://www.google.com", "Unsupported scheme"],
    <String>["http://user@:1", "No host specified"],
    <String>["http:///", "No host specified"],
    <String>["http:///index.html", "No host specified"],
    <String>["///", "No host specified"],
    <String>["///index.html", "No host specified"],
  ];

  for (List<String> pair in tests) {
    doExpect(client, pair[0], pair[1]);
  }

  expect(() => client.getUrl(Uri.parse("http://::1")), throwsFormatException);
}

void testBadHostName() {
  HttpClient client = new HttpClient();
  expect(() => client.get("some.bad.host.name.7654321", 0, "/"),
      throwsA(predicate((e) => e.toString().contains("Failed host lookup"))));
}

void main() {
  test("InvalidUrl", testInvalidUrl);
  test("BadHostName", testBadHostName);
}
