Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(794)

Unified Diff: pkg/scheduled_test/test/scheduled_server_test.dart

Issue 12809002: Add a ScheduledServer class. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/scheduled_test/pubspec.yaml ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/scheduled_test/test/scheduled_server_test.dart
diff --git a/pkg/scheduled_test/test/scheduled_server_test.dart b/pkg/scheduled_test/test/scheduled_server_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..5fc78120a3866f592ca33b2f4bb61d4d88370936
--- /dev/null
+++ b/pkg/scheduled_test/test/scheduled_server_test.dart
@@ -0,0 +1,305 @@
+// 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.
+
+library scheduled_server_test;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../../../pkg/http/lib/http.dart' as http;
+import '../lib/scheduled_server.dart';
+import '../lib/scheduled_test.dart';
+import '../lib/src/mock_clock.dart' as mock_clock;
+
+import 'metatest.dart';
+import 'utils.dart';
+
+void main() {
+ expectTestsPass("a server with no handlers does nothing", () {
+ test('test', () => new ScheduledServer());
+ });
+
+ expectTestsPass("a server with no handlers that receives a request throws an "
+ "error", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals("'scheduled server 0' received GET /hello "
+ "when no more requests were expected."));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("a handler runs when it's hit", () {
+ test('test', () {
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ });
+ });
+ });
+
+ expectTestsPass("a handler blocks the schedule on the returned future", () {
+ test('test', () {
+ var blockedOnFuture = false;
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ return pumpEventQueue().then((_) {
+ blockedOnFuture = true;
+ });
+ });
+
+ schedule(() => expect(blockedOnFuture, isTrue));
+ });
+ });
+
+ expectTestsPass("a handler fails if it's hit too early", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ var response = server.url.then((url) => http.read(url.resolve('/hello')));
+ expect(response, completion(equals('Hello, test!')));
+
+ // Block the schedule until we're sure the request has hit the server.
+ schedule(() => response);
+
+ // Add a task's worth of space to avoid hitting the heuristic of waiting
+ // for the immediately-preceding task.
+ schedule(() => null);
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ });
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals("'scheduled server 0' received GET /hello "
+ "earlier than expected."));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("a handler waits for the immediately prior task to complete "
+ "before checking if it's too early", () {
+ test('test', () {
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+
+ // Sleeping here is unfortunate, but we want to be sure that the HTTP
+ // request hits the server during this test without actually blocking the
+ // task on the request completing.
+ //
+ // This is also a potential race condition, but hopefully a local HTTP
+ // request won't take 1s.
+ schedule(() => new Future.delayed(new Duration(seconds: 1)));
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ });
+ });
+ });
+
+ expectTestsPass("a handler fails if the url is wrong", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+
+ server.handle('GET', '/goodbye', (request) {
+ request.response.write('Goodbye, test!');
+ request.response.close();
+ });
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals("'scheduled server 0' expected GET "
+ "/goodbye, but got GET /hello."));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("a handler fails if the method is wrong", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.head(url.resolve('/hello'))),
+ completes);
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ });
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals("'scheduled server 0' expected GET "
+ "/hello, but got HEAD /hello."));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("a handler times out waiting to be hit", () {
+ var clock = mock_clock.mock()..run();
+ var timeOfException;
+ var errors;
+ test('test 1', () {
+ currentSchedule.timeout = new Duration(milliseconds: 2);
+ currentSchedule.onException.schedule(() {
+ timeOfException = clock.time;
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+
+ server.handle('GET', '/hello', (request) {
+ request.response.write('Hello, test!');
+ request.response.close();
+ });
+ });
+
+ test('test 2', () {
+ expect(clock.time, equals(2));
+
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.map((e) => e.error), equals(["The schedule timed out after "
+ "0:00:00.002000 of inactivity."]));
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("multiple handlers in series respond to requests in series",
+ () {
+ test('test', () {
+ var server = new ScheduledServer();
+ expect(server.url.then((url) {
+ return http.read(url.resolve('/hello/1')).then((response) {
+ expect(response, equals('Hello, request 1!'));
+ return http.read(url.resolve('/hello/2'));
+ }).then((response) {
+ expect(response, equals('Hello, request 2!'));
+ return http.read(url.resolve('/hello/3'));
+ }).then((response) => expect(response, equals('Hello, request 3!')));
+ }), completes);
+
+ server.handle('GET', '/hello/1', (request) {
+ request.response.write('Hello, request 1!');
+ request.response.close();
+ });
+
+ server.handle('GET', '/hello/2', (request) {
+ request.response.write('Hello, request 2!');
+ request.response.close();
+ });
+
+ server.handle('GET', '/hello/3', (request) {
+ request.response.write('Hello, request 3!');
+ request.response.close();
+ });
+ });
+ });
+
+ expectTestsPass("a server that receives a request after all its handlers "
+ "have run throws an error", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ expect(server.url.then((url) {
+ return http.read(url.resolve('/hello/1')).then((response) {
+ expect(response, equals('Hello, request 1!'));
+ return http.read(url.resolve('/hello/2'));
+ }).then((response) {
+ expect(response, equals('Hello, request 2!'));
+ return http.read(url.resolve('/hello/3'));
+ }).then((response) => expect(response, equals('Hello, request 3!')));
+ }), completes);
+
+ server.handle('GET', '/hello/1', (request) {
+ request.response.write('Hello, request 1!');
+ request.response.close();
+ });
+
+ server.handle('GET', '/hello/2', (request) {
+ request.response.write('Hello, request 2!');
+ request.response.close();
+ });
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals("'scheduled server 0' received GET "
+ "/hello/3 when no more requests were expected."));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+
+ expectTestsPass("an error in a handler doesn't cause a timeout", () {
+ var errors;
+ test('test 1', () {
+ currentSchedule.onException.schedule(() {
+ errors = currentSchedule.errors;
+ });
+
+ var server = new ScheduledServer();
+ expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+ completion(equals('Hello, test!')));
+
+ server.handle('GET', '/hello', (request) {
+ throw 'oh no';
+ });
+ });
+
+ test('test 2', () {
+ expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
+ expect(errors.length, equals(2));
+ expect(errors[0].error, equals('oh no'));
+ expect(errors[1].error, new isInstanceOf<HttpParserException>());
+ });
+ }, passing: ['test 2']);
+}
« no previous file with comments | « pkg/scheduled_test/pubspec.yaml ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698