blob: e95d5ddcf0e67e56058e2f946ea1dae71f632160 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library reader_test;
import 'dart:io';
import '../../../pkg/unittest/lib/unittest.dart'
import '../../archive/archive.dart';
final String dataPath = "utils/tests/archive/data";
main() {
test('reading a .tar.gz file', () {
var asyncDone = expectAsync0(() {});
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
var future = reader.openFilename("$dataPath/test-archive.tar.gz")
.then((input) {
var log = <String>[];
input.onEntry = (entry) => guardAsync(() {
log.add("Entry: ${entry.pathname}");
var stream = new StringInputStream(entry.openInputStream());
stream.onData = () => log.add("Contents: ${stream.read().trim()}");
stream.onClosed = () => log.add("Closed: ${entry.pathname}");
});
input.onError = registerException;
input.onClosed = () => guardAsync(() {
expect(log, orderedEquals([
"Entry: filename1",
"Contents: contents 1",
"Closed: filename1",
"Entry: filename2",
"Contents: contents 2",
"Closed: filename2",
"Entry: filename3",
"Contents: contents 3",
"Closed: filename3",
]));
}, asyncDone);
});
expect(future, completes);
});
test('reading a .tar.gz file with readAll', () {
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
var future = reader.openFilename("$dataPath/test-archive.tar.gz")
.then((input) => input.readAll())
.then((entries) {
entries = entries
.map((entry) => [entry.pathname, entry.contents.trim()])
.toList();
expect(entries[0], orderedEquals(["filename1", "contents 1"]));
expect(entries[1], orderedEquals(["filename2", "contents 2"]));
expect(entries[2], orderedEquals(["filename3", "contents 3"]));
});
expect(future, completes);
});
test('reading an in-memory .tar.gz', () {
var asyncDone = expectAsync0(() {});
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
var future = new File("$dataPath/test-archive.tar.gz").readAsBytes()
.then((bytes) => reader.openData(bytes))
.then((input) {
var log = <String>[];
input.onEntry = (entry) => guardAsync(() {
log.add("Entry: ${entry.pathname}");
var stream = new StringInputStream(entry.openInputStream());
stream.onData = () => log.add("Contents: ${stream.read().trim()}");
stream.onClosed = () => log.add("Closed: ${entry.pathname}");
});
input.onError = registerException;
input.onClosed = () => guardAsync(() {
expect(log, orderedEquals([
"Entry: filename1",
"Contents: contents 1",
"Closed: filename1",
"Entry: filename2",
"Contents: contents 2",
"Closed: filename2",
"Entry: filename3",
"Contents: contents 3",
"Closed: filename3",
]));
}, asyncDone);
});
expect(future, completes);
});
test("closing entries before they're read", () {
var asyncDone = expectAsync0(() {});
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
var future = reader.openFilename("$dataPath/test-archive.tar.gz")
.then((input) {
var log = <String>[];
input.onEntry = (entry) => guardAsync(() {
log.add("Entry: ${entry.pathname}");
var underlyingStream = entry.openInputStream();
var stream = new StringInputStream(underlyingStream);
stream.onData = () => log.add("Contents: ${stream.read().trim()}");
stream.onClosed = () => log.add("Closed: ${entry.pathname}");
underlyingStream.close();
});
input.onError = registerException;
input.onClosed = () => guardAsync(() {
expect(log, orderedEquals([
"Entry: filename1",
"Closed: filename1",
"Entry: filename2",
"Closed: filename2",
"Entry: filename3",
"Closed: filename3",
]));
}, asyncDone);
});
expect(future, completes);
});
test("closing an archive stream before it's finished", () {
var asyncDone = expectAsync0(() {});
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
var future = reader.openFilename("$dataPath/test-archive.tar.gz")
.then((input) {
var count = 0;
var log = <String>[];
input.onEntry = (entry) => guardAsync(() {
count += 1;
log.add("Entry: ${entry.pathname}");
var underlyingStream = entry.openInputStream();
var stream = new StringInputStream(underlyingStream);
stream.onData = () => log.add("Contents: ${stream.read().trim()}");
stream.onClosed = () => log.add("Closed: ${entry.pathname}");
if (count == 2) {
input.close();
expect(input.closed);
}
});
input.onError = registerException;
input.onClosed = () {
expect(log, orderedEquals([
"Entry: filename1",
"Contents: contents 1",
"Closed: filename1",
"Entry: filename2",
"Closed: filename2",
]));
asyncDone();
};
});
expect(future, completes);
});
test("opening a non-existent archive", () {
var reader = new ArchiveReader();
reader.format.tar = true;
reader.filter.gzip = true;
expect(reader.openFilename("$dataPath/non-existent.tar.gz"),
throwsA((e) => e is ArchiveException));
});
}