Unverified Commit 2acd0007 authored by Lau Ching Jun's avatar Lau Ching Jun Committed by GitHub

Refactor CustomDimensions in analytics to be type safe (#82531)

parent 3b19dfd4
......@@ -140,20 +140,20 @@ class AssembleCommand extends FlutterCommand {
String get name => 'assemble';
@override
Future<Map<CustomDimensions, String>> get usageValues async {
Future<CustomDimensions> get usageValues async {
final FlutterProject flutterProject = FlutterProject.current();
if (flutterProject == null) {
return const <CustomDimensions, String>{};
return const CustomDimensions();
}
try {
return <CustomDimensions, String>{
CustomDimensions.commandBuildBundleTargetPlatform: environment.defines[kTargetPlatform],
CustomDimensions.commandBuildBundleIsModule: '${flutterProject.isModule}',
};
return CustomDimensions(
commandBuildBundleTargetPlatform: environment.defines[kTargetPlatform],
commandBuildBundleIsModule: flutterProject.isModule,
);
} on Exception {
// We've failed to send usage.
}
return const <CustomDimensions, String>{};
return const CustomDimensions();
}
@override
......
......@@ -75,21 +75,25 @@ class BuildAarCommand extends BuildSubCommand {
};
@override
Future<Map<CustomDimensions, String>> get usageValues async {
final Map<CustomDimensions, String> usage = <CustomDimensions, String>{};
Future<CustomDimensions> get usageValues async {
final FlutterProject flutterProject = _getProject();
if (flutterProject == null) {
return usage;
return const CustomDimensions();
}
String projectType;
if (flutterProject.manifest.isModule) {
usage[CustomDimensions.commandBuildAarProjectType] = 'module';
projectType = 'module';
} else if (flutterProject.manifest.isPlugin) {
usage[CustomDimensions.commandBuildAarProjectType] = 'plugin';
projectType = 'plugin';
} else {
usage[CustomDimensions.commandBuildAarProjectType] = 'app';
projectType = 'app';
}
usage[CustomDimensions.commandBuildAarTargetPlatform] = stringsArg('target-platform').join(',');
return usage;
return CustomDimensions(
commandBuildAarProjectType: projectType,
commandBuildAarTargetPlatform: stringsArg('target-platform').join(','),
);
}
@override
......
......@@ -68,25 +68,25 @@ class BuildApkCommand extends BuildSubCommand {
' * https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split';
@override
Future<Map<CustomDimensions, String>> get usageValues async {
final Map<CustomDimensions, String> usage = <CustomDimensions, String>{};
usage[CustomDimensions.commandBuildApkTargetPlatform] =
stringsArg('target-platform').join(',');
usage[CustomDimensions.commandBuildApkSplitPerAbi] =
boolArg('split-per-abi').toString();
Future<CustomDimensions> get usageValues async {
String buildMode;
if (boolArg('release')) {
usage[CustomDimensions.commandBuildApkBuildMode] = 'release';
buildMode = 'release';
} else if (boolArg('debug')) {
usage[CustomDimensions.commandBuildApkBuildMode] = 'debug';
buildMode = 'debug';
} else if (boolArg('profile')) {
usage[CustomDimensions.commandBuildApkBuildMode] = 'profile';
buildMode = 'profile';
} else {
// The build defaults to release.
usage[CustomDimensions.commandBuildApkBuildMode] = 'release';
buildMode = 'release';
}
return usage;
return CustomDimensions(
commandBuildApkTargetPlatform: stringsArg('target-platform').join(','),
commandBuildApkBuildMode: buildMode,
commandBuildApkSplitPerAbi: boolArg('split-per-abi'),
);
}
@override
......
......@@ -82,23 +82,24 @@ class BuildAppBundleCommand extends BuildSubCommand {
'suitable for deploying to app stores. \n app bundle improves your app size';
@override
Future<Map<CustomDimensions, String>> get usageValues async {
final Map<CustomDimensions, String> usage = <CustomDimensions, String>{};
usage[CustomDimensions.commandBuildAppBundleTargetPlatform] =
stringsArg('target-platform').join(',');
Future<CustomDimensions> get usageValues async {
String buildMode;
if (boolArg('release')) {
usage[CustomDimensions.commandBuildAppBundleBuildMode] = 'release';
buildMode = 'release';
} else if (boolArg('debug')) {
usage[CustomDimensions.commandBuildAppBundleBuildMode] = 'debug';
buildMode = 'debug';
} else if (boolArg('profile')) {
usage[CustomDimensions.commandBuildAppBundleBuildMode] = 'profile';
buildMode = 'profile';
} else {
// The build defaults to release.
usage[CustomDimensions.commandBuildAppBundleBuildMode] = 'release';
buildMode = 'release';
}
return usage;
return CustomDimensions(
commandBuildAppBundleTargetPlatform: stringsArg('target-platform').join(','),
commandBuildAppBundleBuildMode: buildMode,
);
}
@override
......
......@@ -69,16 +69,16 @@ class BuildBundleCommand extends BuildSubCommand {
' iOS runtimes.';
@override
Future<Map<CustomDimensions, String>> get usageValues async {
Future<CustomDimensions> get usageValues async {
final String projectDir = globals.fs.file(targetFile).parent.parent.path;
final FlutterProject flutterProject = FlutterProject.fromDirectory(globals.fs.directory(projectDir));
if (flutterProject == null) {
return const <CustomDimensions, String>{};
return const CustomDimensions();
}
return <CustomDimensions, String>{
CustomDimensions.commandBuildBundleTargetPlatform: stringArg('target-platform'),
CustomDimensions.commandBuildBundleIsModule: '${flutterProject.isModule}',
};
return CustomDimensions(
commandBuildBundleTargetPlatform: stringArg('target-platform'),
commandBuildBundleIsModule: flutterProject.isModule,
);
}
@override
......
......@@ -79,12 +79,12 @@ class CreateCommand extends CreateBase {
String get invocation => '${runner.executableName} $name <output directory>';
@override
Future<Map<CustomDimensions, String>> get usageValues async {
return <CustomDimensions, String>{
CustomDimensions.commandCreateProjectType: stringArg('template'),
CustomDimensions.commandCreateAndroidLanguage: stringArg('android-language'),
CustomDimensions.commandCreateIosLanguage: stringArg('ios-language'),
};
Future<CustomDimensions> get usageValues async {
return CustomDimensions(
commandCreateProjectType: stringArg('template'),
commandCreateAndroidLanguage: stringArg('android-language'),
commandCreateIosLanguage: stringArg('ios-language'),
);
}
// Lazy-initialize the net utilities with values from the context.
......
......@@ -81,13 +81,15 @@ class PackagesGetCommand extends FlutterCommand {
/// The pub packages usage values are incorrect since these are calculated/sent
/// before pub get completes. This needs to be performed after dependency resolution.
@override
Future<Map<CustomDimensions, String>> get usageValues async {
final Map<CustomDimensions, String> usageValues = <CustomDimensions, String>{};
Future<CustomDimensions> get usageValues async {
final String workingDirectory = argResults.rest.length == 1 ? argResults.rest[0] : null;
final String target = findProjectRoot(globals.fs, workingDirectory);
if (target == null) {
return usageValues;
return const CustomDimensions();
}
int numberPlugins;
final FlutterProject rootProject = FlutterProject.fromDirectory(globals.fs.directory(target));
// Do not send plugin analytics if pub has not run before.
final bool hasPlugins = rootProject.flutterPluginsDependenciesFile.existsSync()
......@@ -97,14 +99,16 @@ class PackagesGetCommand extends FlutterCommand {
// Do not fail pub get if package config files are invalid before pub has
// had a chance to run.
final List<Plugin> plugins = await findPlugins(rootProject, throwOnError: false);
usageValues[CustomDimensions.commandPackagesNumberPlugins] = plugins.length.toString();
numberPlugins = plugins.length;
} else {
usageValues[CustomDimensions.commandPackagesNumberPlugins] = '0';
numberPlugins = 0;
}
usageValues[CustomDimensions.commandPackagesProjectModule] = '${rootProject.isModule}';
usageValues[CustomDimensions.commandPackagesAndroidEmbeddingVersion] =
rootProject.android.getEmbeddingVersion().toString().split('.').last;
return usageValues;
return CustomDimensions(
commandPackagesNumberPlugins: numberPlugins,
commandPackagesProjectModule: rootProject.isModule,
commandPackagesAndroidEmbeddingVersion: rootProject.android.getEmbeddingVersion().toString().split('.').last,
);
}
Future<void> _runPubGet(String directory, FlutterProject flutterProject) async {
......
......@@ -357,7 +357,7 @@ class RunCommand extends RunCommandBase {
}
@override
Future<Map<CustomDimensions, String>> get usageValues async {
Future<CustomDimensions> get usageValues async {
String deviceType, deviceOsVersion;
bool isEmulator;
bool anyAndroidDevices = false;
......@@ -410,16 +410,15 @@ class RunCommand extends RunCommandBase {
final BuildInfo buildInfo = await getBuildInfo();
final String modeName = buildInfo.modeName;
return <CustomDimensions, String>{
CustomDimensions.commandRunIsEmulator: '$isEmulator',
CustomDimensions.commandRunTargetName: deviceType,
CustomDimensions.commandRunTargetOsVersion: deviceOsVersion,
CustomDimensions.commandRunModeName: modeName,
CustomDimensions.commandRunProjectModule: '${FlutterProject.current().isModule}',
CustomDimensions.commandRunProjectHostLanguage: hostLanguage.join(','),
if (androidEmbeddingVersion != null)
CustomDimensions.commandRunAndroidEmbeddingVersion: androidEmbeddingVersion,
};
return CustomDimensions(
commandRunIsEmulator: isEmulator,
commandRunTargetName: deviceType,
commandRunTargetOsVersion: deviceOsVersion,
commandRunModeName: modeName,
commandRunProjectModule: FlutterProject.current().isModule,
commandRunProjectHostLanguage: hostLanguage.join(','),
commandRunAndroidEmbeddingVersion: androidEmbeddingVersion,
);
}
@override
......
......@@ -21,7 +21,7 @@ class DisabledUsage implements Usage {
String get clientId => '';
@override
void sendCommand(String command, { Map<String, String>? parameters }) { }
void sendCommand(String command, { CustomDimensions? parameters }) { }
@override
void sendEvent(
......@@ -29,7 +29,7 @@ class DisabledUsage implements Usage {
String parameter, {
String? label,
int? value,
Map<String, String>? parameters,
CustomDimensions? parameters,
}) { }
@override
......
......@@ -68,32 +68,22 @@ class HotEvent extends UsageEvent {
@override
void send() {
final Map<String, String> parameters = _useCdKeys(<CustomDimensions, String>{
CustomDimensions.hotEventTargetPlatform: targetPlatform,
CustomDimensions.hotEventSdkName: sdkName,
CustomDimensions.hotEventEmulator: emulator.toString(),
CustomDimensions.hotEventFullRestart: fullRestart.toString(),
if (reason != null)
CustomDimensions.hotEventReason: reason!,
if (finalLibraryCount != null)
CustomDimensions.hotEventFinalLibraryCount: finalLibraryCount.toString(),
if (syncedLibraryCount != null)
CustomDimensions.hotEventSyncedLibraryCount: syncedLibraryCount.toString(),
if (syncedClassesCount != null)
CustomDimensions.hotEventSyncedClassesCount: syncedClassesCount.toString(),
if (syncedProceduresCount != null)
CustomDimensions.hotEventSyncedProceduresCount: syncedProceduresCount.toString(),
if (syncedBytes != null)
CustomDimensions.hotEventSyncedBytes: syncedBytes.toString(),
if (invalidatedSourcesCount != null)
CustomDimensions.hotEventInvalidatedSourcesCount: invalidatedSourcesCount.toString(),
if (transferTimeInMs != null)
CustomDimensions.hotEventTransferTimeInMs: transferTimeInMs.toString(),
if (overallTimeInMs != null)
CustomDimensions.hotEventOverallTimeInMs: overallTimeInMs.toString(),
if (fastReassemble != null)
CustomDimensions.fastReassemble: fastReassemble.toString(),
});
final CustomDimensions parameters = CustomDimensions(
hotEventTargetPlatform: targetPlatform,
hotEventSdkName: sdkName,
hotEventEmulator: emulator,
hotEventFullRestart: fullRestart,
hotEventReason: reason,
hotEventFinalLibraryCount: finalLibraryCount,
hotEventSyncedLibraryCount: syncedLibraryCount,
hotEventSyncedClassesCount: syncedClassesCount,
hotEventSyncedProceduresCount: syncedProceduresCount,
hotEventSyncedBytes: syncedBytes,
hotEventInvalidatedSourcesCount: invalidatedSourcesCount,
hotEventTransferTimeInMs: transferTimeInMs,
hotEventOverallTimeInMs: overallTimeInMs,
fastReassemble: fastReassemble,
);
flutterUsage.sendEvent(category, parameter, parameters: parameters);
}
}
......@@ -169,14 +159,11 @@ class BuildEvent extends UsageEvent {
@override
void send() {
final Map<String, String> parameters = _useCdKeys(<CustomDimensions, String>{
if (_command != null)
CustomDimensions.buildEventCommand: _command!,
if (_settings != null)
CustomDimensions.buildEventSettings: _settings!,
if (_eventError != null)
CustomDimensions.buildEventError: _eventError!,
});
final CustomDimensions parameters = CustomDimensions(
buildEventCommand: _command,
buildEventSettings: _settings,
buildEventError: _eventError,
);
flutterUsage.sendEvent(
category,
parameter,
......@@ -290,10 +277,10 @@ class NullSafetyAnalysisEvent implements UsageEvent {
}
}
flutterUsage.sendEvent(kNullSafetyCategory, 'runtime-mode', label: nullSafetyMode.toString());
flutterUsage.sendEvent(kNullSafetyCategory, 'stats', parameters: <String, String>{
cdKey(CustomDimensions.nullSafeMigratedLibraries): migrated.toString(),
cdKey(CustomDimensions.nullSafeTotalLibraries): packageConfig.packages.length.toString(),
});
flutterUsage.sendEvent(kNullSafetyCategory, 'stats', parameters: CustomDimensions(
nullSafeMigratedLibraries: migrated,
nullSafeTotalLibraries: packageConfig.packages.length,
));
if (languageVersion != null) {
final String formattedVersion = '${languageVersion.major}.${languageVersion.minor}';
flutterUsage.sendEvent(kNullSafetyCategory, 'language-version', label: formattedVersion);
......
......@@ -25,3 +25,4 @@ import 'first_run.dart';
part 'disabled_usage.dart';
part 'events.dart';
part 'usage.dart';
part 'custom_dimensions.dart';
......@@ -6,70 +6,6 @@ part of reporting;
const String _kFlutterUA = 'UA-67589403-6';
/// The collection of custom dimensions understood by the analytics backend.
/// When adding to this list, first ensure that the custom dimension is
/// defined in the backend, or will be defined shortly after the relevant PR
/// lands.
enum CustomDimensions {
sessionHostOsDetails, // cd1
sessionChannelName, // cd2
commandRunIsEmulator, // cd3
commandRunTargetName, // cd4
hotEventReason, // cd5
hotEventFinalLibraryCount, // cd6
hotEventSyncedLibraryCount, // cd7
hotEventSyncedClassesCount, // cd8
hotEventSyncedProceduresCount, // cd9
hotEventSyncedBytes, // cd10
hotEventInvalidatedSourcesCount, // cd11
hotEventTransferTimeInMs, // cd12
hotEventOverallTimeInMs, // cd13
commandRunProjectType, // cd14
commandRunProjectHostLanguage, // cd15
commandCreateAndroidLanguage, // cd16
commandCreateIosLanguage, // cd17
commandRunProjectModule, // cd18
commandCreateProjectType, // cd19
commandPackagesNumberPlugins, // cd20
commandPackagesProjectModule, // cd21
commandRunTargetOsVersion, // cd22
commandRunModeName, // cd23
commandBuildBundleTargetPlatform, // cd24
commandBuildBundleIsModule, // cd25
commandResult, // cd26
hotEventTargetPlatform, // cd27
hotEventSdkName, // cd28
hotEventEmulator, // cd29
hotEventFullRestart, // cd30
commandHasTerminal, // cd31
enabledFlutterFeatures, // cd32
localTime, // cd33
commandBuildAarTargetPlatform, // cd34
commandBuildAarProjectType, // cd35
buildEventCommand, // cd36
buildEventSettings, // cd37
commandBuildApkTargetPlatform, // cd38
commandBuildApkBuildMode, // cd39
commandBuildApkSplitPerAbi, // cd40
commandBuildAppBundleTargetPlatform, // cd41
commandBuildAppBundleBuildMode, // cd42
buildEventError, // cd43
commandResultEventMaxRss, // cd44
commandRunAndroidEmbeddingVersion, // cd45
commandPackagesAndroidEmbeddingVersion, // cd46
nullSafety, // cd47
fastReassemble, // cd48
nullSafeMigratedLibraries, // cd49
nullSafeTotalLibraries, // cd 50
}
String cdKey(CustomDimensions cd) => 'cd${cd.index + 1}';
Map<String, String> _useCdKeys(Map<CustomDimensions, Object> parameters) {
return parameters.map((CustomDimensions k, Object v) =>
MapEntry<String, String>(cdKey(k), v.toString()));
}
abstract class Usage {
/// Create a new Usage instance; [versionOverride], [configDirOverride], and
/// [logFile] are used for testing.
......@@ -94,8 +30,8 @@ abstract class Usage {
/// Uses the global [Usage] instance to send a 'command' to analytics.
static void command(String command, {
Map<CustomDimensions, Object>? parameters,
}) => globals.flutterUsage.sendCommand(command, parameters: parameters == null ? null : _useCdKeys(parameters));
CustomDimensions? parameters,
}) => globals.flutterUsage.sendCommand(command, parameters: parameters);
/// Whether analytics reporting should be suppressed.
bool get suppressAnalytics;
......@@ -119,7 +55,7 @@ abstract class Usage {
/// keys are well-defined in [CustomDimensions] above.
void sendCommand(
String command, {
Map<String, String>? parameters,
CustomDimensions? parameters,
});
/// Sends an 'event' to the underlying analytics implementation.
......@@ -133,7 +69,7 @@ abstract class Usage {
String parameter, {
String? label,
int? value,
Map<String, String>? parameters,
CustomDimensions? parameters,
});
/// Sends timing information to the underlying analytics implementation.
......@@ -256,12 +192,12 @@ class _DefaultUsage implements Usage {
if (!skipAnalyticsSessionSetup) {
// Report a more detailed OS version string than package:usage does by default.
analytics.setSessionValue(
cdKey(CustomDimensions.sessionHostOsDetails),
cdKey(CustomDimensionsEnum.sessionHostOsDetails),
globals.os.name,
);
// Send the branch name as the "channel".
analytics.setSessionValue(
cdKey(CustomDimensions.sessionChannelName),
cdKey(CustomDimensionsEnum.sessionChannelName),
flutterVersion.getBranchName(redactUnknownBranches: true),
);
// For each flutter experimental feature, record a session value in a comma
......@@ -274,7 +210,7 @@ class _DefaultUsage implements Usage {
.map((Feature feature) => feature.configSetting)
.join(',');
analytics.setSessionValue(
cdKey(CustomDimensions.enabledFlutterFeatures),
cdKey(CustomDimensionsEnum.enabledFlutterFeatures),
enabledFeatures,
);
......@@ -320,16 +256,17 @@ class _DefaultUsage implements Usage {
String get clientId => _analytics.clientId;
@override
void sendCommand(String command, { Map<String, String>? parameters }) {
void sendCommand(String command, { CustomDimensions? parameters }) {
if (suppressAnalytics) {
return;
}
final Map<String, String> paramsWithLocalTime = <String, String>{
...?parameters,
cdKey(CustomDimensions.localTime): formatDateTime(_clock.now()),
};
_analytics.sendScreenView(command, parameters: paramsWithLocalTime);
_analytics.sendScreenView(
command,
parameters: CustomDimensions(localTime: formatDateTime(_clock.now()))
.merge(parameters)
.toMap(),
);
}
@override
......@@ -338,23 +275,20 @@ class _DefaultUsage implements Usage {
String parameter, {
String? label,
int? value,
Map<String, String>? parameters,
CustomDimensions? parameters,
}) {
if (suppressAnalytics) {
return;
}
final Map<String, String> paramsWithLocalTime = <String, String>{
...?parameters,
cdKey(CustomDimensions.localTime): formatDateTime(_clock.now()),
};
_analytics.sendEvent(
category,
parameter,
label: label,
value: value,
parameters: paramsWithLocalTime,
parameters: CustomDimensions(localTime: formatDateTime(_clock.now()))
.merge(parameters)
.toMap(),
);
}
......@@ -516,12 +450,12 @@ class TestUsage implements Usage {
void printWelcome() { }
@override
void sendCommand(String command, {Map<String, String>? parameters}) {
void sendCommand(String command, {CustomDimensions? parameters}) {
commands.add(TestUsageCommand(command, parameters: parameters));
}
@override
void sendEvent(String category, String parameter, {String? label, int? value, Map<String, String>? parameters}) {
void sendEvent(String category, String parameter, {String? label, int? value, CustomDimensions? parameters}) {
events.add(TestUsageEvent(category, parameter, label: label, value: value, parameters: parameters));
}
......@@ -542,13 +476,13 @@ class TestUsageCommand {
const TestUsageCommand(this.command, {this.parameters});
final String command;
final Map<String, String>? parameters;
final CustomDimensions? parameters;
@override
bool operator ==(Object other) {
return other is TestUsageCommand &&
other.command == command &&
_mapsEqual(other.parameters, parameters);
other.parameters == parameters;
}
@override
......@@ -567,7 +501,7 @@ class TestUsageEvent {
final String parameter;
final String? label;
final int? value;
final Map<String, String>? parameters;
final CustomDimensions? parameters;
@override
bool operator ==(Object other) {
......@@ -576,7 +510,7 @@ class TestUsageEvent {
other.parameter == parameter &&
other.label == label &&
other.value == value &&
_mapsEqual(other.parameters, parameters);
other.parameters == parameters;
}
@override
......
......@@ -1063,8 +1063,7 @@ abstract class FlutterCommand extends Command<void> {
}
/// Additional usage values to be sent with the usage ping.
Future<Map<CustomDimensions, String>> get usageValues async =>
const <CustomDimensions, String>{};
Future<CustomDimensions> get usageValues async => const CustomDimensions();
/// Runs this command.
///
......@@ -1231,12 +1230,9 @@ abstract class FlutterCommand extends Command<void> {
setupApplicationPackages();
if (commandPath != null) {
final Map<CustomDimensions, Object> additionalUsageValues =
<CustomDimensions, Object>{
...?await usageValues,
CustomDimensions.commandHasTerminal: globals.stdio.hasTerminal,
};
Usage.command(commandPath, parameters: additionalUsageValues);
Usage.command(commandPath, parameters: CustomDimensions(
commandHasTerminal: globals.stdio.hasTerminal,
).merge(await usageValues));
}
return runCommand();
......
......@@ -12,7 +12,6 @@ import 'package:flutter_tools/src/convert.dart';
import 'package:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/doctor_validator.dart';
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
import 'package:flutter_tools/src/reporting/reporting.dart';
import '../../src/context.dart';
import '../../src/test_flutter_command_runner.dart';
......@@ -72,16 +71,16 @@ void main() {
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['create', '--no-pub', '--template=module', 'testy']);
expect(await command.usageValues, containsPair(CustomDimensions.commandCreateProjectType, 'module'));
expect((await command.usageValues).commandCreateProjectType, 'module');
await runner.run(<String>['create', '--no-pub', '--template=app', 'testy']);
expect(await command.usageValues, containsPair(CustomDimensions.commandCreateProjectType, 'app'));
expect((await command.usageValues).commandCreateProjectType, 'app');
await runner.run(<String>['create', '--no-pub', '--template=package', 'testy']);
expect(await command.usageValues, containsPair(CustomDimensions.commandCreateProjectType, 'package'));
expect((await command.usageValues).commandCreateProjectType, 'package');
await runner.run(<String>['create', '--no-pub', '--template=plugin', 'testy']);
expect(await command.usageValues, containsPair(CustomDimensions.commandCreateProjectType, 'plugin'));
expect((await command.usageValues).commandCreateProjectType, 'plugin');
}));
testUsingContext('set iOS host language type as usage value', () => testbed.run(() async {
......@@ -90,8 +89,7 @@ void main() {
await runner.run(<String>[
'create', '--no-pub', '--template=app', 'testy']);
expect(await command.usageValues,
containsPair(CustomDimensions.commandCreateIosLanguage, 'swift'));
expect((await command.usageValues).commandCreateIosLanguage, 'swift');
await runner.run(<String>[
'create',
......@@ -100,8 +98,7 @@ void main() {
'--ios-language=objc',
'testy',
]);
expect(await command.usageValues,
containsPair(CustomDimensions.commandCreateIosLanguage, 'objc'));
expect((await command.usageValues).commandCreateIosLanguage, 'objc');
}));
......@@ -110,8 +107,7 @@ void main() {
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['create', '--no-pub', '--template=app', 'testy']);
expect(await command.usageValues,
containsPair(CustomDimensions.commandCreateAndroidLanguage, 'kotlin'));
expect((await command.usageValues).commandCreateAndroidLanguage, 'kotlin');
await runner.run(<String>[
'create',
......@@ -120,8 +116,7 @@ void main() {
'--android-language=java',
'testy',
]);
expect(await command.usageValues,
containsPair(CustomDimensions.commandCreateAndroidLanguage, 'java'));
expect((await command.usageValues).commandCreateAndroidLanguage, 'java');
}));
});
}
......
......@@ -41,11 +41,11 @@ void main() {
await commandRunner.run(<String>['get']);
expect(await command.usageValues, <CustomDimensions, Object>{
CustomDimensions.commandPackagesNumberPlugins: '0',
CustomDimensions.commandPackagesProjectModule: 'false',
CustomDimensions.commandPackagesAndroidEmbeddingVersion: 'v1'
});
expect(await command.usageValues, const CustomDimensions(
commandPackagesNumberPlugins: 0,
commandPackagesProjectModule: false,
commandPackagesAndroidEmbeddingVersion: 'v1',
));
}, overrides: <Type, Generator>{
Pub: () => pub,
ProcessManager: () => FakeProcessManager.any(),
......@@ -66,11 +66,11 @@ void main() {
await commandRunner.run(<String>['get']);
expect(await command.usageValues, <CustomDimensions, Object>{
CustomDimensions.commandPackagesNumberPlugins: '0',
CustomDimensions.commandPackagesProjectModule: 'false',
CustomDimensions.commandPackagesAndroidEmbeddingVersion: 'v1'
});
expect(await command.usageValues, const CustomDimensions(
commandPackagesNumberPlugins: 0,
commandPackagesProjectModule: false,
commandPackagesAndroidEmbeddingVersion: 'v1',
));
}, overrides: <Type, Generator>{
Pub: () => pub,
ProcessManager: () => FakeProcessManager.any(),
......@@ -86,11 +86,11 @@ void main() {
await commandRunner.run(<String>['get']);
expect(await command.usageValues, <CustomDimensions, Object>{
CustomDimensions.commandPackagesNumberPlugins: '0',
CustomDimensions.commandPackagesProjectModule: 'false',
CustomDimensions.commandPackagesAndroidEmbeddingVersion: 'v1'
});
expect(await command.usageValues, const CustomDimensions(
commandPackagesNumberPlugins: 0,
commandPackagesProjectModule: false,
commandPackagesAndroidEmbeddingVersion: 'v1',
));
}, overrides: <Type, Generator>{
Pub: () => pub,
ProcessManager: () => FakeProcessManager.any(),
......
......@@ -368,10 +368,10 @@ void main() {
]), isNull);
expect(usage.commands, contains(
const TestUsageCommand('run', parameters: <String, String>{
TestUsageCommand('run', parameters: CustomDimensions.fromMap(<String, String>{
'cd3': 'false', 'cd4': 'ios', 'cd22': 'iOS 13',
'cd23': 'debug', 'cd18': 'false', 'cd15': 'swift', 'cd31': 'false',
}
})
)));
}, overrides: <Type, Generator>{
Artifacts: () => artifacts,
......
......@@ -55,8 +55,7 @@ void main() {
arguments: <String>['--no-pub', '--template=module']);
final BuildAarCommand command = await runCommandIn(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildAarProjectType, 'module'));
expect((await command.usageValues).commandBuildAarProjectType, 'module');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -67,8 +66,7 @@ void main() {
arguments: <String>['--no-pub', '--template=plugin', '--project-name=aar_test']);
final BuildAarCommand command = await runCommandIn(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildAarProjectType, 'plugin'));
expect((await command.usageValues).commandBuildAarProjectType, 'plugin');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -80,8 +78,7 @@ void main() {
final BuildAarCommand command = await runCommandIn(projectPath,
arguments: <String>['--target-platform=android-arm']);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildAarTargetPlatform, 'android-arm'));
expect((await command.usageValues).commandBuildAarTargetPlatform, 'android-arm');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......
......@@ -43,8 +43,7 @@ void main() {
arguments: <String>['--no-pub', '--template=app']);
final BuildApkCommand command = await runBuildApkCommand(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildApkTargetPlatform, 'android-arm,android-arm64,android-x64'));
expect((await command.usageValues).commandBuildApkTargetPlatform, 'android-arm,android-arm64,android-x64');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -56,12 +55,10 @@ void main() {
final BuildApkCommand commandWithFlag = await runBuildApkCommand(projectPath,
arguments: <String>['--split-per-abi']);
expect(await commandWithFlag.usageValues,
containsPair(CustomDimensions.commandBuildApkSplitPerAbi, 'true'));
expect((await commandWithFlag.usageValues).commandBuildApkSplitPerAbi, true);
final BuildApkCommand commandWithoutFlag = await runBuildApkCommand(projectPath);
expect(await commandWithoutFlag.usageValues,
containsPair(CustomDimensions.commandBuildApkSplitPerAbi, 'false'));
expect((await commandWithoutFlag.usageValues).commandBuildApkSplitPerAbi, false);
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -72,23 +69,19 @@ void main() {
arguments: <String>['--no-pub', '--template=app']);
final BuildApkCommand commandDefault = await runBuildApkCommand(projectPath);
expect(await commandDefault.usageValues,
containsPair(CustomDimensions.commandBuildApkBuildMode, 'release'));
expect((await commandDefault.usageValues).commandBuildApkBuildMode, 'release');
final BuildApkCommand commandInRelease = await runBuildApkCommand(projectPath,
arguments: <String>['--release']);
expect(await commandInRelease.usageValues,
containsPair(CustomDimensions.commandBuildApkBuildMode, 'release'));
expect((await commandInRelease.usageValues).commandBuildApkBuildMode, 'release');
final BuildApkCommand commandInDebug = await runBuildApkCommand(projectPath,
arguments: <String>['--debug']);
expect(await commandInDebug.usageValues,
containsPair(CustomDimensions.commandBuildApkBuildMode, 'debug'));
expect((await commandInDebug.usageValues).commandBuildApkBuildMode, 'debug');
final BuildApkCommand commandInProfile = await runBuildApkCommand(projectPath,
arguments: <String>['--profile']);
expect(await commandInProfile.usageValues,
containsPair(CustomDimensions.commandBuildApkBuildMode, 'profile'));
expect((await commandInProfile.usageValues).commandBuildApkBuildMode, 'profile');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -315,7 +308,7 @@ void main() {
'build',
'gradle',
label: 'gradle-r8-failure',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
expect(processManager, hasNoRemainingExpectations);
......@@ -368,7 +361,7 @@ void main() {
'build',
'gradle',
label: 'app-not-using-android-x',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
expect(processManager, hasNoRemainingExpectations);
......@@ -414,7 +407,7 @@ void main() {
'build',
'gradle',
label: 'app-using-android-x',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
expect(processManager, hasNoRemainingExpectations);
......
......@@ -41,8 +41,7 @@ void main() {
arguments: <String>['--no-pub', '--template=app']);
final BuildAppBundleCommand command = await runBuildAppBundleCommand(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildAppBundleTargetPlatform, 'android-arm,android-arm64,android-x64'));
expect((await command.usageValues).commandBuildAppBundleTargetPlatform, 'android-arm,android-arm64,android-x64');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -53,23 +52,19 @@ void main() {
arguments: <String>['--no-pub', '--template=app']);
final BuildAppBundleCommand commandDefault = await runBuildAppBundleCommand(projectPath);
expect(await commandDefault.usageValues,
containsPair(CustomDimensions.commandBuildAppBundleBuildMode, 'release'));
expect((await commandDefault.usageValues).commandBuildAppBundleBuildMode, 'release');
final BuildAppBundleCommand commandInRelease = await runBuildAppBundleCommand(projectPath,
arguments: <String>['--release']);
expect(await commandInRelease.usageValues,
containsPair(CustomDimensions.commandBuildAppBundleBuildMode, 'release'));
expect((await commandInRelease.usageValues).commandBuildAppBundleBuildMode, 'release');
final BuildAppBundleCommand commandInDebug = await runBuildAppBundleCommand(projectPath,
arguments: <String>['--debug']);
expect(await commandInDebug.usageValues,
containsPair(CustomDimensions.commandBuildAppBundleBuildMode, 'debug'));
expect((await commandInDebug.usageValues).commandBuildAppBundleBuildMode, 'debug');
final BuildAppBundleCommand commandInProfile = await runBuildAppBundleCommand(projectPath,
arguments: <String>['--profile']);
expect(await commandInProfile.usageValues,
containsPair(CustomDimensions.commandBuildAppBundleBuildMode, 'profile'));
expect((await commandInProfile.usageValues).commandBuildAppBundleBuildMode, 'profile');
}, overrides: <Type, Generator>{
AndroidBuilder: () => FakeAndroidBuilder(),
......@@ -163,7 +158,7 @@ void main() {
'build',
'gradle',
label: 'app-not-using-android-x',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
},
......@@ -203,7 +198,7 @@ void main() {
'build',
'gradle',
label: 'app-using-android-x',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
},
......
......@@ -15,7 +15,6 @@ import 'package:flutter_tools/src/commands/build_bundle.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:meta/meta.dart';
import 'package:test/fake.dart';
......@@ -58,8 +57,7 @@ void main() {
final BuildBundleCommand command = await runCommandIn(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildBundleIsModule, 'true'));
expect((await command.usageValues).commandBuildBundleIsModule, true);
});
testUsingContext('bundle getUsage indicate that project is not a module', () async {
......@@ -68,8 +66,7 @@ void main() {
final BuildBundleCommand command = await runCommandIn(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildBundleIsModule, 'false'));
expect((await command.usageValues).commandBuildBundleIsModule, false);
});
testUsingContext('bundle getUsage indicate the target platform', () async {
......@@ -78,8 +75,7 @@ void main() {
final BuildBundleCommand command = await runCommandIn(projectPath);
expect(await command.usageValues,
containsPair(CustomDimensions.commandBuildBundleTargetPlatform, 'android-arm'));
expect((await command.usageValues).commandBuildBundleTargetPlatform, 'android-arm');
});
testUsingContext('bundle fails to build for Windows if feature is disabled', () async {
......
......@@ -18,7 +18,6 @@ import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/packages.dart';
import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
import 'package:flutter_tools/src/reporting/reporting.dart';
import '../../src/common.dart';
import '../../src/context.dart';
......@@ -240,8 +239,7 @@ void main() {
final PackagesCommand command = await runCommandIn(projectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesNumberPlugins, '0'));
expect((await getCommand.usageValues).commandPackagesNumberPlugins, 0);
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......@@ -263,8 +261,7 @@ void main() {
final PackagesCommand command = await runCommandIn(exampleProjectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesNumberPlugins, '1'));
expect((await getCommand.usageValues).commandPackagesNumberPlugins, 1);
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......@@ -284,8 +281,7 @@ void main() {
final PackagesCommand command = await runCommandIn(projectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesProjectModule, 'false'));
expect((await getCommand.usageValues).commandPackagesProjectModule, false);
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......@@ -305,8 +301,7 @@ void main() {
final PackagesCommand command = await runCommandIn(projectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesProjectModule, 'true'));
expect((await getCommand.usageValues).commandPackagesProjectModule, true);
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......@@ -335,8 +330,7 @@ void main() {
final PackagesCommand command = await runCommandIn(projectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesAndroidEmbeddingVersion, 'v1'));
expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v1');
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......@@ -356,8 +350,7 @@ void main() {
final PackagesCommand command = await runCommandIn(projectPath, 'get');
final PackagesGetCommand getCommand = command.subcommands['get'] as PackagesGetCommand;
expect(await getCommand.usageValues,
containsPair(CustomDimensions.commandPackagesAndroidEmbeddingVersion, 'v2'));
expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v2');
}, overrides: <Type, Generator>{
Pub: () => Pub(
fileSystem: globals.fs,
......
......@@ -111,7 +111,7 @@ void main() {
final Usage usage = Usage(runningOnBot: true);
usage.sendCommand('test');
final String featuresKey = cdKey(CustomDimensions.enabledFlutterFeatures);
final String featuresKey = cdKey(CustomDimensionsEnum.enabledFlutterFeatures);
expect(globals.fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web'));
}, overrides: <Type, Generator>{
......@@ -131,7 +131,7 @@ void main() {
final Usage usage = Usage(runningOnBot: true);
usage.sendCommand('test');
final String featuresKey = cdKey(CustomDimensions.enabledFlutterFeatures);
final String featuresKey = cdKey(CustomDimensionsEnum.enabledFlutterFeatures);
expect(
globals.fs.file('test').readAsStringSync(),
......
......@@ -122,7 +122,7 @@ void main() {
'build',
'gradle',
label: 'gradle-random-event-label-failure',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
});
......@@ -224,7 +224,7 @@ void main() {
'build',
'gradle',
label: 'gradle-random-event-label-failure',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
});
......@@ -311,7 +311,7 @@ void main() {
'build',
'gradle',
label: 'gradle-random-event-label-failure',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
});
......@@ -467,7 +467,7 @@ void main() {
'build',
'gradle',
label: 'gradle-random-event-label-success',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
expect(processManager, hasNoRemainingExpectations);
......@@ -675,7 +675,7 @@ void main() {
'build',
'gradle',
label: 'gradle-random-event-label-failure',
parameters: <String, String>{},
parameters: CustomDimensions(),
),
));
expect(processManager, hasNoRemainingExpectations);
......
......@@ -355,13 +355,13 @@ Command: /home/android/gradlew assembleRelease
.handler(line: '', project: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory));
expect(testUsage.events, contains(
const TestUsageEvent(
TestUsageEvent(
'build',
'gradle',
label: 'gradle-android-x-failure',
parameters: <String, String>{
parameters: CustomDimensions.fromMap(<String, String>{
'cd43': 'app-not-using-plugins',
},
}),
),
));
......@@ -390,13 +390,13 @@ Command: /home/android/gradlew assembleRelease
);
expect(testUsage.events, contains(
const TestUsageEvent(
TestUsageEvent(
'build',
'gradle',
label: 'gradle-android-x-failure',
parameters: <String, String>{
parameters: CustomDimensions.fromMap(<String, String>{
'cd43': 'app-not-using-androidx',
},
}),
),
));
......@@ -418,13 +418,13 @@ Command: /home/android/gradlew assembleRelease
);
expect(testUsage.events, contains(
const TestUsageEvent(
TestUsageEvent(
'build',
'gradle',
label: 'gradle-android-x-failure',
parameters: <String, String>{
parameters: CustomDimensions.fromMap(<String, String>{
'cd43': 'using-jetifier',
},
}),
),
));
......@@ -453,13 +453,13 @@ Command: /home/android/gradlew assembleRelease
);
expect(testUsage.events, contains(
const TestUsageEvent(
TestUsageEvent(
'build',
'gradle',
label: 'gradle-android-x-failure',
parameters: <String, String>{
parameters: CustomDimensions.fromMap(<String, String>{
'cd43': 'not-using-jetifier',
},
}),
),
));
expect(status, equals(GradleBuildStatus.retryWithAarPlugins));
......
......@@ -326,13 +326,13 @@ void main() {
)
);
expect(testUsage.events, contains(
const TestUsageEvent(
TestUsageEvent(
'build',
'gradle',
label: 'gradle-expected-file-not-found',
parameters: <String, String> {
parameters: CustomDimensions.fromMap(<String, String> {
'cd37': 'androidGradlePluginVersion: 6.7, fileExtension: .aab',
},
}),
),
));
});
......
......@@ -160,10 +160,10 @@ void main() {
'build',
'ios',
label: 'xcode-bitcode-failure',
parameters: <String, String>{
cdKey(CustomDimensions.buildEventCommand): buildCommands.toString(),
cdKey(CustomDimensions.buildEventSettings): buildSettings.toString(),
},
parameters: CustomDimensions(
buildEventCommand: buildCommands.toString(),
buildEventSettings: buildSettings.toString(),
),
),
));
});
......
......@@ -74,9 +74,9 @@ void main() {
expect(usage.events, unorderedEquals(<TestUsageEvent>[
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: <String, String>{
TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
'cd49': '1', 'cd50': '3',
}),
})),
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'language-version', label: '2.12'),
]));
});
......@@ -98,9 +98,9 @@ void main() {
expect(usage.events, unorderedEquals(<TestUsageEvent>[
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: <String, String>{
TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
'cd49': '1', 'cd50': '3',
}),
})),
]));
});
......@@ -119,9 +119,9 @@ void main() {
expect(usage.events, unorderedEquals(<TestUsageEvent>[
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: <String, String>{
TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
'cd49': '0', 'cd50': '1',
}),
})),
]));
});
}
......
......@@ -550,13 +550,12 @@ void main() {
expect(result.fatal, true);
expect(result.code, 1);
expect((globals.flutterUsage as TestUsage).events, contains(
TestUsageEvent('hot', 'exception', parameters: <String, String>{
cdKey(CustomDimensions.hotEventTargetPlatform):
getNameForTargetPlatform(TargetPlatform.android_arm),
cdKey(CustomDimensions.hotEventSdkName): 'Android',
cdKey(CustomDimensions.hotEventEmulator): 'false',
cdKey(CustomDimensions.hotEventFullRestart): 'false',
}),
TestUsageEvent('hot', 'exception', parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
)),
));
expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{
......@@ -623,13 +622,12 @@ void main() {
expect(result.message, contains('Unable to hot reload application due to an unrecoverable error'));
expect((globals.flutterUsage as TestUsage).events, contains(
TestUsageEvent('hot', 'reload-barred', parameters: <String, String>{
cdKey(CustomDimensions.hotEventTargetPlatform):
getNameForTargetPlatform(TargetPlatform.android_arm),
cdKey(CustomDimensions.hotEventSdkName): 'Android',
cdKey(CustomDimensions.hotEventEmulator): 'false',
cdKey(CustomDimensions.hotEventFullRestart): 'false',
}),
TestUsageEvent('hot', 'reload-barred', parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
)),
));
expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{
......@@ -686,13 +684,12 @@ void main() {
expect(result.code, 1);
expect((globals.flutterUsage as TestUsage).events, contains(
TestUsageEvent('hot', 'exception', parameters: <String, String>{
cdKey(CustomDimensions.hotEventTargetPlatform):
getNameForTargetPlatform(TargetPlatform.android_arm),
cdKey(CustomDimensions.hotEventSdkName): 'Android',
cdKey(CustomDimensions.hotEventEmulator): 'false',
cdKey(CustomDimensions.hotEventFullRestart): 'false',
}),
TestUsageEvent('hot', 'exception', parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
)),
));
expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{
......@@ -981,10 +978,7 @@ void main() {
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
expect(event.category, 'hot');
expect(event.parameter, 'reload');
expect(event.parameters, containsPair(
cdKey(CustomDimensions.hotEventTargetPlatform),
getNameForTargetPlatform(TargetPlatform.android_arm),
));
expect(event.parameters.hotEventTargetPlatform, getNameForTargetPlatform(TargetPlatform.android_arm));
}, overrides: <Type, Generator>{
Usage: () => TestUsage(),
}), overrides: <Type, Generator>{
......@@ -1089,9 +1083,7 @@ void main() {
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
expect(event.category, 'hot');
expect(event.parameter, 'reload');
expect(event.parameters, containsPair(
cdKey(CustomDimensions.fastReassemble), 'true',
));
expect(event.parameters.fastReassemble, true);
}, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem.test(),
Platform: () => FakePlatform(operatingSystem: 'linux'),
......@@ -1157,9 +1149,7 @@ void main() {
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
expect(event.category, 'hot');
expect(event.parameter, 'restart');
expect(event.parameters, containsPair(
cdKey(CustomDimensions.hotEventTargetPlatform), getNameForTargetPlatform(TargetPlatform.android_arm),
));
expect(event.parameters.hotEventTargetPlatform, getNameForTargetPlatform(TargetPlatform.android_arm));
expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{
Usage: () => TestUsage(),
......@@ -1395,13 +1385,12 @@ void main() {
expect(result.code, 1);
expect((globals.flutterUsage as TestUsage).events, contains(
TestUsageEvent('hot', 'exception', parameters: <String, String>{
cdKey(CustomDimensions.hotEventTargetPlatform):
getNameForTargetPlatform(TargetPlatform.android_arm),
cdKey(CustomDimensions.hotEventSdkName): 'Android',
cdKey(CustomDimensions.hotEventEmulator): 'false',
cdKey(CustomDimensions.hotEventFullRestart): 'true',
}),
TestUsageEvent('hot', 'exception', parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: true,
)),
));
expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{
......
......@@ -580,8 +580,8 @@ void main() {
verify(mockResidentCompiler.accept()).called(2);
// ensure that analytics are sent.
expect(testUsage.events, const <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: <String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0'}),
expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: CustomDimensions.fromMap(<String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0'})),
]);
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
......@@ -658,8 +658,8 @@ void main() {
verify(mockResidentCompiler.accept()).called(2);
// ensure that analytics are sent.
expect(testUsage.events, const <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: <String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0'}),
expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: CustomDimensions.fromMap(<String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0'})),
]);
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
......
......@@ -483,12 +483,12 @@ void main() {
'runtime-mode',
label: 'NullSafetyMode.sound',
),
const TestUsageEvent(
TestUsageEvent(
NullSafetyAnalysisEvent.kNullSafetyCategory,
'stats',
parameters: <String, String>{
parameters: CustomDimensions.fromMap(<String, String>{
'cd49': '1', 'cd50': '1',
},
}),
),
const TestUsageEvent(
NullSafetyAnalysisEvent.kNullSafetyCategory,
......
......@@ -282,7 +282,7 @@ class CrashingUsage implements Usage {
String get clientId => _impl.clientId;
@override
void sendCommand(String command, {Map<String, String> parameters}) =>
void sendCommand(String command, {CustomDimensions parameters}) =>
_impl.sendCommand(command, parameters: parameters);
@override
......@@ -291,7 +291,7 @@ class CrashingUsage implements Usage {
String parameter, {
String label,
int value,
Map<String, String> parameters,
CustomDimensions parameters,
}) => _impl.sendEvent(
category,
parameter,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment