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

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

Issue 124693002: pkg/http_server: virtual dir test cleanup (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 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
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:async';
6 import 'dart:io'; 6 import 'dart:io';
7 7
8 import "package:http_server/http_server.dart"; 8 import "package:http_server/http_server.dart";
9 import 'package:path/path.dart' as pathos;
9 import "package:unittest/unittest.dart"; 10 import "package:unittest/unittest.dart";
10 11
11 import 'utils.dart'; 12 import 'utils.dart';
12 13
13
14 void main() { 14 void main() {
15 group('serve-root', () { 15 group('serve-root', () {
16 test('dir-exists', () { 16 _testVirDir('dir-exists', (server, dir) {
17 expect(HttpServer.bind('localhost', 0).then((server) {
18 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
19 var virDir = new VirtualDirectory(dir.path);
20 17
21 virDir.serve(server); 18 var virDir = new VirtualDirectory(dir.path);
19 virDir.serve(server);
22 20
23 return getStatusCode(server.port, '/') 21 return getStatusCode(server.port, '/')
24 .whenComplete(() { 22 .then((result) {
25 server.close(); 23 expect(result, HttpStatus.NOT_FOUND);
26 dir.deleteSync(); 24 });
27 });
28 }), completion(equals(HttpStatus.NOT_FOUND)));
29 }); 25 });
30 26
31 test('dir-not-exists', () { 27 _testVirDir('dir-not-exists', (server, dir) {
32 expect(HttpServer.bind('localhost', 0).then((server) { 28 var virDir = new VirtualDirectory(pathos.join(dir.path + 'foo'));
33 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
34 dir.deleteSync();
35 var virDir = new VirtualDirectory(dir.path);
36 29
37 virDir.serve(server); 30 virDir.serve(server);
38 31
39 return getStatusCode(server.port, '/') 32 return getStatusCode(server.port, '/')
40 .whenComplete(() { 33 .then((result) {
41 server.close(); 34 expect(result, HttpStatus.NOT_FOUND);
42 }); 35 });
43 }), completion(equals(HttpStatus.NOT_FOUND)));
44 }); 36 });
45 }); 37 });
46 38
47 group('serve-file', () { 39 group('serve-file', () {
48 group('top-level', () { 40 group('top-level', () {
49 test('file-exists', () { 41 _testVirDir('file-exists', (server, dir) {
50 expect(HttpServer.bind('localhost', 0).then((server) { 42 var file = new File('${dir.path}/file')..createSync();
51 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 43 var virDir = new VirtualDirectory(dir.path);
52 var file = new File('${dir.path}/file')..createSync(); 44
53 var virDir = new VirtualDirectory(dir.path); 45 virDir.serve(server);
54 46
55 virDir.serve(server); 47 return getStatusCode(server.port, '/file')
56 48 .then((result) {
57 return getStatusCode(server.port, '/file') 49 expect(result, HttpStatus.OK);
58 .whenComplete(() { 50 });
59 server.close();
60 dir.deleteSync(recursive: true);
61 });
62 }), completion(equals(HttpStatus.OK)));
63 }); 51 });
64 52
65 test('file-not-exists', () { 53 _testVirDir('file-not-exists', (server, dir) {
66 expect(HttpServer.bind('localhost', 0).then((server) { 54 var virDir = new VirtualDirectory(dir.path);
67 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
68 var virDir = new VirtualDirectory(dir.path);
69 55
70 virDir.serve(server); 56 virDir.serve(server);
71 57
72 return getStatusCode(server.port, '/file') 58 return getStatusCode(server.port, '/file')
73 .whenComplete(() { 59 .then((result) {
74 server.close(); 60 expect(result, HttpStatus.NOT_FOUND);
75 dir.deleteSync(); 61 });
76 });
77 }), completion(equals(HttpStatus.NOT_FOUND)));
78 }); 62 });
79 }); 63 });
80 64
81 group('in-dir', () { 65 group('in-dir', () {
82 test('file-exists', () { 66 _testVirDir('file-exists', (server, dir) {
83 expect(HttpServer.bind('localhost', 0).then((server) { 67 var dir2 = new Directory('${dir.path}/dir')..createSync();
84 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 68 var file = new File('${dir2.path}/file')..createSync();
85 var dir2 = new Directory('${dir.path}/dir')..createSync(); 69 var virDir = new VirtualDirectory(dir.path);
86 var file = new File('${dir2.path}/file')..createSync(); 70
87 var virDir = new VirtualDirectory(dir.path); 71 virDir.serve(server);
88 72
89 virDir.serve(server); 73 return getStatusCode(server.port, '/dir/file')
90 74 .then((result) {
91 return getStatusCode(server.port, '/dir/file') 75 expect(result, HttpStatus.OK);
92 .whenComplete(() { 76 });
93 server.close();
94 dir.deleteSync(recursive: true);
95 });
96 }), completion(equals(HttpStatus.OK)));
97 }); 77 });
98 78
99 test('file-not-exists', () { 79 _testVirDir('file-not-exists', (server, dir) {
100 expect(HttpServer.bind('localhost', 0).then((server) { 80 var dir2 = new Directory('${dir.path}/dir')..createSync();
101 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 81 var file = new File('${dir.path}/file')..createSync();
102 var dir2 = new Directory('${dir.path}/dir')..createSync(); 82 var virDir = new VirtualDirectory(dir.path);
103 var file = new File('${dir.path}/file')..createSync(); 83
104 var virDir = new VirtualDirectory(dir.path); 84 virDir.serve(server);
105 85
106 virDir.serve(server); 86 return getStatusCode(server.port, '/dir/file')
107 87 .then((result) {
108 return getStatusCode(server.port, '/dir/file') 88 expect(result, HttpStatus.NOT_FOUND);
109 .whenComplete(() { 89 });
110 server.close();
111 dir.deleteSync(recursive: true);
112 });
113 }), completion(equals(HttpStatus.NOT_FOUND)));
114 }); 90 });
115 }); 91 });
116 }); 92 });
117 93
118 group('serve-dir', () { 94 group('serve-dir', () {
119 group('top-level', () { 95 group('top-level', () {
120 test('simple', () { 96 _testVirDir('simple', (server, dir) {
121 expect(HttpServer.bind('localhost', 0).then((server) { 97 var virDir = new VirtualDirectory(dir.path);
122 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 98 virDir.allowDirectoryListing = true;
123 var virDir = new VirtualDirectory(dir.path); 99
124 virDir.allowDirectoryListing = true; 100 virDir.serve(server);
125 101
126 virDir.serve(server); 102 return getAsString(server.port, '/')
127 103 .then((result) {
128 return getAsString(server.port, '/') 104 expect(result, contains('Index of /'));
129 .whenComplete(() {
130 server.close();
131 dir.deleteSync();
132 }); 105 });
133 }), completion(contains('Index of /')));
134 }); 106 });
135 107
136 test('files', () { 108 _testVirDir('files', (server, dir) {
137 expect(HttpServer.bind('localhost', 0).then((server) { 109 var virDir = new VirtualDirectory(dir.path);
138 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 110 for (int i = 0; i < 10; i++) {
139 var virDir = new VirtualDirectory(dir.path); 111 new File('${dir.path}/$i').createSync();
140 for (int i = 0; i < 10; i++) { 112 }
141 new File('${dir.path}/$i').createSync(); 113 virDir.allowDirectoryListing = true;
142 } 114
143 virDir.allowDirectoryListing = true; 115 virDir.serve(server);
144 116
145 virDir.serve(server); 117 return getAsString(server.port, '/')
146 118 .then((result) {
147 return getAsString(server.port, '/') 119 expect(result, contains('Index of /'));
148 .whenComplete(() {
149 server.close();
150 dir.deleteSync(recursive: true);
151 }); 120 });
152 }), completion(contains('Index of /')));
153 }); 121 });
154 122
155 test('dirs', () { 123 _testVirDir('dirs', (server, dir) {
156 expect(HttpServer.bind('localhost', 0).then((server) { 124 var virDir = new VirtualDirectory(dir.path);
157 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 125 for (int i = 0; i < 10; i++) {
158 var virDir = new VirtualDirectory(dir.path); 126 new Directory('${dir.path}/$i').createSync();
159 for (int i = 0; i < 10; i++) { 127 }
160 new Directory('${dir.path}/$i').createSync(); 128 virDir.allowDirectoryListing = true;
161 }
162 virDir.allowDirectoryListing = true;
163 129
164 virDir.serve(server); 130 virDir.serve(server);
165 131
166 return getAsString(server.port, '/') 132 return getAsString(server.port, '/')
167 .whenComplete(() { 133 .then((result) {
168 server.close(); 134 expect(result, contains('Index of /'));
169 dir.deleteSync(recursive: true);
170 }); 135 });
171 }), completion(contains('Index of /')));
172 }); 136 });
173 137
174 if (!Platform.isWindows) { 138 if (!Platform.isWindows) {
175 test('recursive-link', () { 139 _testVirDir('recursive-link', (server, dir) {
176 expect(HttpServer.bind('localhost', 0).then((server) { 140 var link = new Link('${dir.path}/recursive')..createSync('.');
177 var dir = 141 var virDir = new VirtualDirectory(dir.path);
178 Directory.systemTemp.createTempSync('http_server_virtual_'); 142 virDir.allowDirectoryListing = true;
179 var link = new Link('${dir.path}/recursive')..createSync('.'); 143
180 var virDir = new VirtualDirectory(dir.path); 144 virDir.serve(server);
181 virDir.allowDirectoryListing = true; 145
182 146 return Future.wait([
183 virDir.serve(server); 147 getAsString(server.port, '/').then(
184 148 (s) => s.contains('recursive/')),
185 return Future.wait([ 149 getAsString(server.port, '/').then(
186 getAsString(server.port, '/').then( 150 (s) => !s.contains('../')),
187 (s) => s.contains('recursive/')), 151 getAsString(server.port, '/').then(
188 getAsString(server.port, '/').then( 152 (s) => s.contains('Index of /')),
189 (s) => !s.contains('../')), 153 getAsString(server.port, '/recursive').then(
190 getAsString(server.port, '/').then( 154 (s) => s.contains('recursive/')),
191 (s) => s.contains('Index of /')), 155 getAsString(server.port, '/recursive').then(
192 getAsString(server.port, '/recursive').then( 156 (s) => s.contains('../')),
193 (s) => s.contains('recursive/')), 157 getAsString(server.port, '/recursive').then(
194 getAsString(server.port, '/recursive').then( 158 (s) => s.contains('Index of /recursive'))])
195 (s) => s.contains('../')), 159 .then((result) {
196 getAsString(server.port, '/recursive').then( 160 expect(result, equals([true, true, true, true, true, true]));
197 (s) => s.contains('Index of /recursive'))]) 161 });
198 .whenComplete(() {
199 server.close();
200 dir.deleteSync(recursive: true);
201 });
202 }), completion(equals([true, true, true, true, true, true])));
203 }); 162 });
204 } 163 }
205 }); 164 });
206 165
207 group('custom', () { 166 group('custom', () {
208 test('simple', () { 167 _testVirDir('simple', (server, dir) {
209 expect(HttpServer.bind('localhost', 0).then((server) { 168 var virDir = new VirtualDirectory(dir.path);
210 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 169 virDir.allowDirectoryListing = true;
211 var virDir = new VirtualDirectory(dir.path); 170 virDir.directoryHandler = (dir2, request) {
212 virDir.allowDirectoryListing = true; 171 expect(dir2, isNotNull);
213 virDir.directoryHandler = (dir2, request) { 172 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue);
214 expect(dir2, isNotNull); 173 request.response.write('My handler ${request.uri.path}');
215 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue); 174 request.response.close();
216 request.response.write('My handler ${request.uri.path}'); 175 };
217 request.response.close(); 176
218 }; 177 virDir.serve(server);
219 178
220 virDir.serve(server); 179 return getAsString(server.port, '/')
221 180 .then((result) {
222 return getAsString(server.port, '/') 181 expect(result, 'My handler /');
223 .whenComplete(() {
224 server.close();
225 dir.deleteSync();
226 }); 182 });
227 }), completion(contains('My handler /')));
228 }); 183 });
229 }); 184 });
230 }); 185 });
231 186
232 group('links', () { 187 group('links', () {
233 if (!Platform.isWindows) { 188 if (!Platform.isWindows) {
234 group('follow-links', () { 189 group('follow-links', () {
235 test('dir-link', () { 190 _testVirDir('dir-link', (server, dir) {
236 expect(HttpServer.bind('localhost', 0).then((server) { 191 var dir2 = new Directory('${dir.path}/dir2')..createSync();
237 var dir = 192 var link = new Link('${dir.path}/dir3')..createSync('dir2');
238 Directory.systemTemp.createTempSync('http_server_virtual_'); 193 var file = new File('${dir2.path}/file')..createSync();
239 var dir2 = new Directory('${dir.path}/dir2')..createSync(); 194 var virDir = new VirtualDirectory(dir.path);
240 var link = new Link('${dir.path}/dir3')..createSync('dir2'); 195 virDir.followLinks = true;
241 var file = new File('${dir2.path}/file')..createSync(); 196
242 var virDir = new VirtualDirectory(dir.path); 197 virDir.serve(server);
243 virDir.followLinks = true; 198
244 199 return getStatusCode(server.port, '/dir3/file')
245 virDir.serve(server); 200 .then((result) {
246 201 expect(result, HttpStatus.OK);
247 return getStatusCode(server.port, '/dir3/file') 202 });
248 .whenComplete(() {
249 server.close();
250 dir.deleteSync(recursive: true);
251 });
252 }), completion(equals(HttpStatus.OK)));
253 }); 203 });
254 204
255 test('root-link', () { 205 _testVirDir('root-link', (server, dir) {
256 expect(HttpServer.bind('localhost', 0).then((server) { 206 var link = new Link('${dir.path}/dir3')..createSync('.');
257 var dir = 207 var file = new File('${dir.path}/file')..createSync();
258 Directory.systemTemp.createTempSync('http_server_virtual_'); 208 var virDir = new VirtualDirectory(dir.path);
259 var link = new Link('${dir.path}/dir3')..createSync('.'); 209 virDir.followLinks = true;
260 var file = new File('${dir.path}/file')..createSync(); 210
261 var virDir = new VirtualDirectory(dir.path); 211 virDir.serve(server);
262 virDir.followLinks = true; 212
263 213 return getStatusCode(server.port, '/dir3/file')
264 virDir.serve(server); 214 .then((result) {
265 215 expect(result, HttpStatus.OK);
266 return getStatusCode(server.port, '/dir3/file') 216 });
267 .whenComplete(() {
268 server.close();
269 dir.deleteSync(recursive: true);
270 });
271 }), completion(equals(HttpStatus.OK)));
272 }); 217 });
273 218
274 group('bad-links', () { 219 group('bad-links', () {
275 test('absolute-link', () { 220 _testVirDir('absolute-link', (server, dir) {
276 expect(HttpServer.bind('localhost', 0).then((server) {
277 var dir =
278 Directory.systemTemp.createTempSync('http_server_virtual_');
279 var file = new File('${dir.path}/file')..createSync(); 221 var file = new File('${dir.path}/file')..createSync();
280 var link = new Link('${dir.path}/file2') 222 var link = new Link('${dir.path}/file2')
281 ..createSync('${dir.path}/file'); 223 ..createSync('${dir.path}/file');
282 var virDir = new VirtualDirectory(dir.path); 224 var virDir = new VirtualDirectory(dir.path);
283 virDir.followLinks = true; 225 virDir.followLinks = true;
284 226
285 virDir.serve(server); 227 virDir.serve(server);
286 228
287 return new HttpClient().get('localhost', 229 return new HttpClient().get('localhost',
288 server.port, 230 server.port,
289 '/file2') 231 '/file2')
290 .then((request) => request.close()) 232 .then((request) => request.close())
291 .then((response) => response.drain().then( 233 .then((response) => response.drain().then(
292 (_) => response.statusCode)) 234 (_) => response.statusCode))
293 .whenComplete(() { 235 .then((result) {
294 server.close(); 236 expect(result, HttpStatus.NOT_FOUND);
295 dir.deleteSync(recursive: true); 237 });
296 });
297 }), completion(equals(HttpStatus.NOT_FOUND)));
298 }); 238 });
299 239
300 test('relative-parent-link', () { 240 _testVirDir('relative-parent-link', (server, dir) {
301 expect(HttpServer.bind('localhost', 0).then((server) {
302 var dir =
303 Directory.systemTemp.createTempSync('http_server_virtual_');
304 var dir2 = new Directory('${dir.path}/dir')..createSync(); 241 var dir2 = new Directory('${dir.path}/dir')..createSync();
305 var file = new File('${dir.path}/file')..createSync(); 242 var file = new File('${dir.path}/file')..createSync();
306 var link = new Link('${dir2.path}/file') 243 var link = new Link('${dir2.path}/file')
307 ..createSync('../file'); 244 ..createSync('../file');
308 var virDir = new VirtualDirectory(dir2.path); 245 var virDir = new VirtualDirectory(dir2.path);
309 virDir.followLinks = true; 246 virDir.followLinks = true;
310 247
311 virDir.serve(server); 248 virDir.serve(server);
312 249
313 return new HttpClient().get('localhost', 250 return new HttpClient().get('localhost',
314 server.port, 251 server.port,
315 '/dir3/file') 252 '/dir3/file')
316 .then((request) => request.close()) 253 .then((request) => request.close())
317 .then((response) => response.drain().then( 254 .then((response) => response.drain().then(
318 (_) => response.statusCode)) 255 (_) => response.statusCode))
319 .whenComplete(() { 256 .then((result) {
320 server.close(); 257 expect(result, HttpStatus.NOT_FOUND);
321 dir.deleteSync(recursive: true);
322 }); 258 });
323 }), completion(equals(HttpStatus.NOT_FOUND)));
324 }); 259 });
325 }); 260 });
326 }); 261 });
327 262
328 group('not-follow-links', () { 263 group('not-follow-links', () {
329 test('dir-link', () { 264 _testVirDir('dir-link', (server, dir) {
330 expect(HttpServer.bind('localhost', 0).then((server) { 265 return HttpServer.bind('localhost', 0).then((server) {
331 var dir = 266 var dir =
332 Directory.systemTemp.createTempSync('http_server_virtual_'); 267 Directory.systemTemp.createTempSync('http_server_virtual_');
333 var dir2 = new Directory('${dir.path}/dir2')..createSync(); 268 var dir2 = new Directory('${dir.path}/dir2')..createSync();
334 var link = new Link('${dir.path}/dir3')..createSync('dir2'); 269 var link = new Link('${dir.path}/dir3')..createSync('dir2');
335 var file = new File('${dir2.path}/file')..createSync(); 270 var file = new File('${dir2.path}/file')..createSync();
336 var virDir = new VirtualDirectory(dir.path); 271 var virDir = new VirtualDirectory(dir.path);
337 virDir.followLinks = false; 272 virDir.followLinks = false;
338 273
339 virDir.serve(server); 274 virDir.serve(server);
340 275
341 return getStatusCode(server.port, '/dir3/file') 276 return getStatusCode(server.port, '/dir3/file')
342 .whenComplete(() { 277 .whenComplete(() {
343 server.close(); 278 server.close();
344 dir.deleteSync(recursive: true); 279 dir.deleteSync(recursive: true);
345 }); 280 });
346 }), completion(equals(HttpStatus.NOT_FOUND))); 281 })
282 .then((result) {
283 expect(result, HttpStatus.NOT_FOUND);
284 });
347 }); 285 });
348 }); 286 });
349 287
350 group('follow-links', () { 288 group('follow-links', () {
351 test('no-root-jail', () { 289 group('no-root-jail', () {
352 test('absolute-link', () { 290 _testVirDir('absolute-link', (server, dir) {
353 expect(HttpServer.bind('localhost', 0).then((server) {
354 var dir =
355 Directory.systemTemp.createTempSync('http_server_virtual_');
356 var file = new File('${dir.path}/file')..createSync(); 291 var file = new File('${dir.path}/file')..createSync();
357 var link = new Link('${dir.path}/file2') 292 var link = new Link('${dir.path}/file2')
358 ..createSync('${dir.path}/file'); 293 ..createSync('${dir.path}/file');
359 var virDir = new VirtualDirectory(dir.path); 294 var virDir = new VirtualDirectory(dir.path);
360 virDir.followLinks = true; 295 virDir.followLinks = true;
361 virDir.jailRoot = false; 296 virDir.jailRoot = false;
362 297
363 virDir.serve(server); 298 virDir.serve(server);
364 299
365 return new HttpClient().get('localhost', 300 return new HttpClient().get('localhost',
366 server.port, 301 server.port,
367 '/file2') 302 '/file2')
368 .then((request) => request.close()) 303 .then((request) => request.close())
369 .then((response) => response.drain().then( 304 .then((response) => response.drain().then(
370 (_) => response.statusCode)) 305 (_) => response.statusCode))
371 .whenComplete(() { 306 .then((result) {
372 server.close(); 307 expect(result, HttpStatus.OK);
373 dir.deleteSync(recursive: true);
374 }); 308 });
375 }), completion(equals(HttpStatus.OK)));
376 }); 309 });
377 310
378 test('relative-parent-link', () { 311 _testVirDir('relative-parent-link', (server, dir) {
379 expect(HttpServer.bind('localhost', 0).then((server) {
380 var dir =
381 Directory.systemTemp.createTempSync('http_server_virtual_');
382 var dir2 = new Directory('${dir.path}/dir')..createSync(); 312 var dir2 = new Directory('${dir.path}/dir')..createSync();
383 var file = new File('${dir.path}/file')..createSync(); 313 var file = new File('${dir.path}/file')..createSync();
384 var link = new Link('${dir2.path}/file') 314 var link = new Link('${dir2.path}/file')
385 ..createSync('../file'); 315 ..createSync('../file');
386 var virDir = new VirtualDirectory(dir2.path); 316 var virDir = new VirtualDirectory(dir2.path);
387 virDir.followLinks = true; 317 virDir.followLinks = true;
388 virDir.jailRoot = false; 318 virDir.jailRoot = false;
389 319
390 virDir.serve(server); 320 virDir.serve(server);
391 321
392 return new HttpClient().get('localhost', 322 return new HttpClient().get('localhost',
393 server.port, 323 server.port,
394 '/file') 324 '/file')
395 .then((request) => request.close()) 325 .then((request) => request.close())
396 .then((response) => response.drain().then( 326 .then((response) => response.drain().then(
397 (_) => response.statusCode)) 327 (_) => response.statusCode))
398 .whenComplete(() { 328 .then((result) {
399 server.close(); 329 expect(result, HttpStatus.OK);
400 dir.deleteSync(recursive: true);
401 }); 330 });
402 }), completion(equals(HttpStatus.OK)));
403 }); 331 });
404 }); 332 });
405 }); 333 });
406 } 334 }
407 }); 335 });
408 336
409 group('last-modified', () { 337 group('last-modified', () {
410 group('file', () { 338 group('file', () {
411 test('file-exists', () { 339 _testVirDir('file-exists', (server, dir) {
412 expect(HttpServer.bind('localhost', 0).then((server) {
413 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
414 var file = new File('${dir.path}/file')..createSync(); 340 var file = new File('${dir.path}/file')..createSync();
415 var virDir = new VirtualDirectory(dir.path); 341 var virDir = new VirtualDirectory(dir.path);
416 342
417 virDir.serve(server); 343 virDir.serve(server);
418 344
419 return getHeaders(server.port, '/file') 345 return getHeaders(server.port, '/file')
420 .then((headers) { 346 .then((headers) {
421 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); 347 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull);
422 return HttpDate.parse( 348 return HttpDate.parse(
423 headers.value(HttpHeaders.LAST_MODIFIED)); 349 headers.value(HttpHeaders.LAST_MODIFIED));
424 }) 350 })
425 .then((lastModified) { 351 .then((lastModified) {
426 return getStatusCode( 352 return getStatusCode(
427 server.port, '/file', ifModifiedSince: lastModified); 353 server.port, '/file', ifModifiedSince: lastModified);
428 }) 354 })
429 .whenComplete(() { 355 .then((result) {
430 server.close(); 356 expect(result, HttpStatus.NOT_MODIFIED);
431 dir.deleteSync(recursive: true);
432 }); 357 });
433 }), completion(equals(HttpStatus.NOT_MODIFIED)));
434 }); 358 });
435 359
436 test('file-changes', () { 360 _testVirDir('file-changes', (server, dir) {
437 expect(HttpServer.bind('localhost', 0).then((server) {
438 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
439 var file = new File('${dir.path}/file')..createSync(); 361 var file = new File('${dir.path}/file')..createSync();
440 var virDir = new VirtualDirectory(dir.path); 362 var virDir = new VirtualDirectory(dir.path);
441 363
442 virDir.serve(server); 364 virDir.serve(server);
443 365
444 return getHeaders(server.port, '/file') 366 return getHeaders(server.port, '/file')
445 .then((headers) { 367 .then((headers) {
446 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); 368 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull);
447 return HttpDate.parse( 369 return HttpDate.parse(
448 headers.value(HttpHeaders.LAST_MODIFIED)); 370 headers.value(HttpHeaders.LAST_MODIFIED));
449 }) 371 })
450 .then((lastModified) { 372 .then((lastModified) {
451 // Fake file changed by moving date back in time. 373 // Fake file changed by moving date back in time.
452 lastModified = lastModified.subtract( 374 lastModified = lastModified.subtract(
453 const Duration(seconds: 10)); 375 const Duration(seconds: 10));
454 return getStatusCode( 376 return getStatusCode(
455 server.port, '/file', ifModifiedSince: lastModified); 377 server.port, '/file', ifModifiedSince: lastModified);
456 }) 378 })
457 .whenComplete(() { 379 .then((result) {
458 server.close(); 380 expect(result, HttpStatus.OK);
459 dir.deleteSync(recursive: true);
460 }); 381 });
461 }), completion(equals(HttpStatus.OK)));
462 }); 382 });
463 }); 383 });
464 }); 384 });
465 385
466 group('content-type', () { 386 group('content-type', () {
467 group('mime-type', () { 387 group('mime-type', () {
468 test('from-path', () { 388 _testVirDir('from-path', (server, dir) {
469 expect(HttpServer.bind('localhost', 0).then((server) {
470 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
471 var file = new File('${dir.path}/file.jpg')..createSync(); 389 var file = new File('${dir.path}/file.jpg')..createSync();
472 var virDir = new VirtualDirectory(dir.path); 390 var virDir = new VirtualDirectory(dir.path);
473 391
474 virDir.serve(server); 392 virDir.serve(server);
475 393
476 return getHeaders(server.port, '/file.jpg') 394 return getHeaders(server.port, '/file.jpg')
477 .then((headers) => headers.contentType.toString()) 395 .then((headers) => headers.contentType.toString())
478 .whenComplete(() { 396 .then((result) {
479 server.close(); 397 expect(result, 'image/jpeg');
480 dir.deleteSync(recursive: true);
481 }); 398 });
482 }), completion(equals('image/jpeg')));
483 }); 399 });
484 400
485 test('from-magic-number', () { 401 _testVirDir('from-magic-number', (server, dir) {
486 expect(HttpServer.bind('localhost', 0).then((server) {
487 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
488 var file = new File('${dir.path}/file.jpg')..createSync(); 402 var file = new File('${dir.path}/file.jpg')..createSync();
489 file.writeAsBytesSync( 403 file.writeAsBytesSync(
490 [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); 404 [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
491 var virDir = new VirtualDirectory(dir.path); 405 var virDir = new VirtualDirectory(dir.path);
492 406
493 virDir.serve(server); 407 virDir.serve(server);
494 408
495 return getHeaders(server.port, '/file.jpg') 409 return getHeaders(server.port, '/file.jpg')
496 .then((headers) => headers.contentType.toString()) 410 .then((headers) => headers.contentType.toString())
497 .whenComplete(() { 411 .then((result) {
498 server.close(); 412 expect(result, 'image/png');
499 dir.deleteSync(recursive: true);
500 }); 413 });
501 }), completion(equals('image/png')));
502 }); 414 });
503 }); 415 });
504 }); 416 });
505 417
506 group('error-page', () { 418 group('error-page', () {
507 test('default', () { 419 _testVirDir('default', (server, dir) {
508 expect(HttpServer.bind('localhost', 0).then((server) { 420 var virDir = new VirtualDirectory(pathos.join(dir.path, 'foo'));
509 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
510 var virDir = new VirtualDirectory(dir.path);
511 dir.deleteSync();
512 421
513 virDir.serve(server); 422 virDir.serve(server);
514 423
515 return getAsString(server.port, '/') 424 return getAsString(server.port, '/')
516 .whenComplete(() { 425 .then((result) {
517 server.close(); 426 expect(result, matches(new RegExp('404.*Not Found')));
518 }); 427 });
519 }), completion(matches(new RegExp('404.*Not Found'))));
520 }); 428 });
521 429
522 test('custom', () { 430 _testVirDir('custom', (server, dir) {
523 expect(HttpServer.bind('localhost', 0).then((server) { 431 var virDir = new VirtualDirectory(pathos.join(dir.path, 'foo'));
524 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
525 var virDir = new VirtualDirectory(dir.path);
526 dir.deleteSync();
527 432
528 virDir.errorPageHandler = (request) { 433 virDir.errorPageHandler = (request) {
529 request.response.write('my-page '); 434 request.response.write('my-page ');
530 request.response.write(request.response.statusCode); 435 request.response.write(request.response.statusCode);
531 request.response.close(); 436 request.response.close();
532 }; 437 };
533 virDir.serve(server); 438 virDir.serve(server);
534 439
535 return getAsString(server.port, '/') 440 return getAsString(server.port, '/')
536 .whenComplete(() { 441 .then((result) {
537 server.close(); 442 expect(result, 'my-page 404');
538 }); 443 });
539 }), completion(equals('my-page 404')));
540 }); 444 });
541 }); 445 });
542 446
543 group('escape-root', () { 447 group('escape-root', () {
544 test('escape1', () { 448 _testVirDir('escape1', (server, dir) {
545 expect(HttpServer.bind('localhost', 0).then((server) {
546 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
547 var virDir = new VirtualDirectory(dir.path); 449 var virDir = new VirtualDirectory(dir.path);
548 virDir.allowDirectoryListing = true; 450 virDir.allowDirectoryListing = true;
549 451
550 virDir.serve(server); 452 virDir.serve(server);
551 453
552 return getStatusCode(server.port, '/../') 454 return getStatusCode(server.port, '/../')
553 .whenComplete(() { 455 .then((result) {
554 server.close(); 456 expect(result, HttpStatus.NOT_FOUND);
555 dir.deleteSync(); 457 });
556 });
557 }), completion(equals(HttpStatus.NOT_FOUND)));
558 }); 458 });
559 459
560 test('escape2', () { 460 _testVirDir('escape2', (server, dir) {
561 expect(HttpServer.bind('localhost', 0).then((server) {
562 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
563 new Directory('${dir.path}/dir').createSync(); 461 new Directory('${dir.path}/dir').createSync();
564 var virDir = new VirtualDirectory(dir.path); 462 var virDir = new VirtualDirectory(dir.path);
565 virDir.allowDirectoryListing = true; 463 virDir.allowDirectoryListing = true;
566 464
567 virDir.serve(server); 465 virDir.serve(server);
568 466
569 return getStatusCode(server.port, '/dir/../../') 467 return getStatusCode(server.port, '/dir/../../')
570 .whenComplete(() { 468 .then((result) {
571 server.close(); 469 expect(result, HttpStatus.NOT_FOUND);
572 dir.deleteSync(recursive: true); 470 });
573 });
574 }), completion(equals(HttpStatus.NOT_FOUND)));
575 }); 471 });
576 }); 472 });
577 473
578 group('url-decode', () { 474 group('url-decode', () {
579 test('with-space', () { 475 _testVirDir('with-space', (server, dir) {
580 expect(HttpServer.bind('localhost', 0).then((server) {
581 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
582 var file = new File('${dir.path}/my file')..createSync(); 476 var file = new File('${dir.path}/my file')..createSync();
583 var virDir = new VirtualDirectory(dir.path); 477 var virDir = new VirtualDirectory(dir.path);
584 478
585 virDir.serve(server); 479 virDir.serve(server);
586 480
587 return getStatusCode(server.port, '/my file') 481 return getStatusCode(server.port, '/my file')
588 .whenComplete(() { 482 .then((result) {
589 server.close(); 483 expect(result, HttpStatus.OK);
590 dir.deleteSync(recursive: true); 484 });
591 });
592 }), completion(equals(HttpStatus.OK)));
593 }); 485 });
594 486
595 test('encoded-space', () { 487 _testVirDir('encoded-space', (server, dir) {
596 expect(HttpServer.bind('localhost', 0).then((server) {
597 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
598 var file = new File('${dir.path}/my file')..createSync(); 488 var file = new File('${dir.path}/my file')..createSync();
599 var virDir = new VirtualDirectory(dir.path); 489 var virDir = new VirtualDirectory(dir.path);
600 490
601 virDir.serve(server); 491 virDir.serve(server);
602 492
603 return getStatusCode(server.port, '/my%20file') 493 return getStatusCode(server.port, '/my%20file')
604 .whenComplete(() { 494 .then((result) {
605 server.close(); 495 expect(result, HttpStatus.NOT_FOUND);
606 dir.deleteSync(recursive: true); 496 });
607 });
608 }), completion(equals(HttpStatus.NOT_FOUND)));
609 }); 497 });
610 498
611 test('encoded-path-separator', () { 499 _testVirDir('encoded-path-separator', (server, dir) {
612 expect(HttpServer.bind('localhost', 0).then((server) {
613 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
614 new Directory('${dir.path}/a').createSync(); 500 new Directory('${dir.path}/a').createSync();
615 new Directory('${dir.path}/a/b').createSync(); 501 new Directory('${dir.path}/a/b').createSync();
616 new Directory('${dir.path}/a/b/c').createSync(); 502 new Directory('${dir.path}/a/b/c').createSync();
617 var virDir = new VirtualDirectory(dir.path); 503 var virDir = new VirtualDirectory(dir.path);
618 virDir.allowDirectoryListing = true; 504 virDir.allowDirectoryListing = true;
619 505
620 virDir.serve(server); 506 virDir.serve(server);
621 507
622 return getStatusCode(server.port, '/a%2fb/c', rawPath: true) 508 return getStatusCode(server.port, '/a%2fb/c', rawPath: true)
623 .whenComplete(() { 509 .then((result) {
624 server.close(); 510 expect(result, HttpStatus.NOT_FOUND);
625 dir.deleteSync(recursive: true); 511 });
626 });
627 }), completion(equals(HttpStatus.NOT_FOUND)));
628 }); 512 });
629 513
630 test('encoded-null', () { 514 _testVirDir('encoded-null', (server, dir) {
631 expect(HttpServer.bind('localhost', 0).then((server) {
632 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
633 var virDir = new VirtualDirectory(dir.path); 515 var virDir = new VirtualDirectory(dir.path);
634 virDir.allowDirectoryListing = true; 516 virDir.allowDirectoryListing = true;
635 517
636 virDir.serve(server); 518 virDir.serve(server);
637 519
638 return getStatusCode(server.port, '/%00', rawPath: true) 520 return getStatusCode(server.port, '/%00', rawPath: true)
639 .whenComplete(() { 521 .then((result) {
640 server.close(); 522 expect(result, HttpStatus.NOT_FOUND);
641 dir.deleteSync(recursive: true); 523 });
642 });
643 }), completion(equals(HttpStatus.NOT_FOUND)));
644 }); 524 });
645 525
646 testEncoding(name, expected, [bool create = true]) { 526 _testEncoding('..', HttpStatus.NOT_FOUND, false);
647 test('encode-$name', () { 527 _testEncoding('%2e%2e', HttpStatus.OK);
648 expect(HttpServer.bind('localhost', 0).then((server) { 528 _testEncoding('%252e%252e', HttpStatus.OK);
649 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 529 _testEncoding('/', HttpStatus.OK, false);
650 if (create) new File('${dir.path}/$name').createSync(); 530 _testEncoding('%2f', HttpStatus.NOT_FOUND, false);
651 var virDir = new VirtualDirectory(dir.path); 531 _testEncoding('%2f', HttpStatus.OK, true);
652 virDir.allowDirectoryListing = true;
653
654 virDir.serve(server);
655
656 return getStatusCode(server.port, '/$name')
657 .whenComplete(() {
658 server.close();
659 dir.deleteSync(recursive: true);
660 });
661 }), completion(equals(expected)));
662 });
663 }
664 testEncoding('..', HttpStatus.NOT_FOUND, false);
665 testEncoding('%2e%2e', HttpStatus.OK);
666 testEncoding('%252e%252e', HttpStatus.OK);
667 testEncoding('/', HttpStatus.OK, false);
668 testEncoding('%2f', HttpStatus.NOT_FOUND, false);
669 testEncoding('%2f', HttpStatus.OK, true);
670 }); 532 });
671 533
672 group('serve-file', () { 534 group('serve-file', () {
673 test('from-dir-handler', () { 535 _testVirDir('from-dir-handler', (server, dir) {
674 expect(HttpServer.bind('localhost', 0).then((server) {
675 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
676 new File('${dir.path}/file')..writeAsStringSync('file contents'); 536 new File('${dir.path}/file')..writeAsStringSync('file contents');
677 var virDir = new VirtualDirectory(dir.path); 537 var virDir = new VirtualDirectory(dir.path);
678 virDir.allowDirectoryListing = true; 538 virDir.allowDirectoryListing = true;
679 virDir.directoryHandler = (d, request) { 539 virDir.directoryHandler = (d, request) {
680 expect(FileSystemEntity.identicalSync(dir.path, d.path), isTrue); 540 expect(FileSystemEntity.identicalSync(dir.path, d.path), isTrue);
681 virDir.serveFile(new File('${d.path}/file'), request); 541 virDir.serveFile(new File('${d.path}/file'), request);
682 }; 542 };
683 543
684 virDir.serve(server); 544 virDir.serve(server);
685 545
686 return getAsString(server.port, '/') 546 return getAsString(server.port, '/')
687 .whenComplete(() { 547 .then((result) {
688 server.close(); 548 expect(result, 'file contents');
689 dir.deleteSync(recursive: true); 549 });
690 });
691 }), completion(equals('file contents')));
692 }); 550 });
693 }); 551 });
694 } 552 }
695 553
554
555 void _testVirDir(String name, dynamic func(HttpServer server, Directory dir)) {
Anders Johnsen 2014/01/05 19:36:08 Please move these helpers to either utils.dart or
556 test(name, () {
557 HttpServer server;
558 Directory dir;
559
560 return HttpServer.bind('localhost', 0)
561 .then((HttpServer value) {
Anders Johnsen 2014/01/05 19:36:08 No need for type here.
562 server = value;
563
Anders Johnsen 2014/01/05 19:36:08 Remove empty lines.
564 dir = Directory.systemTemp.createTempSync('http_server_virtual_');
565
566 return func(server, dir);
567 })
568 .whenComplete(() {
569 return Future.wait([
570 server.close(force: true),
Anders Johnsen 2014/01/05 19:36:08 Move up on above line.
Anders Johnsen 2014/01/05 19:36:08 Please don't use force - it'll make it harder to t
571 dir.delete(recursive: true)]);
572 });
573 });
574 }
575
576 void _testEncoding(name, expected, [bool create = true]) {
577 _testVirDir('encode-$name', (server, dir) {
578 if (create) new File('${dir.path}/$name').createSync();
579 var virDir = new VirtualDirectory(dir.path);
580 virDir.allowDirectoryListing = true;
581
582 virDir.serve(server);
583
584 return getStatusCode(server.port, '/$name')
585 .then((result) {
586 expect(result, expected);
587 });
588 });
589 }
OLDNEW
« pkg/http_server/test/utils.dart ('K') | « pkg/http_server/test/utils.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698