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

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