diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 524add23ef0..12b2eb559d7 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -498,6 +498,7 @@ class RunCommand extends RunCommandBase { commandRunAndroidEmbeddingVersion: androidEmbeddingVersion, commandRunEnableImpeller: enableImpeller.asBool, commandRunIOSInterfaceType: iOSInterfaceType, + commandRunIsTest: targetFile.endsWith('_test.dart'), ); } diff --git a/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart b/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart index ed5dd053ce2..658151f952f 100644 --- a/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart +++ b/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart @@ -68,6 +68,7 @@ class CustomDimensions { this.hotEventReloadVMTimeInMs, this.commandRunEnableImpeller, this.commandRunIOSInterfaceType, + this.commandRunIsTest, }); final String? sessionHostOsDetails; // cd1 @@ -127,6 +128,7 @@ class CustomDimensions { final int? hotEventReloadVMTimeInMs; // cd 55 final bool? commandRunEnableImpeller; // cd 56 final String? commandRunIOSInterfaceType; // cd 57 + final bool? commandRunIsTest; // cd 58 /// Convert to a map that will be used to upload to the analytics backend. Map toMap() => { @@ -187,6 +189,7 @@ class CustomDimensions { if (hotEventReloadVMTimeInMs != null) cdKey(CustomDimensionsEnum.hotEventReloadVMTimeInMs): hotEventReloadVMTimeInMs.toString(), if (commandRunEnableImpeller != null) cdKey(CustomDimensionsEnum.commandRunEnableImpeller): commandRunEnableImpeller.toString(), if (commandRunIOSInterfaceType != null) cdKey(CustomDimensionsEnum.commandRunIOSInterfaceType): commandRunIOSInterfaceType.toString(), + if (commandRunIsTest != null) cdKey(CustomDimensionsEnum.commandRunIsTest): commandRunIsTest.toString(), }; /// Merge the values of two [CustomDimensions] into one. If a value is defined @@ -254,6 +257,7 @@ class CustomDimensions { hotEventReloadVMTimeInMs: other.hotEventReloadVMTimeInMs ?? hotEventReloadVMTimeInMs, commandRunEnableImpeller: other.commandRunEnableImpeller ?? commandRunEnableImpeller, commandRunIOSInterfaceType: other.commandRunIOSInterfaceType ?? commandRunIOSInterfaceType, + commandRunIsTest: other.commandRunIsTest ?? commandRunIsTest, ); } @@ -315,6 +319,7 @@ class CustomDimensions { hotEventReloadVMTimeInMs: _extractInt(map, CustomDimensionsEnum.hotEventReloadVMTimeInMs), commandRunEnableImpeller: _extractBool(map, CustomDimensionsEnum.commandRunEnableImpeller), commandRunIOSInterfaceType: _extractString(map, CustomDimensionsEnum.commandRunIOSInterfaceType), + commandRunIsTest: _extractBool(map, CustomDimensionsEnum.commandRunIsTest), ); static bool? _extractBool(Map map, CustomDimensionsEnum field) => @@ -402,6 +407,7 @@ enum CustomDimensionsEnum { hotEventReloadVMTimeInMs, // cd55 commandRunEnableImpeller, // cd56 commandRunIOSInterfaceType, // cd57 + commandRunIsTest, // cd58 } String cdKey(CustomDimensionsEnum cd) => 'cd${cd.index + 1}'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index 631341ad4ad..7cf108eabdf 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -475,6 +475,7 @@ void main() { 'cd3': 'false', 'cd4': 'ios', 'cd22': 'iOS 13', 'cd23': 'debug', 'cd18': 'false', 'cd15': 'swift', 'cd31': 'true', 'cd57': 'usb', + 'cd58': 'false', }) ))); }, overrides: { @@ -488,6 +489,41 @@ void main() { Usage: () => usage, }); + testUsingContext('correctly reports tests to usage', () async { + fs.currentDirectory.childDirectory('test').childFile('widget_test.dart').createSync(recursive: true); + fs.currentDirectory.childDirectory('ios').childFile('AppDelegate.swift').createSync(recursive: true); + final RunCommand command = RunCommand(); + final FakeDevice mockDevice = FakeDevice(sdkNameAndVersion: 'iOS 13') + ..startAppSuccess = false; + + testDeviceManager.devices = [mockDevice]; + + await expectToolExitLater(createTestCommandRunner(command).run([ + 'run', + '--no-pub', + '--no-hot', + 'test/widget_test.dart', + ]), isNull); + + expect(usage.commands, contains( + TestUsageCommand('run', parameters: CustomDimensions.fromMap({ + 'cd3': 'false', 'cd4': 'ios', 'cd22': 'iOS 13', + 'cd23': 'debug', 'cd18': 'false', 'cd15': 'swift', 'cd31': 'true', + 'cd57': 'usb', + 'cd58': 'true', + })), + )); + }, overrides: { + AnsiTerminal: () => fakeTerminal, + Artifacts: () => artifacts, + Cache: () => Cache.test(processManager: FakeProcessManager.any()), + DeviceManager: () => testDeviceManager, + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + Stdio: () => FakeStdio(), + Usage: () => usage, + }); + group('--machine', () { testUsingContext('enables multidex by default', () async { final DaemonCapturingRunCommand command = DaemonCapturingRunCommand(); @@ -745,6 +781,7 @@ void main() { commandRunModeName: 'debug', commandRunProjectModule: false, commandRunProjectHostLanguage: '', + commandRunIsTest: false, )); }, overrides: { DeviceManager: () => testDeviceManager, @@ -785,6 +822,7 @@ void main() { commandRunProjectModule: false, commandRunProjectHostLanguage: '', commandRunIOSInterfaceType: 'usb', + commandRunIsTest: false, )); }, overrides: { DeviceManager: () => testDeviceManager, @@ -828,6 +866,7 @@ void main() { commandRunProjectModule: false, commandRunProjectHostLanguage: '', commandRunIOSInterfaceType: 'wireless', + commandRunIsTest: false, )); }, overrides: { DeviceManager: () => testDeviceManager, @@ -871,6 +910,7 @@ void main() { commandRunProjectModule: false, commandRunProjectHostLanguage: '', commandRunIOSInterfaceType: 'wireless', + commandRunIsTest: false, )); }, overrides: { DeviceManager: () => testDeviceManager,