// 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.
//
// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write

import 'package:expect/expect.dart';
import 'dart:io';
import 'dart:typed_data';

void testServerCompress({bool clientAutoUncompress: true}) async {
  void test(List<int> data) async {
    final server = await HttpServer.bind("127.0.0.1", 0);
    server.autoCompress = true;
    server.listen((request) {
      request.response.add(data);
      request.response.close();
    });
    var client = new HttpClient();
    client.autoUncompress = clientAutoUncompress;
    final request = await client.get("127.0.0.1", server.port, "/");
    request.headers.set(HttpHeaders.acceptEncodingHeader, "gzip,deflate");
    final response = await request.close();
    Expect.equals(
        "gzip", response.headers.value(HttpHeaders.contentEncodingHeader));
    final list = await response.fold(<int>[], (list, b) => list..addAll(b));
    if (clientAutoUncompress) {
      Expect.listEquals(data, list);
    } else {
      Expect.listEquals(data, gzip.decode(list));
    }
    server.close();
    client.close();
  }

  await test("My raw server provided data".codeUnits);
  var longBuffer = new Uint8List(1024 * 1024);
  for (int i = 0; i < longBuffer.length; i++) {
    longBuffer[i] = i & 0xFF;
  }
  await test(longBuffer);
}

void testAcceptEncodingHeader() async {
  void test(String encoding, bool valid) async {
    final server = await HttpServer.bind("127.0.0.1", 0);
    server.autoCompress = true;
    server.listen((request) {
      request.response.write("data");
      request.response.close();
    });
    var client = new HttpClient();
    final request = await client.get("127.0.0.1", server.port, "/");
    request.headers.set(HttpHeaders.acceptEncodingHeader, encoding);
    final response = await request.close();
    Expect.equals(valid,
        ("gzip" == response.headers.value(HttpHeaders.contentEncodingHeader)));
    await response.listen((_) {}).asFuture();
    server.close();
    client.close();
  }

  await test('gzip', true);
  await test('deflate', false);
  await test('gzip, deflate', true);
  await test('gzip ,deflate', true);
  await test('gzip  ,  deflate', true);
  await test('deflate,gzip', true);
  await test('deflate, gzip', true);
  await test('deflate ,gzip', true);
  await test('deflate  ,  gzip', true);
  await test('abc,deflate  ,  gzip,def,,,ghi  ,jkl', true);
  await test('xgzip', false);
  await test('gzipx;', false);
}

void testDisableCompressTest() async {
  final server = await HttpServer.bind("127.0.0.1", 0);
  Expect.equals(false, server.autoCompress);
  server.listen((request) {
    Expect.equals(
        'gzip', request.headers.value(HttpHeaders.acceptEncodingHeader));
    request.response.write("data");
    request.response.close();
  });
  final client = new HttpClient();
  final request = await client.get("127.0.0.1", server.port, "/");
  final response = await request.close();
  Expect.equals(
      null, response.headers.value(HttpHeaders.contentEncodingHeader));
  await response.listen((_) {}).asFuture();
  server.close();
  client.close();
}

void main() async {
  await testServerCompress();
  await testServerCompress(clientAutoUncompress: false);
  await testAcceptEncodingHeader();
  await testDisableCompressTest();
}
