mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
199 lines
7.2 KiB
Dart
199 lines
7.2 KiB
Dart
// Copyright 2017 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 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:mockito/mockito.dart';
|
|
import 'package:test/test.dart';
|
|
import 'package:path/path.dart' as path;
|
|
|
|
import '../prepare_package.dart';
|
|
|
|
void main() {
|
|
group('ArchiveCreator', () {
|
|
ArchiveCreator preparer;
|
|
Directory tmpDir;
|
|
Directory flutterDir;
|
|
File outputFile;
|
|
MockProcessRunner runner;
|
|
List<MockProcessResult> results;
|
|
final List<List<String>> args = <List<String>>[];
|
|
final List<Map<Symbol, dynamic>> namedArgs = <Map<Symbol, dynamic>>[];
|
|
final String zipExe = Platform.isWindows ? '7za.exe' : 'zip';
|
|
final String tarExe = Platform.isWindows ? 'tar.exe' : 'tar';
|
|
final String gitExe = Platform.isWindows ? 'git.bat' : 'git';
|
|
String flutterExe;
|
|
|
|
void _verifyCommand(List<dynamic> args, String expected) {
|
|
final List<String> expectedList = expected.split(' ');
|
|
final String executable = expectedList.removeAt(0);
|
|
expect(args[0], executable);
|
|
expect(args[1], orderedEquals(expectedList));
|
|
}
|
|
|
|
ProcessResult _nextResult(Invocation invocation) {
|
|
args.add(invocation.positionalArguments);
|
|
namedArgs.add(invocation.namedArguments);
|
|
return results.isEmpty ? new MockProcessResult('', '', 0) : results.removeAt(0);
|
|
}
|
|
|
|
void _answerWithResults() {
|
|
when(
|
|
runner.call(
|
|
typed(captureAny),
|
|
typed(captureAny),
|
|
environment: typed(captureAny, named: 'environment'),
|
|
workingDirectory: typed(captureAny, named: 'workingDirectory'),
|
|
includeParentEnvironment: typed(captureAny, named: 'includeParentEnvironment'),
|
|
),
|
|
).thenAnswer(_nextResult);
|
|
}
|
|
|
|
setUp(() async {
|
|
runner = new MockProcessRunner();
|
|
args.clear();
|
|
namedArgs.clear();
|
|
tmpDir = await Directory.systemTemp.createTemp('flutter_');
|
|
flutterDir = new Directory(path.join(tmpDir.path, 'flutter'));
|
|
flutterExe =
|
|
path.join(flutterDir.path, 'bin', Platform.isWindows ? 'flutter.bat' : 'flutter');
|
|
});
|
|
|
|
tearDown(() async {
|
|
await tmpDir.delete(recursive: true);
|
|
});
|
|
|
|
test('sets PUB_CACHE properly', () async {
|
|
outputFile = new File(path.join(tmpDir.absolute.path, 'flutter_master.tar.xz'));
|
|
preparer = new ArchiveCreator(tmpDir, outputFile, runner: runner);
|
|
_answerWithResults();
|
|
results = <MockProcessResult>[new MockProcessResult('deadbeef\n', '', 0)];
|
|
preparer.checkoutFlutter('master');
|
|
preparer.prepareArchive();
|
|
preparer.createArchive();
|
|
expect(
|
|
verify(runner.call(
|
|
captureAny,
|
|
captureAny,
|
|
workingDirectory: captureAny,
|
|
environment: captureAny,
|
|
includeParentEnvironment: typed(captureAny, named: 'includeParentEnvironment'),
|
|
)).captured[2]['PUB_CACHE'],
|
|
endsWith(path.join('flutter', '.pub-cache')),
|
|
);
|
|
});
|
|
|
|
test('calls the right commands for tar output', () async {
|
|
outputFile = new File(path.join(tmpDir.absolute.path, 'flutter_master.tar.xz'));
|
|
preparer = new ArchiveCreator(tmpDir, outputFile, runner: runner);
|
|
_answerWithResults();
|
|
results = <MockProcessResult>[new MockProcessResult('deadbeef\n', '', 0)];
|
|
preparer.checkoutFlutter('master');
|
|
preparer.prepareArchive();
|
|
preparer.createArchive();
|
|
final List<String> commands = <String>[
|
|
'$gitExe clone -b master https://chromium.googlesource.com/external/github.com/flutter/flutter',
|
|
'$gitExe reset --hard master',
|
|
'$gitExe remote remove origin',
|
|
'$gitExe remote add origin https://github.com/flutter/flutter.git',
|
|
'$flutterExe doctor',
|
|
'$flutterExe update-packages',
|
|
'$flutterExe precache',
|
|
'$flutterExe ide-config',
|
|
'$flutterExe create --template=app ${path.join(tmpDir.path, 'create_app')}',
|
|
'$flutterExe create --template=package ${path.join(tmpDir.path, 'create_package')}',
|
|
'$flutterExe create --template=plugin ${path.join(tmpDir.path, 'create_plugin')}',
|
|
'$gitExe clean -f -X **/.packages',
|
|
'$tarExe cJf ${path.join(tmpDir.path, 'flutter_master.tar.xz')} flutter',
|
|
];
|
|
int step = 0;
|
|
for (String command in commands) {
|
|
_verifyCommand(args[step++], command);
|
|
}
|
|
});
|
|
|
|
test('calls the right commands for zip output', () async {
|
|
outputFile = new File(path.join(tmpDir.absolute.path, 'flutter_master.zip'));
|
|
preparer = new ArchiveCreator(tmpDir, outputFile, runner: runner);
|
|
_answerWithResults();
|
|
results = <MockProcessResult>[new MockProcessResult('deadbeef\n', '', 0)];
|
|
preparer.checkoutFlutter('master');
|
|
preparer.prepareArchive();
|
|
preparer.createArchive();
|
|
final List<String> commands = <String>[
|
|
'$gitExe clone -b master https://chromium.googlesource.com/external/github.com/flutter/flutter',
|
|
'$gitExe reset --hard master',
|
|
'$gitExe remote remove origin',
|
|
'$gitExe remote add origin https://github.com/flutter/flutter.git',
|
|
'$flutterExe doctor',
|
|
'$flutterExe update-packages',
|
|
'$flutterExe precache',
|
|
'$flutterExe ide-config',
|
|
'$flutterExe create --template=app ${path.join(tmpDir.path, 'create_app')}',
|
|
'$flutterExe create --template=package ${path.join(tmpDir.path, 'create_package')}',
|
|
'$flutterExe create --template=plugin ${path.join(tmpDir.path, 'create_plugin')}',
|
|
'$gitExe clean -f -X **/.packages',
|
|
];
|
|
if (Platform.isWindows) {
|
|
commands.add('$zipExe a -tzip -mx=9 ${path.join(tmpDir.path, 'flutter_master.zip')} flutter');
|
|
} else {
|
|
commands.add('$zipExe -r -9 -q ${path.join(tmpDir.path, 'flutter_master.zip')} flutter');
|
|
}
|
|
|
|
int step = 0;
|
|
for (String command in commands) {
|
|
_verifyCommand(args[step++], command);
|
|
}
|
|
});
|
|
|
|
test('throws when a command errors out', () async {
|
|
outputFile = new File(path.join(tmpDir.absolute.path, 'flutter.tar.xz'));
|
|
preparer = new ArchiveCreator(
|
|
tmpDir,
|
|
outputFile,
|
|
runner: runner,
|
|
);
|
|
|
|
results = <MockProcessResult>[
|
|
new MockProcessResult('', '', 0),
|
|
new MockProcessResult('OMG! OMG! an ERROR!\n', '', -1)
|
|
];
|
|
_answerWithResults();
|
|
expect(() => preparer.checkoutFlutter('master'),
|
|
throwsA(const isInstanceOf<ProcessFailedException>()));
|
|
expect(args.length, 2);
|
|
_verifyCommand(args[0],
|
|
'$gitExe clone -b master https://chromium.googlesource.com/external/github.com/flutter/flutter');
|
|
_verifyCommand(args[1], '$gitExe reset --hard master');
|
|
});
|
|
});
|
|
}
|
|
|
|
class MockProcessRunner extends Mock implements Function {
|
|
ProcessResult call(
|
|
String executable,
|
|
List<String> arguments, {
|
|
String workingDirectory,
|
|
Map<String, String> environment,
|
|
bool includeParentEnvironment,
|
|
bool runInShell,
|
|
Encoding stdoutEncoding,
|
|
Encoding stderrEncoding,
|
|
});
|
|
}
|
|
|
|
class MockProcessResult extends Mock implements ProcessResult {
|
|
MockProcessResult(this.stdout, [this.stderr = '', this.exitCode = 0]);
|
|
|
|
@override
|
|
dynamic stdout = '';
|
|
|
|
@override
|
|
dynamic stderr;
|
|
|
|
@override
|
|
int exitCode;
|
|
}
|