blob: 59f693061f900106bc760808733ed5d9485f9b1e [file] [log] [blame]
// Copyright (c) 2020, 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 file_sample;
import 'dart:async';
import 'dart:html';
import 'package:async_helper/async_helper.dart';
import 'package:expect/minitest.dart';
// Expected output from all functions, asynchronous, and event routines.
const String log_results = 'test-first\n' +
'acquire START\n' +
'acquire CALLBACK START\n' +
'acquire CALLBACK END\n' +
'first START\n' +
'first END\n' +
'test-second\n' +
'second START\n' +
'second END\n' +
'reader onLoadEnd event\n' +
'file content = XYZZY Output\n';
// Simple logger to record all output.
class Logger {
StringBuffer _log = new StringBuffer();
void log(String message) {
_log.writeln(message);
}
String get contents => _log.toString();
}
Logger testLog = new Logger();
Future<FileSystem>? _fileSystem;
late DirectoryEntry _myDirectory;
Future<FileSystem> get fileSystem async {
if (_fileSystem != null) return _fileSystem!;
testLog.log('acquire START');
_fileSystem = window.requestFileSystem(100);
var fs = await _fileSystem!;
testLog.log('acquire CALLBACK START');
expect(fs.runtimeType, FileSystem);
expect(fs.root.runtimeType, DirectoryEntry);
testLog.log('acquire CALLBACK END');
return _fileSystem!;
}
Future<FileEntry> createFile() async {
var fs = await fileSystem;
_myDirectory =
await fs.root!.createDirectory('my_directory') as DirectoryEntry;
FileEntry fileEntry = await _myDirectory.createFile('log.txt') as FileEntry;
expect(fileEntry.isFile, true);
expect(fileEntry.name, 'log.txt');
expect(fileEntry.fullPath, '/my_directory/log.txt');
FileWriter writer = await fileEntry.createWriter();
Blob blob = new Blob(['XYZZY Output'], 'text/plain');
writer.write(blob);
var reader = new FileReader();
var completer = new Completer<String>();
reader.onLoadEnd.listen((event) {
testLog.log('reader onLoadEnd event');
dynamic target = event.currentTarget;
testLog.log('file content = ${target.result}');
expect(target.result, 'XYZZY Output');
completer.complete(target.result);
});
Blob readBlob = await fileEntry.file();
reader.readAsText(readBlob);
// Wait until onLoadEnd if fired.
await completer.future;
return new Future<FileEntry>.value(fileEntry);
}
Future<List<Entry>> readEntries(DirectoryEntry directory) async {
DirectoryReader reader = directory.createReader();
List<Entry> entries = await reader.readEntries();
return entries;
}
Future testFileSystemRequest() async {
testLog.log('test-first');
var fs = await fileSystem;
testLog.log('first START');
expect(fs.runtimeType, FileSystem);
expect(fs.root.runtimeType, DirectoryEntry);
testLog.log('first END');
}
Future testFileSystemRequestCreateRW() async {
testLog.log('test-second');
var fs = await fileSystem;
testLog.log('second START');
expect(fs.runtimeType, FileSystem);
expect(fs.root.runtimeType, DirectoryEntry);
testLog.log('second END');
FileEntry fileEntry = await createFile();
expect(fileEntry.name, 'log.txt');
List<Entry> entries = await readEntries(fs.root!);
expect(entries.length > 0, true);
expect(entries[0].isDirectory, true);
expect(entries[0].name, 'my_directory');
List<Entry> myEntries = await readEntries(_myDirectory);
expect(myEntries.length, 1);
expect(myEntries[0].isFile, true);
expect(myEntries[0].name, 'log.txt');
// Validate every function, async and event mechanism successfully ran.
expect(testLog.contents, log_results);
}
main() {
asyncTest(() async {
await testFileSystemRequest();
await testFileSystemRequestCreateRW();
});
}