| 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:io'; | 5 import 'dart:io'; |
| 6 | 6 |
| 7 import "package:unittest/unittest.dart"; | 7 import "package:unittest/unittest.dart"; |
| 8 import "package:http_server/http_server.dart"; | 8 import "package:http_server/http_server.dart"; |
| 9 | 9 |
| 10 | 10 |
| 11 Future<int> getStatusCode(int port, String path) { |
| 12 return new HttpClient().get('localhost', port, path) |
| 13 .then((request) => request.close()) |
| 14 .then((response) => response.drain().then( |
| 15 (_) => response.statusCode)); |
| 16 } |
| 17 |
| 18 Future<HttpHeaders> getHeaders(int port, String path) { |
| 19 return new HttpClient().get('localhost', port, path) |
| 20 .then((request) => request.close()) |
| 21 .then((response) => response.drain().then( |
| 22 (_) => response.headers)); |
| 23 } |
| 24 |
| 25 |
| 11 void main() { | 26 void main() { |
| 12 group('serve-root', () { | 27 group('serve-root', () { |
| 13 test('dir-exists', () { | 28 test('dir-exists', () { |
| 14 expect(HttpServer.bind('localhost', 0).then((server) { | 29 expect(HttpServer.bind('localhost', 0).then((server) { |
| 15 var dir = new Directory('').createTempSync(); | 30 var dir = new Directory('').createTempSync(); |
| 16 var virDir = new VirtualDirectory(dir.path); | 31 var virDir = new VirtualDirectory(dir.path); |
| 17 | 32 |
| 18 virDir.serve(server); | 33 virDir.serve(server); |
| 19 | 34 |
| 20 return new HttpClient().get('localhost', server.port, '/') | 35 return getStatusCode(server.port, '/') |
| 21 .then((request) => request.close()) | |
| 22 .then((response) => response.drain().then( | |
| 23 (_) => response.statusCode)) | |
| 24 .whenComplete(() { | 36 .whenComplete(() { |
| 25 server.close(); | 37 server.close(); |
| 26 dir.deleteSync(); | 38 dir.deleteSync(); |
| 27 }); | 39 }); |
| 28 }), completion(equals(HttpStatus.NOT_FOUND))); | 40 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 29 }); | 41 }); |
| 30 | 42 |
| 31 test('dir-not-exists', () { | 43 test('dir-not-exists', () { |
| 32 expect(HttpServer.bind('localhost', 0).then((server) { | 44 expect(HttpServer.bind('localhost', 0).then((server) { |
| 33 var dir = new Directory('').createTempSync(); | 45 var dir = new Directory('').createTempSync(); |
| 34 dir.deleteSync(); | 46 dir.deleteSync(); |
| 35 var virDir = new VirtualDirectory(dir.path); | 47 var virDir = new VirtualDirectory(dir.path); |
| 36 | 48 |
| 37 virDir.serve(server); | 49 virDir.serve(server); |
| 38 | 50 |
| 39 return new HttpClient().get('localhost', server.port, '/') | 51 return getStatusCode(server.port, '/') |
| 40 .then((request) => request.close()) | |
| 41 .then((response) => response.drain().then( | |
| 42 (_) => response.statusCode)) | |
| 43 .whenComplete(() { | 52 .whenComplete(() { |
| 44 server.close(); | 53 server.close(); |
| 45 }); | 54 }); |
| 46 }), completion(equals(HttpStatus.NOT_FOUND))); | 55 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 47 }); | 56 }); |
| 48 }); | 57 }); |
| 49 | 58 |
| 50 group('serve-file', () { | 59 group('serve-file', () { |
| 51 group('top-level', () { | 60 group('top-level', () { |
| 52 test('file-exists', () { | 61 test('file-exists', () { |
| 53 expect(HttpServer.bind('localhost', 0).then((server) { | 62 expect(HttpServer.bind('localhost', 0).then((server) { |
| 54 var dir = new Directory('').createTempSync(); | 63 var dir = new Directory('').createTempSync(); |
| 55 var file = new File('${dir.path}/file')..createSync(); | 64 var file = new File('${dir.path}/file')..createSync(); |
| 56 var virDir = new VirtualDirectory(dir.path); | 65 var virDir = new VirtualDirectory(dir.path); |
| 57 | 66 |
| 58 virDir.serve(server); | 67 virDir.serve(server); |
| 59 | 68 |
| 60 return new HttpClient().get('localhost', server.port, '/file') | 69 return getStatusCode(server.port, '/file') |
| 61 .then((request) => request.close()) | |
| 62 .then((response) => response.drain().then( | |
| 63 (_) => response.statusCode)) | |
| 64 .whenComplete(() { | 70 .whenComplete(() { |
| 65 server.close(); | 71 server.close(); |
| 66 file.deleteSync(); | 72 file.deleteSync(); |
| 67 dir.deleteSync(); | 73 dir.deleteSync(); |
| 68 }); | 74 }); |
| 69 }), completion(equals(HttpStatus.OK))); | 75 }), completion(equals(HttpStatus.OK))); |
| 70 }); | 76 }); |
| 71 | 77 |
| 72 test('file-not-exists', () { | 78 test('file-not-exists', () { |
| 73 expect(HttpServer.bind('localhost', 0).then((server) { | 79 expect(HttpServer.bind('localhost', 0).then((server) { |
| 74 var dir = new Directory('').createTempSync(); | 80 var dir = new Directory('').createTempSync(); |
| 75 var virDir = new VirtualDirectory(dir.path); | 81 var virDir = new VirtualDirectory(dir.path); |
| 76 | 82 |
| 77 virDir.serve(server); | 83 virDir.serve(server); |
| 78 | 84 |
| 79 return new HttpClient().get('localhost', server.port, '/file') | 85 return getStatusCode(server.port, '/file') |
| 80 .then((request) => request.close()) | |
| 81 .then((response) => response.drain().then( | |
| 82 (_) => response.statusCode)) | |
| 83 .whenComplete(() { | 86 .whenComplete(() { |
| 84 server.close(); | 87 server.close(); |
| 85 dir.deleteSync(); | 88 dir.deleteSync(); |
| 86 }); | 89 }); |
| 87 }), completion(equals(HttpStatus.NOT_FOUND))); | 90 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 88 }); | 91 }); |
| 89 }); | 92 }); |
| 90 | 93 |
| 91 group('in-dir', () { | 94 group('in-dir', () { |
| 92 test('file-exists', () { | 95 test('file-exists', () { |
| 93 expect(HttpServer.bind('localhost', 0).then((server) { | 96 expect(HttpServer.bind('localhost', 0).then((server) { |
| 94 var dir = new Directory('').createTempSync(); | 97 var dir = new Directory('').createTempSync(); |
| 95 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 98 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 96 var file = new File('${dir2.path}/file')..createSync(); | 99 var file = new File('${dir2.path}/file')..createSync(); |
| 97 var virDir = new VirtualDirectory(dir.path); | 100 var virDir = new VirtualDirectory(dir.path); |
| 98 | 101 |
| 99 virDir.serve(server); | 102 virDir.serve(server); |
| 100 | 103 |
| 101 return new HttpClient().get('localhost', server.port, '/dir/file') | 104 return getStatusCode(server.port, '/dir/file') |
| 102 .then((request) => request.close()) | |
| 103 .then((response) => response.drain().then( | |
| 104 (_) => response.statusCode)) | |
| 105 .whenComplete(() { | 105 .whenComplete(() { |
| 106 server.close(); | 106 server.close(); |
| 107 file.deleteSync(); | 107 file.deleteSync(); |
| 108 dir2.deleteSync(); | 108 dir2.deleteSync(); |
| 109 dir.deleteSync(); | 109 dir.deleteSync(); |
| 110 }); | 110 }); |
| 111 }), completion(equals(HttpStatus.OK))); | 111 }), completion(equals(HttpStatus.OK))); |
| 112 }); | 112 }); |
| 113 | 113 |
| 114 test('file-not-exists', () { | 114 test('file-not-exists', () { |
| 115 expect(HttpServer.bind('localhost', 0).then((server) { | 115 expect(HttpServer.bind('localhost', 0).then((server) { |
| 116 var dir = new Directory('').createTempSync(); | 116 var dir = new Directory('').createTempSync(); |
| 117 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 117 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 118 var file = new File('${dir.path}/file')..createSync(); | 118 var file = new File('${dir.path}/file')..createSync(); |
| 119 var virDir = new VirtualDirectory(dir.path); | 119 var virDir = new VirtualDirectory(dir.path); |
| 120 | 120 |
| 121 virDir.serve(server); | 121 virDir.serve(server); |
| 122 | 122 |
| 123 return new HttpClient().get('localhost', server.port, '/dir/file') | 123 return getStatusCode(server.port, '/dir/file') |
| 124 .then((request) => request.close()) | |
| 125 .then((response) => response.drain().then( | |
| 126 (_) => response.statusCode)) | |
| 127 .whenComplete(() { | 124 .whenComplete(() { |
| 128 server.close(); | 125 server.close(); |
| 129 file.deleteSync(); | 126 file.deleteSync(); |
| 130 dir2.deleteSync(); | 127 dir2.deleteSync(); |
| 131 dir.deleteSync(); | 128 dir.deleteSync(); |
| 132 }); | 129 }); |
| 133 }), completion(equals(HttpStatus.NOT_FOUND))); | 130 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 134 }); | 131 }); |
| 135 }); | 132 }); |
| 136 }); | 133 }); |
| 134 |
| 135 group('last-mofidied', () { |
| 136 group('file', () { |
| 137 test('file-exists', () { |
| 138 expect(HttpServer.bind('localhost', 0).then((server) { |
| 139 var dir = new Directory('').createTempSync(); |
| 140 var file = new File('${dir.path}/file')..createSync(); |
| 141 var virDir = new VirtualDirectory(dir.path); |
| 142 |
| 143 virDir.serve(server); |
| 144 |
| 145 return getHeaders(server.port, '/file') |
| 146 .then((headers) { |
| 147 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); |
| 148 return HttpDate.parse( |
| 149 headers.value(HttpHeaders.LAST_MODIFIED)); |
| 150 }) |
| 151 .then((lastModified) { |
| 152 return new HttpClient().get('localhost', server.port, '/file') |
| 153 .then((request) { |
| 154 request.headers.ifModifiedSince = lastModified; |
| 155 return request.close(); |
| 156 }) |
| 157 .then((response) => response.drain().then( |
| 158 (_) => response.statusCode)); |
| 159 }) |
| 160 .whenComplete(() { |
| 161 server.close(); |
| 162 dir.deleteSync(recursive: true); |
| 163 }); |
| 164 }), completion(equals(HttpStatus.NOT_MODIFIED))); |
| 165 }); |
| 166 |
| 167 test('file-changes', () { |
| 168 expect(HttpServer.bind('localhost', 0).then((server) { |
| 169 var dir = new Directory('').createTempSync(); |
| 170 var file = new File('${dir.path}/file')..createSync(); |
| 171 var virDir = new VirtualDirectory(dir.path); |
| 172 |
| 173 virDir.serve(server); |
| 174 |
| 175 return getHeaders(server.port, '/file') |
| 176 .then((headers) { |
| 177 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); |
| 178 return HttpDate.parse( |
| 179 headers.value(HttpHeaders.LAST_MODIFIED)); |
| 180 }) |
| 181 .then((lastModified) { |
| 182 // Fake file changed by moving date back in time. |
| 183 lastModified = lastModified.subtract( |
| 184 const Duration(seconds: 10)); |
| 185 return new HttpClient().get('localhost', server.port, '/file') |
| 186 .then((request) { |
| 187 request.headers.ifModifiedSince = lastModified; |
| 188 return request.close(); |
| 189 }) |
| 190 .then((response) => response.drain().then( |
| 191 (_) => response.statusCode)); |
| 192 }) |
| 193 .whenComplete(() { |
| 194 server.close(); |
| 195 dir.deleteSync(recursive: true); |
| 196 }); |
| 197 }), completion(equals(HttpStatus.OK))); |
| 198 }); |
| 199 }); |
| 200 }); |
| 137 } | 201 } |
| 138 | 202 |
| OLD | NEW |