OLD | NEW |
(Empty) | |
| 1 import 'dart:async'; |
| 2 import 'dart:convert'; |
| 3 import 'dart:io'; |
| 4 |
| 5 import 'package:appengine/src/appengine_context.dart'; |
| 6 import 'package:appengine/src/client_context.dart'; |
| 7 import 'package:appengine/src/server/assets.dart'; |
| 8 import 'package:unittest/unittest.dart'; |
| 9 |
| 10 |
| 11 class _AssetError extends TypeMatcher { |
| 12 const _AssetError() : super("AssetError"); |
| 13 bool matches(item, Map matchState) => item is AssetError; |
| 14 } |
| 15 |
| 16 const isAssetError = const _AssetError(); |
| 17 |
| 18 // HTTP client which requests /test and completes with the binary |
| 19 // body. |
| 20 Future<List<int>> getAsset(int port, String path, |
| 21 [int expectedStatusCode = 200]) { |
| 22 var client; |
| 23 client = new HttpClient(); |
| 24 return client.get('127.0.0.1', port, path) |
| 25 .then((request) { |
| 26 return request.close(); |
| 27 }) |
| 28 .then((response) { |
| 29 expect(response.statusCode, expectedStatusCode); |
| 30 return response |
| 31 .fold([], (buf, data) => buf..addAll(data)); |
| 32 }) |
| 33 .whenComplete(() { |
| 34 client.close(); |
| 35 }); |
| 36 } |
| 37 |
| 38 void main() { |
| 39 if (!FileSystemEntity.isDirectorySync(AssetsManager.root)) { |
| 40 throw new StateError('The directory "${AssetsManager.root}" does not ' |
| 41 'exist in the current directory – "${Directory.current.path}". ' |
| 42 'Try running from the "test" directory.'); |
| 43 } |
| 44 |
| 45 test('use pub serve', () { |
| 46 var uri = Uri.parse("http://localhost:9090"); |
| 47 var context; |
| 48 |
| 49 context = new AppengineContext( |
| 50 'dev', null, null, null, null, uri); |
| 51 expect(context.isDevelopmentEnvironment, isTrue); |
| 52 expect(context.assets.usePubServe, isTrue); |
| 53 |
| 54 context = new AppengineContext( |
| 55 's', null, null, null, null, uri); |
| 56 expect(context.isDevelopmentEnvironment, isFalse); |
| 57 expect(context.assets.usePubServe, isFalse); |
| 58 |
| 59 context = new AppengineContext( |
| 60 'dev', null, null, null, null, null); |
| 61 expect(context.isDevelopmentEnvironment, isTrue); |
| 62 expect(context.assets.usePubServe, isFalse); |
| 63 |
| 64 context = new AppengineContext( |
| 65 's', null, null, null, null, null); |
| 66 expect(context.isDevelopmentEnvironment, isFalse); |
| 67 expect(context.assets.usePubServe, isFalse); |
| 68 }); |
| 69 |
| 70 group('pub serve proxy', () { |
| 71 var pubServe; |
| 72 var appServer; |
| 73 var appServerPort; |
| 74 var pubServeUri; |
| 75 |
| 76 // 'pub serve' mock which expects /test request and returns a |
| 77 // fixed body. |
| 78 Future startPubServeMock() { |
| 79 return HttpServer.bind('127.0.0.1', 0).then((server) { |
| 80 server.listen(expectAsync((request) { |
| 81 if (request.uri.path == '/test') { |
| 82 request.response.statusCode = HttpStatus.NOT_FOUND; |
| 83 } else if (request.uri.path == '/test.html') { |
| 84 request.response.write('pub serve html'); |
| 85 } else { |
| 86 expect(request.uri.path, '/test.css'); |
| 87 request.response.write('pub serve css'); |
| 88 } |
| 89 request.response.close(); |
| 90 })); |
| 91 return server; |
| 92 }); |
| 93 } |
| 94 |
| 95 // Mock application server which passes the Assets instance to the |
| 96 // request handler. |
| 97 Future startAppServer(mockRequestHandler) { |
| 98 assert(appServer == null); |
| 99 return HttpServer.bind('127.0.0.1', 0).then((server) { |
| 100 var appengineContext = new AppengineContext( |
| 101 'dev', null, null, null, null, pubServeUri); |
| 102 appServer = server; |
| 103 appServerPort = server.port; |
| 104 server.listen((request) { |
| 105 var assets = new AssetsImpl(request, appengineContext); |
| 106 mockRequestHandler(request, assets); |
| 107 }); |
| 108 return server; |
| 109 }); |
| 110 } |
| 111 |
| 112 setUp(() { |
| 113 return startPubServeMock().then((server) { |
| 114 pubServe = server; |
| 115 pubServeUri = |
| 116 new Uri.http('${server.address.address}:${server.port}', ''); |
| 117 }); |
| 118 }); |
| 119 |
| 120 tearDown(() { |
| 121 return pubServe.close().then((_) { |
| 122 pubServe = null; |
| 123 return appServer.close().then((_) { |
| 124 appServer = null; |
| 125 }); |
| 126 }); |
| 127 }); |
| 128 |
| 129 test('test not found serve', () { |
| 130 void requestHandler(HttpRequest request, Assets assets) { |
| 131 assets.serve(); |
| 132 } |
| 133 |
| 134 return startAppServer(requestHandler).then((_) { |
| 135 return getAsset( |
| 136 appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) { |
| 137 expect(body, isEmpty); |
| 138 }); |
| 139 }); |
| 140 }); |
| 141 |
| 142 test('test not found read', () { |
| 143 void requestHandler(HttpRequest request, Assets assets) { |
| 144 assets.read('/test').then((stream) { |
| 145 fail('Unexpected'); |
| 146 }).catchError((e) { |
| 147 expect(e, isAssetError); |
| 148 request.response |
| 149 ..statusCode = HttpStatus.NOT_FOUND |
| 150 ..close(); |
| 151 }); |
| 152 } |
| 153 |
| 154 return startAppServer(requestHandler).then((_) { |
| 155 return getAsset( |
| 156 appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) { |
| 157 expect(body, isEmpty); |
| 158 }); |
| 159 }); |
| 160 }); |
| 161 |
| 162 test('test serve', () { |
| 163 void requestHandler(HttpRequest request, Assets assets) { |
| 164 assets.serve(); |
| 165 } |
| 166 |
| 167 return startAppServer(requestHandler).then((_) { |
| 168 return getAsset(appServerPort, '/test.html').then((body) { |
| 169 expect(LATIN1.decode(body), 'pub serve html'); |
| 170 }); |
| 171 }); |
| 172 }); |
| 173 |
| 174 test('test serve path', () { |
| 175 void requestHandler(HttpRequest request, Assets assets) { |
| 176 assets.serve('/test.css'); |
| 177 } |
| 178 |
| 179 return startAppServer(requestHandler).then((_) { |
| 180 return getAsset(appServerPort, '/test.css').then((body) { |
| 181 expect(LATIN1.decode(body), 'pub serve css'); |
| 182 }); |
| 183 }); |
| 184 }); |
| 185 |
| 186 test('test read', () { |
| 187 void requestHandler(HttpRequest request, Assets assets) { |
| 188 assets.read('/test.html').then((stream) { |
| 189 return stream.pipe(request.response); |
| 190 }); |
| 191 } |
| 192 |
| 193 return startAppServer(requestHandler).then((_) { |
| 194 return getAsset(appServerPort, '/test.html').then((body) { |
| 195 expect(LATIN1.decode(body), 'pub serve html'); |
| 196 }); |
| 197 }); |
| 198 }); |
| 199 }); |
| 200 |
| 201 group('no pub serve proxy', () { |
| 202 var appServer; |
| 203 var appServerPort; |
| 204 |
| 205 // Mock application server which passes the Assets instance to the |
| 206 // request handler. |
| 207 Future startAppServer(mockRequestHandler) { |
| 208 assert(appServer == null); |
| 209 return HttpServer.bind('127.0.0.1', 0).then((server) { |
| 210 var appengineContext = new AppengineContext( |
| 211 null, null, null, null, null, null); |
| 212 appServer = server; |
| 213 appServerPort = server.port; |
| 214 server.listen((request) { |
| 215 var assets = new AssetsImpl(request, appengineContext); |
| 216 mockRequestHandler(request, assets); |
| 217 }); |
| 218 return server; |
| 219 }); |
| 220 } |
| 221 |
| 222 tearDown(() { |
| 223 return appServer.close().then((_) { |
| 224 appServer = null; |
| 225 }); |
| 226 }); |
| 227 |
| 228 test('test not found serve', () { |
| 229 void requestHandler(HttpRequest request, Assets assets) { |
| 230 assets.serve(); |
| 231 } |
| 232 |
| 233 return startAppServer(requestHandler).then((_) { |
| 234 return getAsset( |
| 235 appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) { |
| 236 expect(body, isEmpty); |
| 237 }); |
| 238 }); |
| 239 }); |
| 240 |
| 241 test('test not found read', () { |
| 242 void requestHandler(HttpRequest request, Assets assets) { |
| 243 assets.read('/test').then((stream) { |
| 244 fail('Unexpected'); |
| 245 }).catchError((e) { |
| 246 expect(e, isAssetError); |
| 247 request.response |
| 248 ..statusCode = HttpStatus.NOT_FOUND |
| 249 ..close(); |
| 250 }); |
| 251 } |
| 252 |
| 253 return startAppServer(requestHandler).then((_) { |
| 254 return getAsset( |
| 255 appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) { |
| 256 expect(body, isEmpty); |
| 257 }); |
| 258 }); |
| 259 }); |
| 260 |
| 261 test('test serve', () { |
| 262 void requestHandler(HttpRequest request, Assets assets) { |
| 263 assets.serve(); |
| 264 } |
| 265 |
| 266 return startAppServer(requestHandler).then((_) { |
| 267 return getAsset(appServerPort, '/test.html').then((body) { |
| 268 expect(LATIN1.decode(body), 'from build html'); |
| 269 }); |
| 270 }); |
| 271 }); |
| 272 |
| 273 test('test serve path', () { |
| 274 void requestHandler(HttpRequest request, Assets assets) { |
| 275 assets.serve('/test.css'); |
| 276 } |
| 277 |
| 278 return startAppServer(requestHandler).then((_) { |
| 279 return getAsset(appServerPort, '/test.html').then((body) { |
| 280 expect(LATIN1.decode(body), 'from build css'); |
| 281 }); |
| 282 }); |
| 283 }); |
| 284 |
| 285 test('test read', () { |
| 286 void requestHandler(HttpRequest request, Assets assets) { |
| 287 assets.read('/test.html').then((stream) { |
| 288 return stream.pipe(request.response); |
| 289 }); |
| 290 } |
| 291 |
| 292 return startAppServer(requestHandler).then((_) { |
| 293 return getAsset(appServerPort, '/test.html').then((body) { |
| 294 expect(LATIN1.decode(body), 'from build html'); |
| 295 }); |
| 296 }); |
| 297 }); |
| 298 }); |
| 299 } |
OLD | NEW |