blob: 375a39053860a579b15c45efe85747f81a151abd [file] [log] [blame]
Ian Hickson449f4a62019-11-27 15:04:02 -08001// Copyright 2014 The Flutter Authors. All rights reserved.
Dan Rubel194a9ef2016-08-25 22:37:48 -04002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'dart:async';
Dan Rubel194a9ef2016-08-25 22:37:48 -04006
7import 'package:args/command_runner.dart';
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +02008import 'package:flutter_tools/src/base/file_system.dart' hide IOSink;
Ian Hickson292abf72017-05-12 15:40:35 -07009import 'package:flutter_tools/src/base/io.dart';
jcollins-gca677012018-02-21 09:54:07 -080010import 'package:flutter_tools/src/base/utils.dart';
Todd Volkert83d411f2017-03-10 09:39:01 -080011import 'package:flutter_tools/src/cache.dart';
Dan Rubel194a9ef2016-08-25 22:37:48 -040012import 'package:flutter_tools/src/commands/packages.dart';
Jonah Williamsfde26752019-10-08 14:53:28 -070013import 'package:flutter_tools/src/dart/pub.dart';
xsterba26f922019-11-05 12:38:42 -080014import 'package:flutter_tools/src/features.dart';
Zachary Andersonef146f62019-07-29 07:24:02 -070015import 'package:flutter_tools/src/reporting/reporting.dart';
Ian Hickson292abf72017-05-12 15:40:35 -070016import 'package:process/process.dart';
Dan Rubel194a9ef2016-08-25 22:37:48 -040017
Ian Hicksond919e692019-07-13 11:51:44 -070018import '../../src/common.dart';
19import '../../src/context.dart';
20import '../../src/mocks.dart' show MockProcessManager, MockStdio, PromptingProcess;
xsterba26f922019-11-05 12:38:42 -080021import '../../src/testbed.dart';
Dan Rubel194a9ef2016-08-25 22:37:48 -040022
jcollins-gca677012018-02-21 09:54:07 -080023class AlwaysTrueBotDetector implements BotDetector {
24 const AlwaysTrueBotDetector();
25
26 @override
27 bool get isRunningOnBot => true;
28}
29
30
31class AlwaysFalseBotDetector implements BotDetector {
32 const AlwaysFalseBotDetector();
33
34 @override
35 bool get isRunningOnBot => false;
36}
37
38
Dan Rubel194a9ef2016-08-25 22:37:48 -040039void main() {
Ian Hickson292abf72017-05-12 15:40:35 -070040 Cache.disableLocking();
41 group('packages get/upgrade', () {
Ian Hickson3dec6a62018-08-17 13:17:23 -070042 Directory tempDir;
Dan Rubel194a9ef2016-08-25 22:37:48 -040043
44 setUp(() {
Ian Hickson3dec6a62018-08-17 13:17:23 -070045 tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
Dan Rubel194a9ef2016-08-25 22:37:48 -040046 });
47
48 tearDown(() {
Ian Hickson3dec6a62018-08-17 13:17:23 -070049 tryToDelete(tempDir);
Dan Rubel194a9ef2016-08-25 22:37:48 -040050 });
51
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +010052 Future<String> createProjectWithPlugin(String plugin, { List<String> arguments }) async {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -070053 final String projectPath = await createProject(tempDir, arguments: arguments);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +010054 final File pubspec = fs.file(fs.path.join(projectPath, 'pubspec.yaml'));
55 String content = await pubspec.readAsString();
56 content = content.replaceFirst(
57 '\ndependencies:\n',
58 '\ndependencies:\n $plugin:\n',
59 );
60 await pubspec.writeAsString(content, flush: true);
61 return projectPath;
62 }
Dan Rubel194a9ef2016-08-25 22:37:48 -040063
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -070064 Future<PackagesCommand> runCommandIn(String projectPath, String verb, { List<String> args }) async {
Alexandre Ardhuind927c932018-09-12 08:29:29 +020065 final PackagesCommand command = PackagesCommand();
Alexandre Ardhuin2d3ff102018-10-05 07:54:56 +020066 final CommandRunner<void> runner = createTestCommandRunner(command);
Alexandre Ardhuin758009b2019-07-02 21:11:56 +020067 await runner.run(<String>[
68 'packages',
69 verb,
70 ...?args,
71 projectPath,
72 ]);
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -070073 return command;
Dan Rubel194a9ef2016-08-25 22:37:48 -040074 }
75
Michael Goderbauerca4d7212017-05-08 14:08:59 -070076 void expectExists(String projectPath, String relPath) {
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +010077 expect(
78 fs.isFileSync(fs.path.join(projectPath, relPath)),
79 true,
80 reason: '$projectPath/$relPath should exist, but does not',
81 );
Dan Rubel194a9ef2016-08-25 22:37:48 -040082 }
83
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +010084 void expectContains(String projectPath, String relPath, String substring) {
85 expectExists(projectPath, relPath);
86 expect(
87 fs.file(fs.path.join(projectPath, relPath)).readAsStringSync(),
88 contains(substring),
Alexandre Ardhuin387f8852019-03-01 08:17:55 +010089 reason: '$projectPath/$relPath has unexpected content',
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +010090 );
91 }
92
93 void expectNotExists(String projectPath, String relPath) {
94 expect(
95 fs.isFileSync(fs.path.join(projectPath, relPath)),
96 false,
97 reason: '$projectPath/$relPath should not exist, but does',
98 );
99 }
100
101 void expectNotContains(String projectPath, String relPath, String substring) {
102 expectExists(projectPath, relPath);
103 expect(
104 fs.file(fs.path.join(projectPath, relPath)).readAsStringSync(),
105 isNot(contains(substring)),
106 reason: '$projectPath/$relPath has unexpected content',
107 );
108 }
109
Alexandre Ardhuineda03e22018-08-02 12:02:32 +0200110 const List<String> pubOutput = <String>[
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100111 '.packages',
112 'pubspec.lock',
113 ];
114
Alexandre Ardhuineda03e22018-08-02 12:02:32 +0200115 const List<String> pluginRegistrants = <String>[
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100116 'ios/Runner/GeneratedPluginRegistrant.h',
117 'ios/Runner/GeneratedPluginRegistrant.m',
118 'android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java',
119 ];
120
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700121 const List<String> modulePluginRegistrants = <String>[
Greg Spencer9f238662018-10-04 13:03:20 -0700122 '.ios/Flutter/FlutterPluginRegistrant/Classes/GeneratedPluginRegistrant.h',
123 '.ios/Flutter/FlutterPluginRegistrant/Classes/GeneratedPluginRegistrant.m',
124 '.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java',
125 ];
126
Alexandre Ardhuineda03e22018-08-02 12:02:32 +0200127 const List<String> pluginWitnesses = <String>[
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100128 '.flutter-plugins',
129 'ios/Podfile',
130 ];
131
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700132 const List<String> modulePluginWitnesses = <String>[
Greg Spencer9f238662018-10-04 13:03:20 -0700133 '.flutter-plugins',
134 '.ios/Podfile',
135 ];
136
Alexandre Ardhuineda03e22018-08-02 12:02:32 +0200137 const Map<String, String> pluginContentWitnesses = <String, String>{
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100138 'ios/Flutter/Debug.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"',
139 'ios/Flutter/Release.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"',
140 };
141
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700142 const Map<String, String> modulePluginContentWitnesses = <String, String>{
Greg Spencer9f238662018-10-04 13:03:20 -0700143 '.ios/Config/Debug.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"',
144 '.ios/Config/Release.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"',
145 };
146
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100147 void expectDependenciesResolved(String projectPath) {
148 for (String output in pubOutput) {
149 expectExists(projectPath, output);
150 }
151 }
152
153 void expectZeroPluginsInjected(String projectPath) {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700154 for (final String registrant in modulePluginRegistrants) {
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100155 expectExists(projectPath, registrant);
156 }
157 for (final String witness in pluginWitnesses) {
158 expectNotExists(projectPath, witness);
159 }
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700160 modulePluginContentWitnesses.forEach((String witness, String content) {
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100161 expectNotContains(projectPath, witness, content);
162 });
163 }
164
165 void expectPluginInjected(String projectPath) {
166 for (final String registrant in pluginRegistrants) {
167 expectExists(projectPath, registrant);
168 }
169 for (final String witness in pluginWitnesses) {
170 expectExists(projectPath, witness);
171 }
172 pluginContentWitnesses.forEach((String witness, String content) {
173 expectContains(projectPath, witness, content);
174 });
175 }
176
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700177 void expectModulePluginInjected(String projectPath) {
178 for (final String registrant in modulePluginRegistrants) {
Greg Spencer9f238662018-10-04 13:03:20 -0700179 expectExists(projectPath, registrant);
180 }
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700181 for (final String witness in modulePluginWitnesses) {
Greg Spencer9f238662018-10-04 13:03:20 -0700182 expectExists(projectPath, witness);
183 }
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700184 modulePluginContentWitnesses.forEach((String witness, String content) {
Greg Spencer9f238662018-10-04 13:03:20 -0700185 expectContains(projectPath, witness, content);
186 });
187 }
188
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100189 void removeGeneratedFiles(String projectPath) {
190 final Iterable<String> allFiles = <List<String>>[
191 pubOutput,
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700192 modulePluginRegistrants,
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100193 pluginWitnesses,
Alexandre Ardhuinf62afdc2018-10-01 21:29:08 +0200194 ].expand<String>((List<String> list) => list);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100195 for (String path in allFiles) {
196 final File file = fs.file(fs.path.join(projectPath, path));
Zachary Andersone2340c62019-09-13 14:51:35 -0700197 if (file.existsSync()) {
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100198 file.deleteSync();
Zachary Andersone2340c62019-09-13 14:51:35 -0700199 }
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100200 }
201 }
202
203 testUsingContext('get fetches packages', () async {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700204 final String projectPath = await createProject(tempDir,
205 arguments: <String>['--no-pub', '--template=module']);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100206 removeGeneratedFiles(projectPath);
207
208 await runCommandIn(projectPath, 'get');
209
210 expectDependenciesResolved(projectPath);
211 expectZeroPluginsInjected(projectPath);
Ian Hickson124dc662019-10-18 16:35:39 -0700212 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700213 Pub: () => const Pub(),
214 });
Dan Rubel194a9ef2016-08-25 22:37:48 -0400215
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100216 testUsingContext('get --offline fetches packages', () async {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700217 final String projectPath = await createProject(tempDir,
218 arguments: <String>['--no-pub', '--template=module']);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100219 removeGeneratedFiles(projectPath);
220
221 await runCommandIn(projectPath, 'get', args: <String>['--offline']);
222
223 expectDependenciesResolved(projectPath);
224 expectZeroPluginsInjected(projectPath);
Ian Hickson124dc662019-10-18 16:35:39 -0700225 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700226 Pub: () => const Pub(),
227 });
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100228
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -0700229 testUsingContext('set the number of plugins as usage value', () async {
230 final String projectPath = await createProject(tempDir,
231 arguments: <String>['--no-pub', '--template=module']);
232 removeGeneratedFiles(projectPath);
233
234 final PackagesCommand command = await runCommandIn(projectPath, 'get');
235 final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
236
Zachary Andersonef146f62019-07-29 07:24:02 -0700237 expect(await getCommand.usageValues,
238 containsPair(CustomDimensions.commandPackagesNumberPlugins, '0'));
Ian Hickson124dc662019-10-18 16:35:39 -0700239 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700240 Pub: () => const Pub(),
241 });
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -0700242
243 testUsingContext('indicate that the project is not a module in usage value', () async {
244 final String projectPath = await createProject(tempDir,
245 arguments: <String>['--no-pub']);
246 removeGeneratedFiles(projectPath);
247
248 final PackagesCommand command = await runCommandIn(projectPath, 'get');
249 final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
250
Zachary Andersonef146f62019-07-29 07:24:02 -0700251 expect(await getCommand.usageValues,
252 containsPair(CustomDimensions.commandPackagesProjectModule, 'false'));
Ian Hickson124dc662019-10-18 16:35:39 -0700253 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700254 Pub: () => const Pub(),
255 });
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -0700256
257 testUsingContext('indicate that the project is a module in usage value', () async {
258 final String projectPath = await createProject(tempDir,
259 arguments: <String>['--no-pub', '--template=module']);
260 removeGeneratedFiles(projectPath);
261
262 final PackagesCommand command = await runCommandIn(projectPath, 'get');
263 final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
264
Zachary Andersonef146f62019-07-29 07:24:02 -0700265 expect(await getCommand.usageValues,
266 containsPair(CustomDimensions.commandPackagesProjectModule, 'true'));
Ian Hickson124dc662019-10-18 16:35:39 -0700267 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700268 Pub: () => const Pub(),
269 });
Emmanuel Garcia3bbdf012019-05-29 20:56:28 -0700270
xsterba26f922019-11-05 12:38:42 -0800271 testUsingContext('indicate that Android project reports v1 in usage value', () async {
272 final String projectPath = await createProject(tempDir,
273 arguments: <String>['--no-pub']);
274 removeGeneratedFiles(projectPath);
275
276 final PackagesCommand command = await runCommandIn(projectPath, 'get');
277 final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
278
279 expect(await getCommand.usageValues,
280 containsPair(CustomDimensions.commandPackagesAndroidEmbeddingVersion, 'v1'));
281 }, overrides: <Type, Generator>{
282 FeatureFlags: () => TestFeatureFlags(isAndroidEmbeddingV2Enabled: false),
283 Pub: () => const Pub(),
284 });
285
286 testUsingContext('indicate that Android project reports v2 in usage value', () async {
287 final String projectPath = await createProject(tempDir,
288 arguments: <String>['--no-pub']);
289 removeGeneratedFiles(projectPath);
290
291 final PackagesCommand command = await runCommandIn(projectPath, 'get');
292 final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
293
294 expect(await getCommand.usageValues,
295 containsPair(CustomDimensions.commandPackagesAndroidEmbeddingVersion, 'v2'));
296 }, overrides: <Type, Generator>{
297 FeatureFlags: () => TestFeatureFlags(isAndroidEmbeddingV2Enabled: true),
298 Pub: () => const Pub(),
299 });
300
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100301 testUsingContext('upgrade fetches packages', () async {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700302 final String projectPath = await createProject(tempDir,
303 arguments: <String>['--no-pub', '--template=module']);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100304 removeGeneratedFiles(projectPath);
305
306 await runCommandIn(projectPath, 'upgrade');
307
308 expectDependenciesResolved(projectPath);
309 expectZeroPluginsInjected(projectPath);
Ian Hickson124dc662019-10-18 16:35:39 -0700310 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700311 Pub: () => const Pub(),
312 });
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100313
314 testUsingContext('get fetches packages and injects plugin', () async {
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700315 final String projectPath = await createProjectWithPlugin('path_provider',
316 arguments: <String>['--no-pub', '--template=module']);
Mikkel Nygaard Ravn20004352018-02-16 10:17:28 +0100317 removeGeneratedFiles(projectPath);
318
319 await runCommandIn(projectPath, 'get');
320
321 expectDependenciesResolved(projectPath);
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700322 expectModulePluginInjected(projectPath);
Ian Hickson124dc662019-10-18 16:35:39 -0700323 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700324 Pub: () => const Pub(),
325 });
Greg Spencer9f238662018-10-04 13:03:20 -0700326
Mikkel Nygaard Ravnf5268052018-02-17 21:25:13 +0100327 testUsingContext('get fetches packages and injects plugin in plugin project', () async {
328 final String projectPath = await createProject(
Ian Hickson3dec6a62018-08-17 13:17:23 -0700329 tempDir,
Greg Spencer9f238662018-10-04 13:03:20 -0700330 arguments: <String>['--template=plugin', '--no-pub'],
Mikkel Nygaard Ravnf5268052018-02-17 21:25:13 +0100331 );
332 final String exampleProjectPath = fs.path.join(projectPath, 'example');
333 removeGeneratedFiles(projectPath);
334 removeGeneratedFiles(exampleProjectPath);
335
336 await runCommandIn(projectPath, 'get');
337
338 expectDependenciesResolved(projectPath);
339
340 await runCommandIn(exampleProjectPath, 'get');
341
342 expectDependenciesResolved(exampleProjectPath);
343 expectPluginInjected(exampleProjectPath);
Ian Hickson124dc662019-10-18 16:35:39 -0700344 }, overrides: <Type, Generator>{
Jonah Williamsfde26752019-10-08 14:53:28 -0700345 Pub: () => const Pub(),
346 });
Dan Rubel194a9ef2016-08-25 22:37:48 -0400347 });
Ian Hickson292abf72017-05-12 15:40:35 -0700348
349 group('packages test/pub', () {
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200350 MockProcessManager mockProcessManager;
351 MockStdio mockStdio;
352
353 setUp(() {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200354 mockProcessManager = MockProcessManager();
355 mockStdio = MockStdio();
Ian Hickson292abf72017-05-12 15:40:35 -0700356 });
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200357
jcollins-gca677012018-02-21 09:54:07 -0800358 testUsingContext('test without bot', () async {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200359 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'test']);
jcollins-gca677012018-02-21 09:54:07 -0800360 final List<String> commands = mockProcessManager.commands;
361 expect(commands, hasLength(3));
362 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
363 expect(commands[1], 'run');
364 expect(commands[2], 'test');
365 }, overrides: <Type, Generator>{
366 ProcessManager: () => mockProcessManager,
367 Stdio: () => mockStdio,
368 BotDetector: () => const AlwaysFalseBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700369 Pub: () => const Pub(),
jcollins-gca677012018-02-21 09:54:07 -0800370 });
371
372 testUsingContext('test with bot', () async {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200373 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'test']);
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200374 final List<String> commands = mockProcessManager.commands;
Ian Hickson89566fe2017-09-29 17:56:25 -0700375 expect(commands, hasLength(4));
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200376 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Ian Hickson89566fe2017-09-29 17:56:25 -0700377 expect(commands[1], '--trace');
378 expect(commands[2], 'run');
379 expect(commands[3], 'test');
Ian Hickson292abf72017-05-12 15:40:35 -0700380 }, overrides: <Type, Generator>{
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200381 ProcessManager: () => mockProcessManager,
382 Stdio: () => mockStdio,
jcollins-gca677012018-02-21 09:54:07 -0800383 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700384 Pub: () => const Pub(),
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200385 });
386
387 testUsingContext('run', () async {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200388 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', '--verbose', 'pub', 'run', '--foo', 'bar']);
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200389 final List<String> commands = mockProcessManager.commands;
390 expect(commands, hasLength(4));
391 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
392 expect(commands[1], 'run');
393 expect(commands[2], '--foo');
394 expect(commands[3], 'bar');
395 }, overrides: <Type, Generator>{
396 ProcessManager: () => mockProcessManager,
397 Stdio: () => mockStdio,
Jonah Williamsfde26752019-10-08 14:53:28 -0700398 Pub: () => const Pub(),
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200399 });
400
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200401 testUsingContext('pub publish', () async {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200402 final PromptingProcess process = PromptingProcess();
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200403 mockProcessManager.processFactory = (List<String> commands) => process;
Michael Thomsen79d89672019-08-19 08:02:13 +0100404 final Future<void> runPackages = createTestCommandRunner(PackagesCommand()).run(<String>['pub', 'publish']);
Alexandre Ardhuin2d3ff102018-10-05 07:54:56 +0200405 final Future<void> runPrompt = process.showPrompt('Proceed (y/n)? ', <String>['hello', 'world']);
406 final Future<void> simulateUserInput = Future<void>(() {
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200407 mockStdio.simulateStdin('y');
408 });
Alexandre Ardhuin2d3ff102018-10-05 07:54:56 +0200409 await Future.wait<void>(<Future<void>>[runPackages, runPrompt, simulateUserInput]);
Mikkel Nygaard Ravn8303fff2017-09-06 11:53:39 +0200410 final List<String> commands = mockProcessManager.commands;
411 expect(commands, hasLength(2));
412 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
413 expect(commands[1], 'publish');
414 final List<String> stdout = mockStdio.writtenToStdout;
415 expect(stdout, hasLength(4));
416 expect(stdout.sublist(0, 2), contains('Proceed (y/n)? '));
417 expect(stdout.sublist(0, 2), contains('y\n'));
418 expect(stdout[2], 'hello\n');
419 expect(stdout[3], 'world\n');
420 }, overrides: <Type, Generator>{
421 ProcessManager: () => mockProcessManager,
422 Stdio: () => mockStdio,
Jonah Williamsfde26752019-10-08 14:53:28 -0700423 Pub: () => const Pub(),
Ian Hickson292abf72017-05-12 15:40:35 -0700424 });
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200425
426 testUsingContext('publish', () async {
Michael Thomsen79d89672019-08-19 08:02:13 +0100427 await createTestCommandRunner(PackagesCommand()).run(<String>['pub', 'publish']);
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200428 final List<String> commands = mockProcessManager.commands;
Michael Thomsen79d89672019-08-19 08:02:13 +0100429 expect(commands, hasLength(2));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200430 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen79d89672019-08-19 08:02:13 +0100431 expect(commands[1], 'publish');
432 }, overrides: <Type, Generator>{
433 ProcessManager: () => mockProcessManager,
434 Stdio: () => mockStdio,
435 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700436 Pub: () => const Pub(),
Michael Thomsen79d89672019-08-19 08:02:13 +0100437 });
438
439 testUsingContext('packages publish', () async {
440 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'pub', 'publish']);
441 final List<String> commands = mockProcessManager.commands;
442 expect(commands, hasLength(2));
443 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
444 expect(commands[1], 'publish');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200445 }, overrides: <Type, Generator>{
446 ProcessManager: () => mockProcessManager,
447 Stdio: () => mockStdio,
448 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700449 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200450 });
451
452 testUsingContext('deps', () async {
453 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'deps']);
454 final List<String> commands = mockProcessManager.commands;
Michael Thomsen01a5d112019-08-23 11:16:30 +0200455 expect(commands, hasLength(2));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200456 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen01a5d112019-08-23 11:16:30 +0200457 expect(commands[1], 'deps');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200458 }, overrides: <Type, Generator>{
459 ProcessManager: () => mockProcessManager,
460 Stdio: () => mockStdio,
461 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700462 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200463 });
464
465 testUsingContext('cache', () async {
466 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'cache']);
467 final List<String> commands = mockProcessManager.commands;
Michael Thomsen01a5d112019-08-23 11:16:30 +0200468 expect(commands, hasLength(2));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200469 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen01a5d112019-08-23 11:16:30 +0200470 expect(commands[1], 'cache');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200471 }, overrides: <Type, Generator>{
472 ProcessManager: () => mockProcessManager,
473 Stdio: () => mockStdio,
474 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700475 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200476 });
477
478 testUsingContext('version', () async {
479 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'version']);
480 final List<String> commands = mockProcessManager.commands;
Michael Thomsen01a5d112019-08-23 11:16:30 +0200481 expect(commands, hasLength(2));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200482 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen01a5d112019-08-23 11:16:30 +0200483 expect(commands[1], 'version');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200484 }, overrides: <Type, Generator>{
485 ProcessManager: () => mockProcessManager,
486 Stdio: () => mockStdio,
487 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700488 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200489 });
490
491 testUsingContext('uploader', () async {
492 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'uploader']);
493 final List<String> commands = mockProcessManager.commands;
Michael Thomsen01a5d112019-08-23 11:16:30 +0200494 expect(commands, hasLength(2));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200495 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen01a5d112019-08-23 11:16:30 +0200496 expect(commands[1], 'uploader');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200497 }, overrides: <Type, Generator>{
498 ProcessManager: () => mockProcessManager,
499 Stdio: () => mockStdio,
500 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700501 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200502 });
503
504 testUsingContext('global', () async {
505 await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'global', 'list']);
506 final List<String> commands = mockProcessManager.commands;
Michael Thomsen01a5d112019-08-23 11:16:30 +0200507 expect(commands, hasLength(3));
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200508 expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
Michael Thomsen01a5d112019-08-23 11:16:30 +0200509 expect(commands[1], 'global');
510 expect(commands[2], 'list');
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200511 }, overrides: <Type, Generator>{
512 ProcessManager: () => mockProcessManager,
513 Stdio: () => mockStdio,
514 BotDetector: () => const AlwaysTrueBotDetector(),
Jonah Williamsfde26752019-10-08 14:53:28 -0700515 Pub: () => const Pub(),
Michael Thomsen811f1ad2019-04-09 17:03:09 +0200516 });
Ian Hickson292abf72017-05-12 15:40:35 -0700517 });
518}