// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library io_http_apptests;

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:apptest/apptest.dart';
import 'package:mojo/application.dart';
import 'package:mojo/bindings.dart';
import 'package:mojo/core.dart';

tests(Application application, String url) {
  group('Http Apptests', () {
    // Bind server to a random port.
    test('Http Server Bind', () async {
      var server = await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0);
      expect(server, isNotNull);
      expect(server.port, greaterThan(1024));
      await server.close();
    });
    // Bind server to a random port.
    // Make a request.
    // Expect a 404 response.
    test('Http Server Request 404', () async {
      var server = await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0);
      expect(server, isNotNull);
      expect(server.port, greaterThan(1024));
      server.listen((HttpRequest request) {
        request.response.statusCode = HttpStatus.NOT_FOUND;
        request.response.close();
      });
      var client = new HttpClient();
      expect(client, isNotNull);
      var request = await client.get("127.0.0.1", server.port, "fox.txt");
      expect(request, isNotNull);
      var response = await request.close();
      expect(response, isNotNull);
      expect(response.statusCode, equals(HttpStatus.NOT_FOUND));
      await server.close();
    });
    // Bind server to a random port.
    // Make a request.
    // Expect an OK response.
    test('Http Server Response', () async {
    var server = await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0);
      expect(server, isNotNull);
      expect(server.port, greaterThan(1024));
      server.listen((HttpRequest request) {
        expect(request.uri.path, equals('/bar.txt'));
        expect(request.method, equals('GET'));
        request.response.write('contents of bar.txt');
        request.response.close();
      });
      var client = new HttpClient();
      expect(client, isNotNull);
      var request = await client.get("127.0.0.1", server.port, 'bar.txt');
      expect(request, isNotNull);
      var response = await request.close();
      expect(response, isNotNull);
      expect(response.statusCode, equals(HttpStatus.OK));
      // Reduce to a single list.
      var payload = await response.reduce((p, e) => p..addAll(e));
      // Verify payload is correct.
      expect('contents of bar.txt', equals(UTF8.decode(payload)));
      await server.close();
    });
  });
}
