| Index: pkg/appengine/test/assets_test.dart
|
| diff --git a/pkg/appengine/test/assets_test.dart b/pkg/appengine/test/assets_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a5b3f7c59599ef139a93efe0ac8e62c674f480bd
|
| --- /dev/null
|
| +++ b/pkg/appengine/test/assets_test.dart
|
| @@ -0,0 +1,299 @@
|
| +import 'dart:async';
|
| +import 'dart:convert';
|
| +import 'dart:io';
|
| +
|
| +import 'package:appengine/src/appengine_context.dart';
|
| +import 'package:appengine/src/client_context.dart';
|
| +import 'package:appengine/src/server/assets.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +
|
| +class _AssetError extends TypeMatcher {
|
| + const _AssetError() : super("AssetError");
|
| + bool matches(item, Map matchState) => item is AssetError;
|
| +}
|
| +
|
| +const isAssetError = const _AssetError();
|
| +
|
| +// HTTP client which requests /test and completes with the binary
|
| +// body.
|
| +Future<List<int>> getAsset(int port, String path,
|
| + [int expectedStatusCode = 200]) {
|
| + var client;
|
| + client = new HttpClient();
|
| + return client.get('127.0.0.1', port, path)
|
| + .then((request) {
|
| + return request.close();
|
| + })
|
| + .then((response) {
|
| + expect(response.statusCode, expectedStatusCode);
|
| + return response
|
| + .fold([], (buf, data) => buf..addAll(data));
|
| + })
|
| + .whenComplete(() {
|
| + client.close();
|
| + });
|
| +}
|
| +
|
| +void main() {
|
| + if (!FileSystemEntity.isDirectorySync(AssetsManager.root)) {
|
| + throw new StateError('The directory "${AssetsManager.root}" does not '
|
| + 'exist in the current directory – "${Directory.current.path}". '
|
| + 'Try running from the "test" directory.');
|
| + }
|
| +
|
| + test('use pub serve', () {
|
| + var uri = Uri.parse("http://localhost:9090");
|
| + var context;
|
| +
|
| + context = new AppengineContext(
|
| + 'dev', null, null, null, null, uri);
|
| + expect(context.isDevelopmentEnvironment, isTrue);
|
| + expect(context.assets.usePubServe, isTrue);
|
| +
|
| + context = new AppengineContext(
|
| + 's', null, null, null, null, uri);
|
| + expect(context.isDevelopmentEnvironment, isFalse);
|
| + expect(context.assets.usePubServe, isFalse);
|
| +
|
| + context = new AppengineContext(
|
| + 'dev', null, null, null, null, null);
|
| + expect(context.isDevelopmentEnvironment, isTrue);
|
| + expect(context.assets.usePubServe, isFalse);
|
| +
|
| + context = new AppengineContext(
|
| + 's', null, null, null, null, null);
|
| + expect(context.isDevelopmentEnvironment, isFalse);
|
| + expect(context.assets.usePubServe, isFalse);
|
| + });
|
| +
|
| + group('pub serve proxy', () {
|
| + var pubServe;
|
| + var appServer;
|
| + var appServerPort;
|
| + var pubServeUri;
|
| +
|
| + // 'pub serve' mock which expects /test request and returns a
|
| + // fixed body.
|
| + Future startPubServeMock() {
|
| + return HttpServer.bind('127.0.0.1', 0).then((server) {
|
| + server.listen(expectAsync((request) {
|
| + if (request.uri.path == '/test') {
|
| + request.response.statusCode = HttpStatus.NOT_FOUND;
|
| + } else if (request.uri.path == '/test.html') {
|
| + request.response.write('pub serve html');
|
| + } else {
|
| + expect(request.uri.path, '/test.css');
|
| + request.response.write('pub serve css');
|
| + }
|
| + request.response.close();
|
| + }));
|
| + return server;
|
| + });
|
| + }
|
| +
|
| + // Mock application server which passes the Assets instance to the
|
| + // request handler.
|
| + Future startAppServer(mockRequestHandler) {
|
| + assert(appServer == null);
|
| + return HttpServer.bind('127.0.0.1', 0).then((server) {
|
| + var appengineContext = new AppengineContext(
|
| + 'dev', null, null, null, null, pubServeUri);
|
| + appServer = server;
|
| + appServerPort = server.port;
|
| + server.listen((request) {
|
| + var assets = new AssetsImpl(request, appengineContext);
|
| + mockRequestHandler(request, assets);
|
| + });
|
| + return server;
|
| + });
|
| + }
|
| +
|
| + setUp(() {
|
| + return startPubServeMock().then((server) {
|
| + pubServe = server;
|
| + pubServeUri =
|
| + new Uri.http('${server.address.address}:${server.port}', '');
|
| + });
|
| + });
|
| +
|
| + tearDown(() {
|
| + return pubServe.close().then((_) {
|
| + pubServe = null;
|
| + return appServer.close().then((_) {
|
| + appServer = null;
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test not found serve', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve();
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(
|
| + appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) {
|
| + expect(body, isEmpty);
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test not found read', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.read('/test').then((stream) {
|
| + fail('Unexpected');
|
| + }).catchError((e) {
|
| + expect(e, isAssetError);
|
| + request.response
|
| + ..statusCode = HttpStatus.NOT_FOUND
|
| + ..close();
|
| + });
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(
|
| + appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) {
|
| + expect(body, isEmpty);
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test serve', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve();
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.html').then((body) {
|
| + expect(LATIN1.decode(body), 'pub serve html');
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test serve path', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve('/test.css');
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.css').then((body) {
|
| + expect(LATIN1.decode(body), 'pub serve css');
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test read', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.read('/test.html').then((stream) {
|
| + return stream.pipe(request.response);
|
| + });
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.html').then((body) {
|
| + expect(LATIN1.decode(body), 'pub serve html');
|
| + });
|
| + });
|
| + });
|
| + });
|
| +
|
| + group('no pub serve proxy', () {
|
| + var appServer;
|
| + var appServerPort;
|
| +
|
| + // Mock application server which passes the Assets instance to the
|
| + // request handler.
|
| + Future startAppServer(mockRequestHandler) {
|
| + assert(appServer == null);
|
| + return HttpServer.bind('127.0.0.1', 0).then((server) {
|
| + var appengineContext = new AppengineContext(
|
| + null, null, null, null, null, null);
|
| + appServer = server;
|
| + appServerPort = server.port;
|
| + server.listen((request) {
|
| + var assets = new AssetsImpl(request, appengineContext);
|
| + mockRequestHandler(request, assets);
|
| + });
|
| + return server;
|
| + });
|
| + }
|
| +
|
| + tearDown(() {
|
| + return appServer.close().then((_) {
|
| + appServer = null;
|
| + });
|
| + });
|
| +
|
| + test('test not found serve', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve();
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(
|
| + appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) {
|
| + expect(body, isEmpty);
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test not found read', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.read('/test').then((stream) {
|
| + fail('Unexpected');
|
| + }).catchError((e) {
|
| + expect(e, isAssetError);
|
| + request.response
|
| + ..statusCode = HttpStatus.NOT_FOUND
|
| + ..close();
|
| + });
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(
|
| + appServerPort, '/test', HttpStatus.NOT_FOUND).then((body) {
|
| + expect(body, isEmpty);
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test serve', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve();
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.html').then((body) {
|
| + expect(LATIN1.decode(body), 'from build html');
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test serve path', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.serve('/test.css');
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.html').then((body) {
|
| + expect(LATIN1.decode(body), 'from build css');
|
| + });
|
| + });
|
| + });
|
| +
|
| + test('test read', () {
|
| + void requestHandler(HttpRequest request, Assets assets) {
|
| + assets.read('/test.html').then((stream) {
|
| + return stream.pipe(request.response);
|
| + });
|
| + }
|
| +
|
| + return startAppServer(requestHandler).then((_) {
|
| + return getAsset(appServerPort, '/test.html').then((body) {
|
| + expect(LATIN1.decode(body), 'from build html');
|
| + });
|
| + });
|
| + });
|
| + });
|
| +}
|
|
|