Files
sdk/pkg/http_server/test/virtual_host_test.dart
T
ajohnsen@google.com c9b66a7973 Add new VirtualHost class to http_server package, for handling multiple hosts on multiple sources (HttpServer's).
It uses a by-name aproach, and thus depends on the host field to be
present.

BUG=
R=sgjesse@google.com

Review URL: https://codereview.chromium.org//17581002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@24318 260f80e4-7a28-3924-810f-c04153c831b5
2013-06-24 10:07:19 +00:00

182 lines
7.1 KiB
Dart

// 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:async';
import 'dart:io';
import "package:unittest/unittest.dart";
import "package:http_server/http_server.dart";
import 'utils.dart';
void main() {
setupSecure();
test('empty-host', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
return getStatusCode(server.port, '/')
.whenComplete(server.close);
}), completion(equals(HttpStatus.FORBIDDEN)));
});
test('empty-host-unhandled', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.unhandled.first.then((request) {
request.response.close();
}), completion(isNull));
return getStatusCode(server.port, '/')
.whenComplete(server.close);
}), completion(equals(HttpStatus.OK)));
});
test('single-host', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('*.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
return getStatusCode(server.port, '/', host: 'my.host.com')
.whenComplete(server.close);
}), completion(equals(HttpStatus.OK)));
});
test('multiple-host', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('*.host1.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host2.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host3.com').first.then((request) {
request.response.close();
}), completion(isNull));
return Future.wait([
getStatusCode(server.port, '/', host: 'my.host1.com'),
getStatusCode(server.port, '/', host: 'my.host2.com'),
getStatusCode(server.port, '/', host: 'my.host3.com')])
.whenComplete(server.close);
}), completion(equals([HttpStatus.OK, HttpStatus.OK, HttpStatus.OK])));
});
test('multiple-source-https', () {
expect(Future.wait([
HttpServer.bind('localhost', 0),
HttpServer.bindSecure('localhost', 0, certificateName: CERTIFICATE)])
.then((servers) {
var virHost = new VirtualHost();
virHost.addSource(servers[0]);
virHost.addSource(servers[1]);
virHost.unhandled.listen((request) {
request.response.close();
});
return Future.wait([
getStatusCode(servers[0].port, '/', host: 'myhost1.com'),
getStatusCode(
servers[1].port, '/', host: 'myhost2.com', secure: true)])
.whenComplete(() => servers.forEach((s) => s.close()));
}), completion(equals([HttpStatus.OK, HttpStatus.OK])));
});
group('domain', () {
test('specific-sub-domain', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('my1.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('my2.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('my3.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
return Future.wait([
getStatusCode(server.port, '/', host: 'my1.host.com'),
getStatusCode(server.port, '/', host: 'my2.host.com'),
getStatusCode(server.port, '/', host: 'my3.host.com')])
.whenComplete(server.close);
}), completion(equals([HttpStatus.OK, HttpStatus.OK, HttpStatus.OK])));
});
test('wildcard-sub-domain', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('*.host1.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host2.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host3.com').first.then((request) {
request.response.close();
}), completion(isNull));
return Future.wait([
getStatusCode(server.port, '/', host: 'my.host1.com'),
getStatusCode(server.port, '/', host: 'my.host2.com'),
getStatusCode(server.port, '/', host: 'my.host3.com')])
.whenComplete(server.close);
}), completion(equals([HttpStatus.OK, HttpStatus.OK, HttpStatus.OK])));
});
test('mix-sub-domain', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('my1.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('my2.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
return Future.wait([
getStatusCode(server.port, '/', host: 'my1.host.com'),
getStatusCode(server.port, '/', host: 'my2.host.com'),
getStatusCode(server.port, '/', host: 'my3.host.com')])
.whenComplete(server.close);
}), completion(equals([HttpStatus.OK, HttpStatus.OK, HttpStatus.OK])));
});
test('wildcard', () {
expect(HttpServer.bind('localhost', 0).then((server) {
var virHost = new VirtualHost(server);
expect(virHost.addHost('*').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.com').first.then((request) {
request.response.close();
}), completion(isNull));
expect(virHost.addHost('*.host.com').first.then((request) {
request.response.close();
}), completion(isNull));
return Future.wait([
getStatusCode(server.port, '/', host: 'some.host.dk'),
getStatusCode(server.port, '/', host: 'my.host2.com'),
getStatusCode(server.port, '/', host: 'long.sub.of.host.com')])
.whenComplete(server.close);
}), completion(equals([HttpStatus.OK, HttpStatus.OK, HttpStatus.OK])));
});
test('duplicate-domain', () {
var virHost = new VirtualHost();
virHost.addHost('my1.host.com');
expect(() => (virHost.addHost('my1.host.com')), throwsArgumentError);
virHost.addHost('*.host.com');
expect(() => (virHost.addHost('*.host.com')), throwsArgumentError);
virHost.addHost('my2.host.com');
virHost.addHost('my3.host.com');
virHost.addHost('*.com');
virHost.addHost('*');
expect(() => (virHost.addHost('*')), throwsArgumentError);
});
});
}