2019-11-27 23:04:02 +00:00
|
|
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
2017-03-15 18:28:14 +00:00
|
|
|
// 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:io' as io;
|
|
|
|
|
2019-09-30 15:41:12 +00:00
|
|
|
import 'package:file/memory.dart';
|
2017-03-15 18:28:14 +00:00
|
|
|
import 'package:flutter_tools/src/base/io.dart';
|
|
|
|
import 'package:mockito/mockito.dart';
|
|
|
|
|
2019-07-13 18:51:44 +00:00
|
|
|
import '../../src/common.dart';
|
|
|
|
import '../../src/context.dart';
|
2019-09-30 15:41:12 +00:00
|
|
|
import '../../src/io.dart';
|
2017-03-15 18:28:14 +00:00
|
|
|
|
|
|
|
void main() {
|
2019-09-30 15:41:12 +00:00
|
|
|
test('IOOverrides can inject a memory file system', () async {
|
|
|
|
final MemoryFileSystem memoryFileSystem = MemoryFileSystem();
|
|
|
|
final FlutterIOOverrides flutterIOOverrides = FlutterIOOverrides(fileSystem: memoryFileSystem);
|
|
|
|
await io.IOOverrides.runWithIOOverrides(() async {
|
|
|
|
// statics delegate correctly.
|
|
|
|
expect(io.FileSystemEntity.isWatchSupported, memoryFileSystem.isWatchSupported);
|
|
|
|
expect(io.Directory.systemTemp.path, memoryFileSystem.systemTempDirectory.path);
|
2017-03-15 18:28:14 +00:00
|
|
|
|
2019-09-30 15:41:12 +00:00
|
|
|
// can create and write to files/directories sync.
|
|
|
|
final io.File file = io.File('abc');
|
|
|
|
file.writeAsStringSync('def');
|
|
|
|
final io.Directory directory = io.Directory('foobar');
|
|
|
|
directory.createSync();
|
2017-03-15 18:28:14 +00:00
|
|
|
|
2019-09-30 15:41:12 +00:00
|
|
|
expect(memoryFileSystem.file('abc').existsSync(), true);
|
|
|
|
expect(memoryFileSystem.file('abc').readAsStringSync(), 'def');
|
|
|
|
expect(memoryFileSystem.directory('foobar').existsSync(), true);
|
2017-03-15 18:28:14 +00:00
|
|
|
|
2019-09-30 15:41:12 +00:00
|
|
|
// can create and write to files/directories async.
|
|
|
|
final io.File fileB = io.File('xyz');
|
|
|
|
await fileB.writeAsString('def');
|
|
|
|
final io.Directory directoryB = io.Directory('barfoo');
|
|
|
|
await directoryB.create();
|
2017-03-15 18:28:14 +00:00
|
|
|
|
2019-09-30 15:41:12 +00:00
|
|
|
expect(memoryFileSystem.file('xyz').existsSync(), true);
|
|
|
|
expect(memoryFileSystem.file('xyz').readAsStringSync(), 'def');
|
|
|
|
expect(memoryFileSystem.directory('barfoo').existsSync(), true);
|
|
|
|
|
|
|
|
// Links
|
|
|
|
final io.Link linkA = io.Link('hhh');
|
|
|
|
final io.Link linkB = io.Link('ggg');
|
|
|
|
io.File('jjj').createSync();
|
|
|
|
io.File('lll').createSync();
|
|
|
|
await linkA.create('jjj');
|
|
|
|
linkB.createSync('lll');
|
|
|
|
|
|
|
|
expect(await memoryFileSystem.link('hhh').resolveSymbolicLinks(), await linkA.resolveSymbolicLinks());
|
|
|
|
expect(memoryFileSystem.link('ggg').resolveSymbolicLinksSync(), linkB.resolveSymbolicLinksSync());
|
|
|
|
}, flutterIOOverrides);
|
|
|
|
});
|
|
|
|
testUsingContext('ProcessSignal signals are properly delegated', () async {
|
|
|
|
final MockIoProcessSignal mockSignal = MockIoProcessSignal();
|
|
|
|
final ProcessSignal signalUnderTest = ProcessSignal(mockSignal);
|
|
|
|
final StreamController<io.ProcessSignal> controller = StreamController<io.ProcessSignal>();
|
|
|
|
|
|
|
|
when(mockSignal.watch()).thenAnswer((Invocation invocation) => controller.stream);
|
|
|
|
controller.add(mockSignal);
|
|
|
|
|
|
|
|
expect(signalUnderTest, await signalUnderTest.watch().first);
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('ProcessSignal toString() works', () async {
|
|
|
|
expect(io.ProcessSignal.sigint.toString(), ProcessSignal.SIGINT.toString());
|
2017-03-15 18:28:14 +00:00
|
|
|
});
|
2019-12-10 02:58:29 +00:00
|
|
|
|
|
|
|
test('exit throws a StateError if called without being overriden', () {
|
2020-01-16 20:43:03 +00:00
|
|
|
expect(() => exit(0), throwsAssertionError);
|
2019-12-10 02:58:29 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
test('exit does not throw a StateError if overriden', () {
|
2020-01-06 21:30:21 +00:00
|
|
|
try {
|
|
|
|
setExitFunctionForTests((int value) {});
|
2019-12-10 02:58:29 +00:00
|
|
|
|
2020-01-06 21:30:21 +00:00
|
|
|
expect(() => exit(0), returnsNormally);
|
|
|
|
} finally {
|
|
|
|
restoreExitFunction();
|
|
|
|
}
|
2019-12-10 02:58:29 +00:00
|
|
|
});
|
2019-12-11 21:31:30 +00:00
|
|
|
|
|
|
|
test('test_api defines the Declarer in a known place', () {
|
|
|
|
expect(Zone.current[#test.declarer], isNotNull);
|
|
|
|
});
|
2019-12-16 22:57:29 +00:00
|
|
|
|
|
|
|
test('listNetworkInterfaces() uses overrides', () async {
|
|
|
|
setNetworkInterfaceLister(
|
|
|
|
({
|
|
|
|
bool includeLoopback,
|
|
|
|
bool includeLinkLocal,
|
|
|
|
InternetAddressType type,
|
|
|
|
}) async => <NetworkInterface>[],
|
|
|
|
);
|
|
|
|
|
|
|
|
expect(await listNetworkInterfaces(), isEmpty);
|
|
|
|
|
|
|
|
resetNetworkInterfaceLister();
|
|
|
|
});
|
2017-03-15 18:28:14 +00:00
|
|
|
}
|
|
|
|
|
2017-12-19 21:13:57 +00:00
|
|
|
class MockIoProcessSignal extends Mock implements io.ProcessSignal {}
|