| 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 // VMOptions= | 5 // VMOptions= |
| 6 // VMOptions=--short_socket_read | 6 // VMOptions=--short_socket_read |
| 7 // VMOptions=--short_socket_write | 7 // VMOptions=--short_socket_write |
| 8 // VMOptions=--short_socket_read --short_socket_write | 8 // VMOptions=--short_socket_read --short_socket_write |
| 9 | 9 |
| 10 import "package:expect/expect.dart"; | 10 import "package:expect/expect.dart"; |
| 11 import "dart:async"; | 11 import "dart:async"; |
| 12 import "dart:io"; | 12 import "dart:io"; |
| 13 import "dart:typed_data"; | 13 import "dart:typed_data"; |
| 14 | 14 |
| 15 void testServerRequest(void handler(server, request), {int bytes}) { | 15 void testServerRequest(void handler(server, request), |
| 16 {int bytes, |
| 17 bool closeClient}) { |
| 16 HttpServer.bind("127.0.0.1", 0).then((server) { | 18 HttpServer.bind("127.0.0.1", 0).then((server) { |
| 17 server.listen((request) { | 19 server.listen((request) { |
| 18 handler(server, request); | 20 handler(server, request); |
| 19 }); | 21 }); |
| 20 | 22 |
| 21 var client = new HttpClient(); | 23 var client = new HttpClient(); |
| 22 // We only close the client on either | 24 // We only close the client on either |
| 23 // - Bad response headers | 25 // - Bad response headers |
| 24 // - Response done (with optional errors in between). | 26 // - Response done (with optional errors in between). |
| 25 client.get("127.0.0.1", server.port, "/") | 27 client.get("127.0.0.1", server.port, "/") |
| 26 .then((request) => request.close()) | 28 .then((request) => request.close()) |
| 27 .then((response) { | 29 .then((response) { |
| 28 int received = 0; | 30 int received = 0; |
| 29 response.listen( | 31 var subscription; |
| 30 (data) => received += data.length, | 32 subscription = response.listen( |
| 33 (data) { |
| 34 if (closeClient == true) { |
| 35 subscription.cancel(); |
| 36 client.close(); |
| 37 } else { |
| 38 received += data.length; |
| 39 } |
| 40 }, |
| 31 onDone: () { | 41 onDone: () { |
| 32 if (bytes != null) Expect.equals(received, bytes); | 42 if (bytes != null) Expect.equals(received, bytes); |
| 33 client.close(); | 43 client.close(); |
| 34 }, | 44 }, |
| 35 onError: (error) { | 45 onError: (error) { |
| 36 Expect.isTrue(error is HttpParserException); | 46 Expect.isTrue(error is HttpParserException); |
| 37 }); | 47 }); |
| 38 }) | 48 }) |
| 39 .catchError((error) { | 49 .catchError((error) { |
| 40 client.close(); | 50 client.close(); |
| 41 }, test: (e) => e is HttpParserException); | 51 }, test: (e) => e is HttpParserException); |
| 42 }); | 52 }); |
| 43 } | 53 } |
| 44 | 54 |
| 55 |
| 45 void testResponseDone() { | 56 void testResponseDone() { |
| 46 testServerRequest((server, request) { | 57 testServerRequest((server, request) { |
| 47 request.response.close(); | 58 request.response.close(); |
| 48 request.response.done.then((response) { | 59 request.response.done.then((response) { |
| 49 Expect.equals(request.response, response); | 60 Expect.equals(request.response, response); |
| 50 server.close(); | 61 server.close(); |
| 51 }); | 62 }); |
| 52 }); | 63 }); |
| 53 | 64 |
| 54 testServerRequest((server, request) { | 65 testServerRequest((server, request) { |
| 55 new File("__not_exitsing_file_").openRead().pipe(request.response) | 66 new File("__not_exitsing_file_").openRead().pipe(request.response) |
| 56 .catchError((e) { | 67 .catchError((e) { |
| 57 server.close(); | 68 server.close(); |
| 58 }); | 69 }); |
| 59 }); | 70 }); |
| 60 | 71 |
| 61 testServerRequest((server, request) { | 72 testServerRequest((server, request) { |
| 62 request.response.done.then((_) { | 73 request.response.done.then((_) { |
| 63 server.close(); | 74 server.close(); |
| 64 }); | 75 }); |
| 65 request.response.contentLength = 0; | 76 request.response.contentLength = 0; |
| 66 request.response.close(); | 77 request.response.close(); |
| 67 }); | 78 }); |
| 68 } | 79 } |
| 69 | 80 |
| 81 |
| 70 void testResponseAddStream() { | 82 void testResponseAddStream() { |
| 71 int bytes = new File(new Options().script).lengthSync(); | 83 int bytes = new File(new Options().script).lengthSync(); |
| 72 | 84 |
| 73 testServerRequest((server, request) { | 85 testServerRequest((server, request) { |
| 74 request.response.addStream(new File(new Options().script).openRead()) | 86 request.response.addStream(new File(new Options().script).openRead()) |
| 75 .then((response) { | 87 .then((response) { |
| 76 response.close(); | 88 response.close(); |
| 77 response.done.then((_) => server.close()); | 89 response.done.then((_) => server.close()); |
| 78 }); | 90 }); |
| 79 }, bytes: bytes); | 91 }, bytes: bytes); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 107 }); | 119 }); |
| 108 | 120 |
| 109 testServerRequest((server, request) { | 121 testServerRequest((server, request) { |
| 110 new File("__not_exitsing_file_").openRead().pipe(request.response) | 122 new File("__not_exitsing_file_").openRead().pipe(request.response) |
| 111 .catchError((e) { | 123 .catchError((e) { |
| 112 server.close(); | 124 server.close(); |
| 113 }); | 125 }); |
| 114 }); | 126 }); |
| 115 } | 127 } |
| 116 | 128 |
| 129 |
| 130 void testResponseAddStreamClosed() { |
| 131 testServerRequest((server, request) { |
| 132 request.response.addStream(new File(new Options().script).openRead()) |
| 133 .then((response) { |
| 134 response.close(); |
| 135 response.done.then((_) => server.close()); |
| 136 }); |
| 137 }, closeClient: true); |
| 138 |
| 139 testServerRequest((server, request) { |
| 140 int count = 0; |
| 141 write() { |
| 142 request.response.addStream(new File(new Options().script).openRead()) |
| 143 .then((response) { |
| 144 request.response.write("sync data"); |
| 145 count++; |
| 146 if (count < 1000) { |
| 147 write(); |
| 148 } else { |
| 149 response.close(); |
| 150 response.done.then((_) => server.close()); |
| 151 } |
| 152 }); |
| 153 } |
| 154 write(); |
| 155 }, closeClient: true); |
| 156 } |
| 157 |
| 158 |
| 159 void testResponseAddClosed() { |
| 160 testServerRequest((server, request) { |
| 161 request.response.add(new File(new Options().script).readAsBytesSync()); |
| 162 request.response.close(); |
| 163 request.response.done.then((_) => server.close()); |
| 164 }, closeClient: true); |
| 165 |
| 166 testServerRequest((server, request) { |
| 167 for (int i = 0; i < 1000; i++) { |
| 168 request.response.add(new File(new Options().script).readAsBytesSync()); |
| 169 } |
| 170 request.response.close(); |
| 171 request.response.done.then((_) => server.close()); |
| 172 }, closeClient: true); |
| 173 |
| 174 testServerRequest((server, request) { |
| 175 int count = 0; |
| 176 write() { |
| 177 request.response.add(new File(new Options().script).readAsBytesSync()); |
| 178 Timer.run(() { |
| 179 count++; |
| 180 if (count < 1000) { |
| 181 write(); |
| 182 } else { |
| 183 request.response.close(); |
| 184 request. response.done.then((_) => server.close()); |
| 185 } |
| 186 }); |
| 187 } |
| 188 write(); |
| 189 }, closeClient: true); |
| 190 } |
| 191 |
| 192 |
| 117 void testBadResponseAdd() { | 193 void testBadResponseAdd() { |
| 118 testServerRequest((server, request) { | 194 testServerRequest((server, request) { |
| 119 request.response.contentLength = 0; | 195 request.response.contentLength = 0; |
| 120 request.response.add([0]); | 196 request.response.add([0]); |
| 121 request.response.close(); | 197 request.response.close(); |
| 122 request.response.done.catchError((error) { | 198 request.response.done.catchError((error) { |
| 123 server.close(); | 199 server.close(); |
| 124 }, test: (e) => e is HttpException); | 200 }, test: (e) => e is HttpException); |
| 125 }); | 201 }); |
| 126 | 202 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 139 request.response.add(new Uint8List(64 * 1024)); | 215 request.response.add(new Uint8List(64 * 1024)); |
| 140 request.response.add(new Uint8List(64 * 1024)); | 216 request.response.add(new Uint8List(64 * 1024)); |
| 141 request.response.add(new Uint8List(64 * 1024)); | 217 request.response.add(new Uint8List(64 * 1024)); |
| 142 request.response.close(); | 218 request.response.close(); |
| 143 request.response.done.catchError((error) { | 219 request.response.done.catchError((error) { |
| 144 server.close(); | 220 server.close(); |
| 145 }, test: (e) => e is HttpException); | 221 }, test: (e) => e is HttpException); |
| 146 }); | 222 }); |
| 147 } | 223 } |
| 148 | 224 |
| 225 |
| 149 void testBadResponseClose() { | 226 void testBadResponseClose() { |
| 150 testServerRequest((server, request) { | 227 testServerRequest((server, request) { |
| 151 request.response.contentLength = 5; | 228 request.response.contentLength = 5; |
| 152 request.response.close(); | 229 request.response.close(); |
| 153 request.response.done.catchError((error) { | 230 request.response.done.catchError((error) { |
| 154 server.close(); | 231 server.close(); |
| 155 }, test: (e) => e is HttpException); | 232 }, test: (e) => e is HttpException); |
| 156 }); | 233 }); |
| 157 | 234 |
| 158 testServerRequest((server, request) { | 235 testServerRequest((server, request) { |
| 159 request.response.contentLength = 5; | 236 request.response.contentLength = 5; |
| 160 request.response.add([0]); | 237 request.response.add([0]); |
| 161 request.response.close(); | 238 request.response.close(); |
| 162 request.response.done.catchError((error) { | 239 request.response.done.catchError((error) { |
| 163 server.close(); | 240 server.close(); |
| 164 }, test: (e) => e is HttpException); | 241 }, test: (e) => e is HttpException); |
| 165 }); | 242 }); |
| 166 } | 243 } |
| 167 | 244 |
| 245 |
| 168 void main() { | 246 void main() { |
| 169 testResponseDone(); | 247 testResponseDone(); |
| 170 testResponseAddStream(); | 248 testResponseAddStream(); |
| 249 testResponseAddStreamClosed(); |
| 250 testResponseAddClosed(); |
| 171 testBadResponseAdd(); | 251 testBadResponseAdd(); |
| 172 testBadResponseClose(); | 252 testBadResponseClose(); |
| 173 } | 253 } |
| OLD | NEW |