flutter/dev/bots/test/prepare_package_test.dart
Greg Spencer 37f216bfab
Add support for 7Zip to the packaging script. (#13659)
A modern version of 7Zip (7za.exe) is now installed on the bots, this makes use of that.
2017-12-18 14:40:29 -08:00

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;
}