| Index: pkg/http_server/test/virtual_directory_test.dart
|
| diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
|
| index bc054622ae426a64522f2452def3aee40c45162f..c6b381a4110ac8198f58891ed3b8a5a220dc36c4 100644
|
| --- a/pkg/http_server/test/virtual_directory_test.dart
|
| +++ b/pkg/http_server/test/virtual_directory_test.dart
|
| @@ -525,6 +525,167 @@ void main() {
|
| });
|
| });
|
|
|
| + group('range', () {
|
| + var fileContent = [0, 1, 2, 3, 4, 5, 6, 7 ,8, 9];
|
| + var virDir;
|
| +
|
| + prepare(dir) {
|
| + new File('${dir.path}/file').writeAsBytesSync(fileContent);
|
| + virDir = new VirtualDirectory(dir.path);
|
| + }
|
| +
|
| + testVirtualDir('range', (dir) {
|
| + prepare(dir);
|
| + Future test(
|
| + int from, int to, [List<int> expected, String contentRange]) {
|
| + if (expected == null) {
|
| + expected = fileContent.sublist(from, to + 1);
|
| + }
|
| + if (contentRange == null) {
|
| + contentRange = 'bytes $from-$to/${fileContent.length}';
|
| + }
|
| + return getContentAndResponse(virDir, '/file', from: from, to: to)
|
| + .then(expectAsync((result) {
|
| + var content = result[0];
|
| + var response = result[1];
|
| + expect(content, expected);
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE][0],
|
| + contentRange);
|
| + expect(expected.length, response.headers.contentLength);
|
| + expect(response.statusCode, HttpStatus.PARTIAL_CONTENT);
|
| + }));
|
| + }
|
| +
|
| + return Future.forEach([
|
| + () => test(0, 0),
|
| + () => test(0, 1),
|
| + () => test(1, 2),
|
| + () => test(1, 9),
|
| + () => test(0, 9),
|
| + () => test(8, 9),
|
| + () => test(9, 9),
|
| + () => test(0, 10, fileContent, 'bytes 0-9/10'),
|
| + () => test(9, 10, [9], 'bytes 9-9/10'),
|
| + () => test(0, 1000, fileContent, 'bytes 0-9/10'),
|
| + ], (f) => f().then(expectAsync((_) {})));
|
| + });
|
| +
|
| + testVirtualDir('prefix-range', (dir) {
|
| + prepare(dir);
|
| + Future test(int from,
|
| + [List<int> expected,
|
| + String contentRange,
|
| + bool expectContentRange = true,
|
| + int expectedStatusCode = HttpStatus.PARTIAL_CONTENT]) {
|
| + if (expected == null) {
|
| + expected = fileContent.sublist(from, fileContent.length);
|
| + }
|
| + if (contentRange == null && expectContentRange) {
|
| + contentRange = 'bytes ${from}-'
|
| + '${fileContent.length - 1}/'
|
| + '${fileContent.length}';
|
| + }
|
| + return getContentAndResponse(virDir, '/file', from: from)
|
| + .then(expectAsync((result) {
|
| + var content = result[0];
|
| + var response = result[1];
|
| + expect(content, expected);
|
| + if (expectContentRange) {
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE][0],
|
| + contentRange);
|
| + } else {
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE], null);
|
| + }
|
| + expect(response.statusCode, expectedStatusCode);
|
| + }));
|
| + }
|
| +
|
| + return Future.forEach([
|
| + () => test(0),
|
| + () => test(1),
|
| + () => test(9),
|
| + () => test(10, fileContent, null, false, HttpStatus.OK),
|
| + () => test(11, fileContent, null, false, HttpStatus.OK),
|
| + () => test(1000, fileContent, null, false, HttpStatus.OK),
|
| + ], (f) => f().then(expectAsync((_) {})));
|
| + });
|
| +
|
| + testVirtualDir('suffix-range', (dir) {
|
| + prepare(dir);
|
| + Future test(int to, [List<int> expected, String contentRange]) {
|
| + if (expected == null) {
|
| + expected = fileContent.sublist(fileContent.length - to,
|
| + fileContent.length);
|
| + }
|
| + if (contentRange == null) {
|
| + contentRange = 'bytes ${fileContent.length - to}-'
|
| + '${fileContent.length - 1}/'
|
| + '${fileContent.length}';
|
| + }
|
| + return getContentAndResponse(virDir, '/file', to: to)
|
| + .then(expectAsync((result) {
|
| + var content = result[0];
|
| + var response = result[1];
|
| + expect(content, expected);
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE][0],
|
| + contentRange);
|
| + expect(response.statusCode, HttpStatus.PARTIAL_CONTENT);
|
| + }));
|
| + }
|
| +
|
| + return Future.forEach([
|
| + () => test(1),
|
| + () => test(2),
|
| + () => test(9),
|
| + () => test(10),
|
| + () => test(11, fileContent, 'bytes 0-9/10'),
|
| + () => test(1000, fileContent, 'bytes 0-9/10')
|
| + ], (f) => f().then(expectAsync((_) {})));
|
| + });
|
| +
|
| + testVirtualDir('unsatisfiable-range', (dir) {
|
| + prepare(dir);
|
| + Future test(int from, int to) {
|
| + return getContentAndResponse(virDir, '/file', from: from, to: to)
|
| + .then(expectAsync((result) {
|
| + var content = result[0];
|
| + var response = result[1];
|
| + expect(content.length, 0);
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE], isNull);
|
| + expect(response.statusCode,
|
| + HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
| + }));
|
| + }
|
| +
|
| + return Future.forEach([
|
| + () => test(10, 11),
|
| + () => test(10, 1000),
|
| + () => test(1000, 1000)
|
| + ], (f) => f().then(expectAsync((_) {})));
|
| + });
|
| +
|
| + testVirtualDir('invalid-range', (dir) {
|
| + prepare(dir);
|
| + Future test(int from, int to) {
|
| + return getContentAndResponse(virDir, '/file', from: from, to: to)
|
| + .then(expectAsync((result) {
|
| + var content = result[0];
|
| + var response = result[1];
|
| + expect(content, fileContent);
|
| + expect(response.headers[HttpHeaders.CONTENT_RANGE], isNull);
|
| + expect(response.statusCode, HttpStatus.OK);
|
| + }));
|
| + }
|
| +
|
| + return Future.forEach([
|
| + () => test(1, 0),
|
| + () => test(10, 0),
|
| + () => test(1000, 999),
|
| + () => test(null, 0), // This is effectively range 10-9.
|
| + ], (f) => f().then(expectAsync((_) {})));
|
| + });
|
| + });
|
| +
|
| group('error-page', () {
|
| testVirtualDir('default', (dir) {
|
| var virDir = new VirtualDirectory(pathos.join(dir.path, 'foo'));
|
| @@ -637,8 +798,12 @@ void main() {
|
| };
|
|
|
| return getAsString(virDir, '/')
|
| - .then((result) {
|
| - expect(result, 'file contents');
|
| + .then((result) {
|
| + expect(result, 'file contents');
|
| + return getHeaders(virDir, '/')
|
| + .then(expectAsync((headers) {
|
| + expect('file contents'.length, headers.contentLength);
|
| + }));
|
| });
|
| });
|
| });
|
|
|