blob: 4fe9c6662ffb1f4b8e7d178a24bde5db6eacc7bc [file] [log] [blame]
// Copyright (c) 2017, 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.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
class DirectoryMock extends FileSystemEntity implements Directory {
final String path = "/mockdir";
DirectoryMock(String path);
static DirectoryMock createDirectory(String path) => new DirectoryMock(path);
static DirectoryMock getCurrent() => new DirectoryMock("");
static void setCurrent(String path) {}
static DirectoryMock getSystemTemp() => new DirectoryMock("");
Uri get uri => throw "";
Future<Directory> create({bool recursive: false}) => throw "";
void createSync({bool recursive: false}) {}
Future<Directory> createTemp([String? prefix]) => throw "";
Directory createTempSync([String? prefix]) => throw "";
Future<bool> exists() => throw "";
bool existsSync() => false;
Future<String> resolveSymbolicLinks() => throw "";
String resolveSymbolicLinksSync() => throw "";
Future<Directory> rename(String newPath) => throw "";
Directory renameSync(String newPath) => throw "";
Directory get absolute => throw "";
Stream<FileSystemEntity> list(
{bool recursive: false, bool followLinks: true}) =>
throw "";
List<FileSystemEntity> listSync(
{bool recursive: false, bool followLinks: true}) =>
throw "";
}
class FileMock extends FileSystemEntity implements File {
String get path => "/mockfile";
FileMock(String path);
static FileMock createFile(String path) => new FileMock(path);
Future<File> create({bool recursive: false}) => throw "";
void createSync({bool recursive: false}) {}
Future<File> rename(String newPath) => throw "";
File renameSync(String newPath) => throw "";
Future<File> copy(String newPath) => throw "";
File copySync(String newPath) => throw "";
Future<bool> exists() => throw "";
bool existsSync() => false;
Future<int> length() => throw "";
int lengthSync() => throw "";
File get absolute => throw "";
Future<DateTime> lastAccessed() => throw "";
DateTime lastAccessedSync() => throw "";
Future setLastAccessed(DateTime time) => throw "";
void setLastAccessedSync(DateTime time) {}
Future<DateTime> lastModified() => throw "";
DateTime lastModifiedSync() => throw "";
Future setLastModified(DateTime time) => throw "";
void setLastModifiedSync(DateTime time) {}
Future<RandomAccessFile> open({FileMode mode: FileMode.read}) => throw "";
RandomAccessFile openSync({FileMode mode: FileMode.read}) => throw "";
Stream<List<int>> openRead([int? start, int? end]) => throw "";
IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8}) =>
throw "";
Future<Uint8List> readAsBytes() => throw "";
Uint8List readAsBytesSync() => throw "";
Future<String> readAsString({Encoding encoding: utf8}) => throw "";
String readAsStringSync({Encoding encoding: utf8}) => throw "";
Future<List<String>> readAsLines({Encoding encoding: utf8}) => throw "";
List<String> readAsLinesSync({Encoding encoding: utf8}) => throw "";
Future<File> writeAsBytes(List<int> bytes,
{FileMode mode: FileMode.write, bool flush: false}) =>
throw "";
void writeAsBytesSync(List<int> bytes,
{FileMode mode: FileMode.write, bool flush: false}) {}
Future<File> writeAsString(String contents,
{FileMode mode: FileMode.write,
Encoding encoding: utf8,
bool flush: false}) =>
throw "";
void writeAsStringSync(String contents,
{FileMode mode: FileMode.write,
Encoding encoding: utf8,
bool flush: false}) {}
}
class FileStatMock implements FileStat {
final changed = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
final modified = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
final accessed = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
final type = FileSystemEntityType.file;
final int mode = 0;
final int size = 0;
FileStatMock();
static Future<FileStat> stat(String path) {
return new Future.value(new FileStatMock());
}
static FileStat statSync(String path) => new FileStatMock();
String modeString() => throw "";
}
class FileSystemEntityMock {
static Future<bool> identical(String path1, String path2) {
return new Future.value(false);
}
static bool identicalSync(String path1, String path2) => false;
static Future<FileSystemEntityType> getType(String path, bool followLinks) {
return new Future.value(FileSystemEntityType.file);
}
static FileSystemEntityType getTypeSync(String path, bool followLinks) {
return FileSystemEntityType.file;
}
}
final _mockFileSystemEvent = new Stream<FileSystemEvent>.empty();
class FileSystemWatcherMock {
static Stream<FileSystemEvent> watch(
String path, int events, bool recursive) =>
_mockFileSystemEvent;
static bool watchSupported() => false;
}
class LinkMock extends FileSystemEntity implements Link {
String get path => "/mocklink";
LinkMock(String path);
static Link createLink(String path) => new LinkMock(path);
Future<Link> create(String target, {bool recursive: false}) => throw "";
void createSync(String target, {bool recursive: false}) {}
void updateSync(String target) {}
Future<Link> update(String target) => throw "";
Future<bool> exists() => throw "";
bool existsSync() => false;
Future<String> resolveSymbolicLinks() => throw "";
String resolveSymbolicLinksSync() => throw "";
Future<Link> rename(String newPath) => throw "";
Link renameSync(String newPath) => throw "";
Link get absolute => throw "";
Future<String> target() => throw "";
String targetSync() => throw "";
}
Future<Socket> socketConnect(dynamic host, int port,
{dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) async {
throw "";
}
Future<ConnectionTask<Socket>> socketStartConnect(dynamic host, int port,
{dynamic sourceAddress, int sourcePort = 0}) async {
throw "";
}
Future<ServerSocket> serverSocketBind(dynamic address, int port,
{int backlog: 0, bool v6Only: false, bool shared: false}) async {
throw "";
}
class StdinMock extends Stream<List<int>> implements Stdin {
bool echoMode = false;
bool lineMode = false;
bool get hasTerminal => throw "";
bool get supportsAnsiEscapes => throw "";
int readByteSync() => throw "";
String readLineSync(
{Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
throw "";
StreamSubscription<List<int>> listen(void onData(List<int> event)?,
{Function? onError, void onDone()?, bool? cancelOnError}) {
throw "";
}
}
class StdoutMock implements Stdout {
Never noSuchMethod(Invocation i) => throw "";
}
Future<Null> ioOverridesRunTest() async {
StdoutMock stdoutMock = StdoutMock();
StdoutMock stderrMock = StdoutMock();
Future<Null> f = IOOverrides.runZoned(
() async {
Expect.isTrue(new Directory("directory") is DirectoryMock);
Expect.isTrue(Directory.current is DirectoryMock);
Expect.isTrue(Directory.systemTemp is DirectoryMock);
Expect.isTrue(new File("file") is FileMock);
Expect.isTrue(await FileStat.stat("file") is FileStatMock);
Expect.isTrue(FileStat.statSync("file") is FileStatMock);
Expect.isFalse(await FileSystemEntity.identical("file", "file"));
Expect.isFalse(FileSystemEntity.identicalSync("file", "file"));
Expect.equals(
await FileSystemEntity.type("file"), FileSystemEntityType.file);
Expect.equals(
FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
Expect.isFalse(FileSystemEntity.isWatchSupported);
Expect.identical(
_mockFileSystemEvent, new Directory("directory").watch());
Expect.isTrue(new Link("link") is LinkMock);
asyncExpectThrows(Socket.connect(null, 0));
asyncExpectThrows(Socket.startConnect(null, 0));
asyncExpectThrows(ServerSocket.bind(null, 0));
Expect.isTrue(stdin is StdinMock);
Expect.identical(stdout, stdoutMock);
Expect.identical(stderr, stderrMock);
},
createDirectory: DirectoryMock.createDirectory,
getCurrentDirectory: DirectoryMock.getCurrent,
setCurrentDirectory: DirectoryMock.setCurrent,
getSystemTempDirectory: DirectoryMock.getSystemTemp,
createFile: FileMock.createFile,
stat: FileStatMock.stat,
statSync: FileStatMock.statSync,
fseIdentical: FileSystemEntityMock.identical,
fseIdenticalSync: FileSystemEntityMock.identicalSync,
fseGetType: FileSystemEntityMock.getType,
fseGetTypeSync: FileSystemEntityMock.getTypeSync,
fsWatch: FileSystemWatcherMock.watch,
fsWatchIsSupported: FileSystemWatcherMock.watchSupported,
createLink: LinkMock.createLink,
socketConnect: socketConnect,
socketStartConnect: socketStartConnect,
serverSocketBind: serverSocketBind,
stdin: () => StdinMock(),
stdout: () => stdoutMock,
stderr: () => stderrMock,
);
Expect.isFalse(new Directory("directory") is DirectoryMock);
Expect.isTrue(new Directory("directory") is Directory);
await f;
}
class MyIOOverrides extends IOOverrides {
Directory createDirectory(String path) => DirectoryMock.createDirectory(path);
}
globalIOOverridesTest() {
IOOverrides.global = new MyIOOverrides();
Expect.isTrue(new Directory("directory") is DirectoryMock);
IOOverrides.global = null;
Directory dir = new Directory("directory");
Expect.isTrue(dir is! DirectoryMock);
Expect.isTrue(dir is Directory);
}
globalIOOverridesZoneTest() {
IOOverrides.global = new MyIOOverrides();
runZoned(() {
runZoned(() {
Expect.isTrue(new Directory("directory") is DirectoryMock);
});
});
IOOverrides.global = null;
Directory dir = new Directory("directory");
Expect.isTrue(dir is! DirectoryMock);
Expect.isTrue(dir is Directory);
}
main() async {
await ioOverridesRunTest();
globalIOOverridesTest();
globalIOOverridesZoneTest();
}