Skip to content

Commit aa39433

Browse files
authored
Fix dartDefines in daemon mode (flutter#45317)
* de-null dartDefines in daemon mode * remove daemonCommand; pipe through dartDefines into Daemon * pass dartDefiles in attach; add test for --machine mode
1 parent a60bf8e commit aa39433

File tree

5 files changed

+87
-32
lines changed

5 files changed

+87
-32
lines changed

packages/flutter_tools/lib/src/commands/attach.dart

+7-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,13 @@ class AttachCommand extends FlutterCommand {
198198
final int devicePort = await getDevicePort();
199199

200200
final Daemon daemon = boolArg('machine')
201-
? Daemon(stdinCommandStream, stdoutCommandResponse,
202-
notifyingLogger: NotifyingLogger(), logToStdout: true)
201+
? Daemon(
202+
stdinCommandStream,
203+
stdoutCommandResponse,
204+
notifyingLogger: NotifyingLogger(),
205+
logToStdout: true,
206+
dartDefines: dartDefines,
207+
)
203208
: null;
204209

205210
Stream<Uri> observatoryUri;

packages/flutter_tools/lib/src/commands/daemon.dart

+18-9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ const String protocolVersion = '0.5.3';
3535
/// It can be shutdown with a `daemon.shutdown` command (or by killing the
3636
/// process).
3737
class DaemonCommand extends FlutterCommand {
38-
DaemonCommand({ this.hidden = false });
38+
DaemonCommand({ this.hidden = false }) {
39+
usesDartDefines();
40+
}
3941

4042
@override
4143
final String name = 'daemon';
@@ -58,8 +60,10 @@ class DaemonCommand extends FlutterCommand {
5860
await context.run<void>(
5961
body: () async {
6062
final Daemon daemon = Daemon(
61-
stdinCommandStream, stdoutCommandResponse,
62-
daemonCommand: this, notifyingLogger: notifyingLogger);
63+
stdinCommandStream, stdoutCommandResponse,
64+
notifyingLogger: notifyingLogger,
65+
dartDefines: dartDefines,
66+
);
6367

6468
final int code = await daemon.onExit;
6569
if (code != 0) {
@@ -82,10 +86,17 @@ class Daemon {
8286
Daemon(
8387
Stream<Map<String, dynamic>> commandStream,
8488
this.sendCommand, {
85-
this.daemonCommand,
8689
this.notifyingLogger,
8790
this.logToStdout = false,
91+
@required this.dartDefines,
8892
}) {
93+
if (dartDefines == null) {
94+
throw Exception(
95+
'dartDefines must not be null. This is a bug in Flutter.\n'
96+
'Please file an issue at https://github.com/flutter/flutter/issues/new/choose',
97+
);
98+
}
99+
89100
// Set up domains.
90101
_registerDomain(daemonDomain = DaemonDomain(this));
91102
_registerDomain(appDomain = AppDomain(this));
@@ -110,9 +121,9 @@ class Daemon {
110121
StreamSubscription<Map<String, dynamic>> _commandSubscription;
111122

112123
final DispatchCommand sendCommand;
113-
final DaemonCommand daemonCommand;
114124
final NotifyingLogger notifyingLogger;
115125
final bool logToStdout;
126+
final List<String> dartDefines;
116127

117128
final Completer<int> _onExitCompleter = Completer<int>();
118129
final Map<String, Domain> _domainMap = <String, Domain>{};
@@ -184,8 +195,6 @@ abstract class Domain {
184195
_handlers[name] = handler;
185196
}
186197

187-
FlutterCommand get command => daemon.daemonCommand;
188-
189198
@override
190199
String toString() => name;
191200

@@ -424,7 +433,7 @@ class AppDomain extends Domain {
424433
viewFilter: isolateFilter,
425434
target: target,
426435
buildMode: options.buildInfo.mode,
427-
dartDefines: command?.dartDefines,
436+
dartDefines: daemon.dartDefines,
428437
);
429438

430439
ResidentRunner runner;
@@ -437,7 +446,7 @@ class AppDomain extends Domain {
437446
debuggingOptions: options,
438447
ipv6: ipv6,
439448
stayResident: true,
440-
dartDefines: command?.dartDefines,
449+
dartDefines: daemon.dartDefines,
441450
);
442451
} else if (enableHotReload) {
443452
runner = HotRunner(

packages/flutter_tools/lib/src/commands/run.dart

+7-2
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,13 @@ class RunCommand extends RunCommandBase {
340340
if (devices.length > 1) {
341341
throwToolExit('--machine does not support -d all.');
342342
}
343-
final Daemon daemon = Daemon(stdinCommandStream, stdoutCommandResponse,
344-
notifyingLogger: NotifyingLogger(), logToStdout: true);
343+
final Daemon daemon = Daemon(
344+
stdinCommandStream,
345+
stdoutCommandResponse,
346+
notifyingLogger: NotifyingLogger(),
347+
logToStdout: true,
348+
dartDefines: dartDefines,
349+
);
345350
AppInstance app;
346351
try {
347352
final String applicationBinaryPath = stringArg('use-application-binary');

packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart

+15-19
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void main() {
3939
commands.stream,
4040
responses.add,
4141
notifyingLogger: notifyingLogger,
42+
dartDefines: const <String>[],
4243
);
4344
commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.version'});
4445
final Map<String, dynamic> response = await responses.stream.firstWhere(_notEvent);
@@ -56,6 +57,7 @@ void main() {
5657
commands.stream,
5758
responses.add,
5859
notifyingLogger: notifyingLogger,
60+
dartDefines: const <String>[],
5961
);
6062
printError('daemon.logMessage test');
6163
final Map<String, dynamic> response = await responses.stream.firstWhere((Map<String, dynamic> map) {
@@ -83,6 +85,7 @@ void main() {
8385
responses.add,
8486
notifyingLogger: notifyingLogger,
8587
logToStdout: true,
88+
dartDefines: const <String>[],
8689
);
8790
printStatus('daemon.logMessage test');
8891
// Service the event loop.
@@ -103,6 +106,7 @@ void main() {
103106
commands.stream,
104107
responses.add,
105108
notifyingLogger: notifyingLogger,
109+
dartDefines: const <String>[],
106110
);
107111
commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.shutdown'});
108112
return daemon.onExit.then<void>((int code) async {
@@ -112,16 +116,13 @@ void main() {
112116
});
113117

114118
testUsingContext('app.restart without an appId should report an error', () async {
115-
final DaemonCommand command = DaemonCommand();
116-
applyMocksToCommand(command);
117-
118119
final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
119120
final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
120121
daemon = Daemon(
121122
commands.stream,
122123
responses.add,
123-
daemonCommand: command,
124124
notifyingLogger: notifyingLogger,
125+
dartDefines: const <String>[],
125126
);
126127

127128
commands.add(<String, dynamic>{'id': 0, 'method': 'app.restart'});
@@ -133,16 +134,13 @@ void main() {
133134
});
134135

135136
testUsingContext('ext.flutter.debugPaint via service extension without an appId should report an error', () async {
136-
final DaemonCommand command = DaemonCommand();
137-
applyMocksToCommand(command);
138-
139137
final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
140138
final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
141139
daemon = Daemon(
142140
commands.stream,
143141
responses.add,
144-
daemonCommand: command,
145142
notifyingLogger: notifyingLogger,
143+
dartDefines: const <String>[],
146144
);
147145

148146
commands.add(<String, dynamic>{
@@ -160,16 +158,13 @@ void main() {
160158
});
161159

162160
testUsingContext('app.stop without appId should report an error', () async {
163-
final DaemonCommand command = DaemonCommand();
164-
applyMocksToCommand(command);
165-
166161
final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
167162
final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
168163
daemon = Daemon(
169164
commands.stream,
170165
responses.add,
171-
daemonCommand: command,
172166
notifyingLogger: notifyingLogger,
167+
dartDefines: const <String>[],
173168
);
174169

175170
commands.add(<String, dynamic>{'id': 0, 'method': 'app.stop'});
@@ -187,6 +182,7 @@ void main() {
187182
commands.stream,
188183
responses.add,
189184
notifyingLogger: notifyingLogger,
185+
dartDefines: const <String>[],
190186
);
191187
commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'});
192188
final Map<String, dynamic> response = await responses.stream.firstWhere(_notEvent);
@@ -203,6 +199,7 @@ void main() {
203199
commands.stream,
204200
responses.add,
205201
notifyingLogger: notifyingLogger,
202+
dartDefines: const <String>[],
206203
);
207204
final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery();
208205
daemon.deviceDomain.addDeviceDiscoverer(discoverer);
@@ -221,9 +218,10 @@ void main() {
221218
final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
222219
final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
223220
daemon = Daemon(
224-
commands.stream,
225-
responses.add,
226-
notifyingLogger: notifyingLogger,
221+
commands.stream,
222+
responses.add,
223+
notifyingLogger: notifyingLogger,
224+
dartDefines: const <String>[],
227225
);
228226

229227
final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery();
@@ -247,16 +245,13 @@ void main() {
247245
});
248246

249247
testUsingContext('emulator.launch without an emulatorId should report an error', () async {
250-
final DaemonCommand command = DaemonCommand();
251-
applyMocksToCommand(command);
252-
253248
final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
254249
final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
255250
daemon = Daemon(
256251
commands.stream,
257252
responses.add,
258-
daemonCommand: command,
259253
notifyingLogger: notifyingLogger,
254+
dartDefines: const <String>[],
260255
);
261256

262257
commands.add(<String, dynamic>{'id': 0, 'method': 'emulator.launch'});
@@ -274,6 +269,7 @@ void main() {
274269
commands.stream,
275270
responses.add,
276271
notifyingLogger: notifyingLogger,
272+
dartDefines: const <String>[],
277273
);
278274
commands.add(<String, dynamic>{'id': 0, 'method': 'emulator.getEmulators'});
279275
final Map<String, dynamic> response = await responses.stream.firstWhere(_notEvent);

packages/flutter_tools/test/commands.shard/hermetic/run_test.dart

+40
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,37 @@ void main() {
244244
FlutterVersion: () => mockStableFlutterVersion,
245245
WebRunnerFactory: () => mockWebRunnerFactory,
246246
});
247+
248+
testUsingContext('populates dartDefines in --machine mode', () async {
249+
final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_run_test.');
250+
fs.currentDirectory = tempDir;
251+
252+
final Directory libDir = tempDir.childDirectory('lib');
253+
libDir.createSync();
254+
final File mainFile = libDir.childFile('main.dart');
255+
mainFile.writeAsStringSync('void main() {}');
256+
257+
final Directory webDir = tempDir.childDirectory('web');
258+
webDir.createSync();
259+
final File indexFile = libDir.childFile('index.html');
260+
indexFile.writeAsStringSync('<h1>Hello</h1>');
261+
262+
when(mockDeviceManager.deviceDiscoverers).thenReturn(<DeviceDiscovery>[]);
263+
264+
args.add('--machine');
265+
await createTestCommandRunner(command).run(args);
266+
expect(mockWebRunnerFactory._dartDefines, <String>['FOO=bar']);
267+
}, overrides: <Type, Generator>{
268+
DeviceManager: () => mockDeviceManager,
269+
FeatureFlags: () => TestFeatureFlags(
270+
isWebEnabled: true,
271+
),
272+
FileSystem: () => fs,
273+
ProcessManager: () => mockProcessManager,
274+
DeviceManager: () => mockDeviceManager,
275+
FlutterVersion: () => mockStableFlutterVersion,
276+
WebRunnerFactory: () => mockWebRunnerFactory,
277+
});
247278
});
248279
});
249280
}
@@ -276,6 +307,9 @@ class FakeDevice extends Fake implements Device {
276307
static const int kFailure = -1;
277308
TargetPlatform _targetPlatform = TargetPlatform.ios;
278309

310+
@override
311+
String get id => 'fake_device';
312+
279313
void _throwToolExit(int code) => throwToolExit(null, exitCode: code);
280314

281315
@override
@@ -350,6 +384,9 @@ class MockWebRunnerFactory extends Mock implements WebRunnerFactory {
350384
}
351385

352386
class MockWebRunner extends Mock implements ResidentRunner {
387+
@override
388+
bool get debuggingEnabled => false;
389+
353390
@override
354391
Future<int> run({
355392
Completer<DebugConnectionInfo> connectionInfoCompleter,
@@ -358,4 +395,7 @@ class MockWebRunner extends Mock implements ResidentRunner {
358395
}) async {
359396
return 0;
360397
}
398+
399+
@override
400+
Future<int> waitForAppToFinish() async => 0;
361401
}

0 commit comments

Comments
 (0)