mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

...because otherwise, processes that think they're manipulating your filesystem will be doing crazy things the test is ignoring, leading to (at best) failures and (at worst) flakes or disk corruption.
99 lines
4.2 KiB
Dart
99 lines
4.2 KiB
Dart
// Copyright 2019 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:file/memory.dart';
|
|
import 'package:flutter_tools/src/base/context.dart';
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
|
import 'package:flutter_tools/src/base/logger.dart';
|
|
import 'package:flutter_tools/src/base/platform.dart';
|
|
import 'package:flutter_tools/src/commands/clean.dart';
|
|
import 'package:flutter_tools/src/ios/xcodeproj.dart';
|
|
import 'package:flutter_tools/src/macos/xcode.dart';
|
|
import 'package:flutter_tools/src/project.dart';
|
|
import 'package:mockito/mockito.dart';
|
|
import 'package:process/process.dart';
|
|
|
|
import '../../src/common.dart';
|
|
import '../../src/context.dart';
|
|
|
|
void main() {
|
|
void test1() {
|
|
final MemoryFileSystem fs = MemoryFileSystem();
|
|
final MockXcodeProjectInterpreter mockXcodeProjectInterpreter = MockXcodeProjectInterpreter();
|
|
final MockXcode mockXcode = MockXcode();
|
|
|
|
final Directory currentDirectory = fs.currentDirectory;
|
|
final Directory buildDirectory = currentDirectory.childDirectory('build');
|
|
buildDirectory.createSync(recursive: true);
|
|
|
|
final FlutterProject projectUnderTest = FlutterProject.fromDirectory(currentDirectory);
|
|
projectUnderTest.ios.xcodeWorkspace.createSync(recursive: true);
|
|
projectUnderTest.macos.xcodeWorkspace.createSync(recursive: true);
|
|
|
|
projectUnderTest.dartTool.createSync(recursive: true);
|
|
projectUnderTest.android.ephemeralDirectory.createSync(recursive: true);
|
|
projectUnderTest.ios.ephemeralDirectory.createSync(recursive: true);
|
|
projectUnderTest.linux.ephemeralDirectory.createSync(recursive: true);
|
|
projectUnderTest.macos.ephemeralDirectory.createSync(recursive: true);
|
|
projectUnderTest.windows.ephemeralDirectory.createSync(recursive: true);
|
|
|
|
testUsingContext('$CleanCommand removes build and .dart_tool and ephemeral directories, cleans Xcode', () async {
|
|
when(mockXcode.isInstalledAndMeetsVersionCheck).thenReturn(true);
|
|
await CleanCommand().runCommand();
|
|
|
|
expect(buildDirectory.existsSync(), isFalse);
|
|
expect(projectUnderTest.dartTool.existsSync(), isFalse);
|
|
expect(projectUnderTest.android.ephemeralDirectory.existsSync(), isFalse);
|
|
expect(projectUnderTest.ios.ephemeralDirectory.existsSync(), isFalse);
|
|
expect(projectUnderTest.linux.ephemeralDirectory.existsSync(), isFalse);
|
|
expect(projectUnderTest.macos.ephemeralDirectory.existsSync(), isFalse);
|
|
expect(projectUnderTest.windows.ephemeralDirectory.existsSync(), isFalse);
|
|
|
|
verify(xcodeProjectInterpreter.cleanWorkspace(any, 'Runner')).called(2);
|
|
}, overrides: <Type, Generator>{
|
|
FileSystem: () => fs,
|
|
ProcessManager: () => FakeProcessManager(<FakeCommand>[]),
|
|
Xcode: () => mockXcode,
|
|
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
|
|
});
|
|
}
|
|
|
|
void test2() {
|
|
final MockXcode mockXcode = MockXcode();
|
|
final MockPlatform windowsPlatform = MockPlatform();
|
|
testUsingContext('$CleanCommand prints a helpful error message on Windows', () async {
|
|
when(mockXcode.isInstalledAndMeetsVersionCheck).thenReturn(false);
|
|
when(windowsPlatform.isWindows).thenReturn(true);
|
|
|
|
final MockFile mockFile = MockFile();
|
|
when(mockFile.existsSync()).thenReturn(true);
|
|
|
|
final BufferLogger logger = context.get<Logger>();
|
|
when(mockFile.deleteSync(recursive: true)).thenThrow(const FileSystemException('Deletion failed'));
|
|
final CleanCommand command = CleanCommand();
|
|
command.deleteFile(mockFile);
|
|
expect(logger.errorText, contains('A program may still be using a file'));
|
|
verify(mockFile.deleteSync(recursive: true)).called(1);
|
|
}, overrides: <Type, Generator>{
|
|
Platform: () => windowsPlatform,
|
|
Logger: () => BufferLogger(),
|
|
Xcode: () => mockXcode,
|
|
});
|
|
}
|
|
|
|
test1();
|
|
test2();
|
|
}
|
|
|
|
class MockFile extends Mock implements File {}
|
|
class MockPlatform extends Mock implements Platform {}
|
|
class MockXcode extends Mock implements Xcode {}
|
|
|
|
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {
|
|
@override
|
|
Future<XcodeProjectInfo> getInfo(String projectPath, {String projectFilename}) async {
|
|
return XcodeProjectInfo(null, null, <String>['Runner']);
|
|
}
|
|
}
|