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

Side by Side Diff: pkg/http_server/test/virtual_directory_test.dart

Issue 17582002: Add support for IfModifiedSince headers, in http_servers' VirtualDirectory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Merge. Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/http_server/lib/src/virtual_directory.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'dart:async';
5 import 'dart:io'; 6 import 'dart:io';
6 7
7 import "package:unittest/unittest.dart"; 8 import "package:unittest/unittest.dart";
8 import "package:http_server/http_server.dart"; 9 import "package:http_server/http_server.dart";
9 10
10 11
12 Future<int> getStatusCode(int port,
13 String path,
14 {DateTime ifModifiedSince}) {
15 return new HttpClient().get('localhost', port, path)
16 .then((request) {
17 if (ifModifiedSince != null) {
18 request.headers.ifModifiedSince = ifModifiedSince;
19 }
20 return request.close();
21 })
22 .then((response) => response.drain().then(
23 (_) => response.statusCode));
24 }
25
26 Future<HttpHeaders> getHeaders(int port, String path) {
27 return new HttpClient().get('localhost', port, path)
28 .then((request) => request.close())
29 .then((response) => response.drain().then(
30 (_) => response.headers));
31 }
32
33
11 void main() { 34 void main() {
12 group('serve-root', () { 35 group('serve-root', () {
13 test('dir-exists', () { 36 test('dir-exists', () {
14 expect(HttpServer.bind('localhost', 0).then((server) { 37 expect(HttpServer.bind('localhost', 0).then((server) {
15 var dir = new Directory('').createTempSync(); 38 var dir = new Directory('').createTempSync();
16 var virDir = new VirtualDirectory(dir.path); 39 var virDir = new VirtualDirectory(dir.path);
17 40
18 virDir.serve(server); 41 virDir.serve(server);
19 42
20 return new HttpClient().get('localhost', server.port, '/') 43 return getStatusCode(server.port, '/')
21 .then((request) => request.close())
22 .then((response) => response.drain().then(
23 (_) => response.statusCode))
24 .whenComplete(() { 44 .whenComplete(() {
25 server.close(); 45 server.close();
26 dir.deleteSync(); 46 dir.deleteSync();
27 }); 47 });
28 }), completion(equals(HttpStatus.NOT_FOUND))); 48 }), completion(equals(HttpStatus.NOT_FOUND)));
29 }); 49 });
30 50
31 test('dir-not-exists', () { 51 test('dir-not-exists', () {
32 expect(HttpServer.bind('localhost', 0).then((server) { 52 expect(HttpServer.bind('localhost', 0).then((server) {
33 var dir = new Directory('').createTempSync(); 53 var dir = new Directory('').createTempSync();
34 dir.deleteSync(); 54 dir.deleteSync();
35 var virDir = new VirtualDirectory(dir.path); 55 var virDir = new VirtualDirectory(dir.path);
36 56
37 virDir.serve(server); 57 virDir.serve(server);
38 58
39 return new HttpClient().get('localhost', server.port, '/') 59 return getStatusCode(server.port, '/')
40 .then((request) => request.close())
41 .then((response) => response.drain().then(
42 (_) => response.statusCode))
43 .whenComplete(() { 60 .whenComplete(() {
44 server.close(); 61 server.close();
45 }); 62 });
46 }), completion(equals(HttpStatus.NOT_FOUND))); 63 }), completion(equals(HttpStatus.NOT_FOUND)));
47 }); 64 });
48 }); 65 });
49 66
50 group('serve-file', () { 67 group('serve-file', () {
51 group('top-level', () { 68 group('top-level', () {
52 test('file-exists', () { 69 test('file-exists', () {
53 expect(HttpServer.bind('localhost', 0).then((server) { 70 expect(HttpServer.bind('localhost', 0).then((server) {
54 var dir = new Directory('').createTempSync(); 71 var dir = new Directory('').createTempSync();
55 var file = new File('${dir.path}/file')..createSync(); 72 var file = new File('${dir.path}/file')..createSync();
56 var virDir = new VirtualDirectory(dir.path); 73 var virDir = new VirtualDirectory(dir.path);
57 74
58 virDir.serve(server); 75 virDir.serve(server);
59 76
60 return new HttpClient().get('localhost', server.port, '/file') 77 return getStatusCode(server.port, '/file')
61 .then((request) => request.close())
62 .then((response) => response.drain().then(
63 (_) => response.statusCode))
64 .whenComplete(() { 78 .whenComplete(() {
65 server.close(); 79 server.close();
66 file.deleteSync(); 80 dir.deleteSync(recursive: true);
67 dir.deleteSync();
68 }); 81 });
69 }), completion(equals(HttpStatus.OK))); 82 }), completion(equals(HttpStatus.OK)));
70 }); 83 });
71 84
72 test('file-not-exists', () { 85 test('file-not-exists', () {
73 expect(HttpServer.bind('localhost', 0).then((server) { 86 expect(HttpServer.bind('localhost', 0).then((server) {
74 var dir = new Directory('').createTempSync(); 87 var dir = new Directory('').createTempSync();
75 var virDir = new VirtualDirectory(dir.path); 88 var virDir = new VirtualDirectory(dir.path);
76 89
77 virDir.serve(server); 90 virDir.serve(server);
78 91
79 return new HttpClient().get('localhost', server.port, '/file') 92 return getStatusCode(server.port, '/file')
80 .then((request) => request.close())
81 .then((response) => response.drain().then(
82 (_) => response.statusCode))
83 .whenComplete(() { 93 .whenComplete(() {
84 server.close(); 94 server.close();
85 dir.deleteSync(); 95 dir.deleteSync();
86 }); 96 });
87 }), completion(equals(HttpStatus.NOT_FOUND))); 97 }), completion(equals(HttpStatus.NOT_FOUND)));
88 }); 98 });
89 }); 99 });
90 100
91 group('in-dir', () { 101 group('in-dir', () {
92 test('file-exists', () { 102 test('file-exists', () {
93 expect(HttpServer.bind('localhost', 0).then((server) { 103 expect(HttpServer.bind('localhost', 0).then((server) {
94 var dir = new Directory('').createTempSync(); 104 var dir = new Directory('').createTempSync();
95 var dir2 = new Directory('${dir.path}/dir')..createSync(); 105 var dir2 = new Directory('${dir.path}/dir')..createSync();
96 var file = new File('${dir2.path}/file')..createSync(); 106 var file = new File('${dir2.path}/file')..createSync();
97 var virDir = new VirtualDirectory(dir.path); 107 var virDir = new VirtualDirectory(dir.path);
98 108
99 virDir.serve(server); 109 virDir.serve(server);
100 110
101 return new HttpClient().get('localhost', server.port, '/dir/file') 111 return getStatusCode(server.port, '/dir/file')
102 .then((request) => request.close())
103 .then((response) => response.drain().then(
104 (_) => response.statusCode))
105 .whenComplete(() { 112 .whenComplete(() {
106 server.close(); 113 server.close();
107 file.deleteSync(); 114 dir.deleteSync(recursive: true);
108 dir2.deleteSync();
109 dir.deleteSync();
110 }); 115 });
111 }), completion(equals(HttpStatus.OK))); 116 }), completion(equals(HttpStatus.OK)));
112 }); 117 });
113 118
114 test('file-not-exists', () { 119 test('file-not-exists', () {
115 expect(HttpServer.bind('localhost', 0).then((server) { 120 expect(HttpServer.bind('localhost', 0).then((server) {
116 var dir = new Directory('').createTempSync(); 121 var dir = new Directory('').createTempSync();
117 var dir2 = new Directory('${dir.path}/dir')..createSync(); 122 var dir2 = new Directory('${dir.path}/dir')..createSync();
118 var file = new File('${dir.path}/file')..createSync(); 123 var file = new File('${dir.path}/file')..createSync();
119 var virDir = new VirtualDirectory(dir.path); 124 var virDir = new VirtualDirectory(dir.path);
120 125
121 virDir.serve(server); 126 virDir.serve(server);
122 127
123 return new HttpClient().get('localhost', server.port, '/dir/file') 128 return getStatusCode(server.port, '/dir/file')
124 .then((request) => request.close())
125 .then((response) => response.drain().then(
126 (_) => response.statusCode))
127 .whenComplete(() { 129 .whenComplete(() {
128 server.close(); 130 server.close();
129 file.deleteSync(); 131 dir.deleteSync(recursive: true);
130 dir2.deleteSync();
131 dir.deleteSync();
132 }); 132 });
133 }), completion(equals(HttpStatus.NOT_FOUND))); 133 }), completion(equals(HttpStatus.NOT_FOUND)));
134 }); 134 });
135 }); 135 });
136 }); 136 });
137 137
138 group('links', () { 138 group('links', () {
139 if (!Platform.isWindows) { 139 if (!Platform.isWindows) {
140 group('follow-links', () { 140 group('follow-links', () {
141 test('dir-link', () { 141 test('dir-link', () {
142 expect(HttpServer.bind('localhost', 0).then((server) { 142 expect(HttpServer.bind('localhost', 0).then((server) {
143 var dir = new Directory('').createTempSync(); 143 var dir = new Directory('').createTempSync();
144 var dir2 = new Directory('${dir.path}/dir2')..createSync(); 144 var dir2 = new Directory('${dir.path}/dir2')..createSync();
145 var link = new Link('${dir.path}/dir3')..createSync('dir2'); 145 var link = new Link('${dir.path}/dir3')..createSync('dir2');
146 var file = new File('${dir2.path}/file')..createSync(); 146 var file = new File('${dir2.path}/file')..createSync();
147 var virDir = new VirtualDirectory(dir.path); 147 var virDir = new VirtualDirectory(dir.path);
148 virDir.followLinks = true; 148 virDir.followLinks = true;
149 149
150 virDir.serve(server); 150 virDir.serve(server);
151 151
152 return new HttpClient().get('localhost', server.port, '/dir3/file') 152 return getStatusCode(server.port, '/dir3/file')
153 .then((request) => request.close())
154 .then((response) => response.drain().then(
155 (_) => response.statusCode))
156 .whenComplete(() { 153 .whenComplete(() {
157 server.close(); 154 server.close();
158 dir.deleteSync(recursive: true); 155 dir.deleteSync(recursive: true);
159 }); 156 });
160 }), completion(equals(HttpStatus.OK))); 157 }), completion(equals(HttpStatus.OK)));
161 }); 158 });
162 159
163 test('root-link', () { 160 test('root-link', () {
164 expect(HttpServer.bind('localhost', 0).then((server) { 161 expect(HttpServer.bind('localhost', 0).then((server) {
165 var dir = new Directory('').createTempSync(); 162 var dir = new Directory('').createTempSync();
166 var link = new Link('${dir.path}/dir3')..createSync('.'); 163 var link = new Link('${dir.path}/dir3')..createSync('.');
167 var file = new File('${dir.path}/file')..createSync(); 164 var file = new File('${dir.path}/file')..createSync();
168 var virDir = new VirtualDirectory(dir.path); 165 var virDir = new VirtualDirectory(dir.path);
169 virDir.followLinks = true; 166 virDir.followLinks = true;
170 167
171 virDir.serve(server); 168 virDir.serve(server);
172 169
173 return new HttpClient().get('localhost', server.port, '/dir3/file') 170 return getStatusCode(server.port, '/dir3/file')
174 .then((request) => request.close())
175 .then((response) => response.drain().then(
176 (_) => response.statusCode))
177 .whenComplete(() { 171 .whenComplete(() {
178 server.close(); 172 server.close();
179 dir.deleteSync(recursive: true); 173 dir.deleteSync(recursive: true);
180 }); 174 });
181 }), completion(equals(HttpStatus.OK))); 175 }), completion(equals(HttpStatus.OK)));
182 }); 176 });
183 177
184 group('bad-links', () { 178 group('bad-links', () {
185 test('absolute-link', () { 179 test('absolute-link', () {
186 expect(HttpServer.bind('localhost', 0).then((server) { 180 expect(HttpServer.bind('localhost', 0).then((server) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 expect(HttpServer.bind('localhost', 0).then((server) { 232 expect(HttpServer.bind('localhost', 0).then((server) {
239 var dir = new Directory('').createTempSync(); 233 var dir = new Directory('').createTempSync();
240 var dir2 = new Directory('${dir.path}/dir2')..createSync(); 234 var dir2 = new Directory('${dir.path}/dir2')..createSync();
241 var link = new Link('${dir.path}/dir3')..createSync('dir2'); 235 var link = new Link('${dir.path}/dir3')..createSync('dir2');
242 var file = new File('${dir2.path}/file')..createSync(); 236 var file = new File('${dir2.path}/file')..createSync();
243 var virDir = new VirtualDirectory(dir.path); 237 var virDir = new VirtualDirectory(dir.path);
244 virDir.followLinks = false; 238 virDir.followLinks = false;
245 239
246 virDir.serve(server); 240 virDir.serve(server);
247 241
248 return new HttpClient().get('localhost', server.port, '/dir3/file') 242 return getStatusCode(server.port, '/dir3/file')
249 .then((request) => request.close())
250 .then((response) => response.drain().then(
251 (_) => response.statusCode))
252 .whenComplete(() { 243 .whenComplete(() {
253 server.close(); 244 server.close();
254 dir.deleteSync(recursive: true); 245 dir.deleteSync(recursive: true);
255 }); 246 });
256 }), completion(equals(HttpStatus.NOT_FOUND))); 247 }), completion(equals(HttpStatus.NOT_FOUND)));
257 }); 248 });
258 }); 249 });
259 } 250 }
260 }); 251 });
252
253 group('last-mofidied', () {
254 group('file', () {
255 test('file-exists', () {
256 expect(HttpServer.bind('localhost', 0).then((server) {
257 var dir = new Directory('').createTempSync();
258 var file = new File('${dir.path}/file')..createSync();
259 var virDir = new VirtualDirectory(dir.path);
260
261 virDir.serve(server);
262
263 return getHeaders(server.port, '/file')
264 .then((headers) {
265 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull);
266 return HttpDate.parse(
267 headers.value(HttpHeaders.LAST_MODIFIED));
268 })
269 .then((lastModified) {
270 return getStatusCode(
271 server.port, '/file', ifModifiedSince: lastModified);
272 })
273 .whenComplete(() {
274 server.close();
275 dir.deleteSync(recursive: true);
276 });
277 }), completion(equals(HttpStatus.NOT_MODIFIED)));
278 });
279
280 test('file-changes', () {
281 expect(HttpServer.bind('localhost', 0).then((server) {
282 var dir = new Directory('').createTempSync();
283 var file = new File('${dir.path}/file')..createSync();
284 var virDir = new VirtualDirectory(dir.path);
285
286 virDir.serve(server);
287
288 return getHeaders(server.port, '/file')
289 .then((headers) {
290 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull);
291 return HttpDate.parse(
292 headers.value(HttpHeaders.LAST_MODIFIED));
293 })
294 .then((lastModified) {
295 // Fake file changed by moving date back in time.
296 lastModified = lastModified.subtract(
297 const Duration(seconds: 10));
298 return getStatusCode(
299 server.port, '/file', ifModifiedSince: lastModified);
300 })
301 .whenComplete(() {
302 server.close();
303 dir.deleteSync(recursive: true);
304 });
305 }), completion(equals(HttpStatus.OK)));
306 });
307 });
308 });
261 } 309 }
262 310
OLDNEW
« no previous file with comments | « pkg/http_server/lib/src/virtual_directory.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698