| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |