remove more (simple) usage of package:usage (#162354)

Towards https://github.com/flutter/flutter/issues/150575.

Tries to remove as much `Usage` as possible while avoiding more
complicated bits that require more scrutiny to make sure we aren't
losing test coverage or otherwise regressing. Said another way, almost
the entire diff is just deleting code to send GA3 events, and the
corresponding GA4 code can be found right next to it—making it easy to
verify we aren't losing events/tests.


<details>

<summary> Pre-launch checklist </summary> 


- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

</details>

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
Andrew Kolos 2025-01-30 10:09:19 -08:00 committed by GitHub
parent 1eecbf1256
commit bc7703f886
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 29 additions and 1077 deletions

View File

@ -247,7 +247,6 @@ class BuildWebCommand extends BuildSubCommand {
buildSystem: globals.buildSystem,
fileSystem: globals.fs,
flutterVersion: globals.flutterVersion,
usage: globals.flutterUsage,
analytics: globals.analytics,
);
await webBuilder.buildWeb(

View File

@ -9,7 +9,6 @@ import '../base/common.dart';
import '../convert.dart';
import '../features.dart';
import '../globals.dart' as globals;
import '../reporting/reporting.dart';
import '../runner/flutter_command.dart';
import '../runner/flutter_command_runner.dart';
@ -137,22 +136,8 @@ class ConfigCommand extends FlutterCommand {
if (argResults!.wasParsed('analytics')) {
final bool value = boolArg('analytics');
// The tool sends the analytics event *before* toggling the flag
// intentionally to be sure that opt-out events are sent correctly.
AnalyticsConfigEvent(enabled: value).send();
if (!value) {
// Normally, the tool waits for the analytics to all send before the
// tool exits, but only when analytics are enabled. When reporting that
// analytics have been disable, the wait must be done here instead.
await globals.flutterUsage.ensureAnalyticsSent();
}
globals.flutterUsage.enabled = value;
globals.printStatus('Analytics reporting ${value ? 'enabled' : 'disabled'}.');
// TODO(eliasyishak): Set the telemetry for the unified_analytics
// package as well, the above will be removed once we have
// fully transitioned to using the new package,
// https://github.com/flutter/flutter/issues/128251
await globals.analytics.setTelemetry(value);
}
@ -273,9 +258,7 @@ class ConfigCommand extends FlutterCommand {
/// List the status of the analytics reporting.
String get analyticsUsage {
final bool analyticsEnabled =
globals.flutterUsage.enabled && !globals.flutterUsage.suppressAnalytics;
return 'Analytics reporting is currently ${analyticsEnabled ? 'enabled' : 'disabled'}.';
return 'Analytics reporting is currently ${globals.analytics.telemetryEnabled ? 'enabled' : 'disabled'}.';
}
/// Raising the reload tip for setting changes.

View File

@ -709,7 +709,6 @@ class AppDomain extends Domain {
stayResident: true,
urlTunneller: options.webEnableExposeUrl! ? daemon.daemonDomain.exposeUrl : null,
machine: machine,
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
logger: globals.logger,

View File

@ -348,7 +348,6 @@ class PackagesGetCommand extends FlutterCommand {
touchesPackageConfig: !(isHelp || dryRun),
);
final Duration elapsedDuration = timer.elapsed;
globals.flutterUsage.sendTiming('pub', 'get', elapsedDuration, label: 'success');
analytics.send(
Event.timing(
workflow: 'pub',
@ -361,7 +360,6 @@ class PackagesGetCommand extends FlutterCommand {
} catch (_) {
// ignore: avoid_catches_without_on_clauses
final Duration elapsedDuration = timer.elapsed;
globals.flutterUsage.sendTiming('pub', 'get', elapsedDuration, label: 'failure');
analytics.send(
Event.timing(
workflow: 'pub',

View File

@ -761,7 +761,6 @@ class RunCommand extends RunCommandBase {
debuggingOptions: await createDebuggingOptions(webMode),
stayResident: stayResident,
fileSystem: globals.fs,
usage: globals.flutterUsage,
analytics: globals.analytics,
logger: globals.logger,
systemClock: globals.systemClock,

View File

@ -167,7 +167,6 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
logger: globals.logger,
platform: globals.platform,
xcodeProjectInterpreter: globals.xcodeProjectInterpreter!,
usage: globals.flutterUsage,
analytics: globals.analytics,
),
CocoaPodsValidator: () => CocoaPodsValidator(globals.cocoaPods!, globals.userMessages),
@ -289,11 +288,7 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
),
MacOSWorkflow: () => MacOSWorkflow(featureFlags: featureFlags, platform: globals.platform),
MDnsVmServiceDiscovery:
() => MDnsVmServiceDiscovery(
logger: globals.logger,
flutterUsage: globals.flutterUsage,
analytics: globals.analytics,
),
() => MDnsVmServiceDiscovery(logger: globals.logger, analytics: globals.analytics),
OperatingSystemUtils:
() => OperatingSystemUtils(
fileSystem: globals.fs,
@ -384,7 +379,6 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
processManager: globals.processManager,
platform: globals.platform,
fileSystem: globals.fs,
usage: globals.flutterUsage,
analytics: globals.analytics,
),
},

View File

@ -97,7 +97,6 @@ class WebDriverService extends DriverService {
stayResident: true,
flutterProject: FlutterProject.current(),
fileSystem: globals.fs,
usage: globals.flutterUsage,
analytics: globals.analytics,
logger: _logger,
systemClock: globals.systemClock,

View File

@ -30,7 +30,6 @@ class XcodeProjectInterpreter {
required ProcessManager processManager,
required Logger logger,
required FileSystem fileSystem,
required Usage usage,
required Analytics analytics,
}) {
return XcodeProjectInterpreter._(
@ -38,7 +37,6 @@ class XcodeProjectInterpreter {
processManager: processManager,
logger: logger,
fileSystem: fileSystem,
usage: usage,
analytics: analytics,
);
}
@ -48,7 +46,6 @@ class XcodeProjectInterpreter {
required ProcessManager processManager,
required Logger logger,
required FileSystem fileSystem,
required Usage usage,
required Analytics analytics,
Version? version,
String? build,
@ -65,7 +62,6 @@ class XcodeProjectInterpreter {
_version = version,
_build = build,
_versionText = version?.toString(),
_usage = usage,
_analytics = analytics;
/// Create an [XcodeProjectInterpreter] for testing.
@ -88,7 +84,6 @@ class XcodeProjectInterpreter {
fileSystem: MemoryFileSystem.test(),
platform: platform,
processManager: processManager,
usage: TestUsage(),
logger: BufferLogger.test(),
version: version,
build: build,
@ -101,7 +96,6 @@ class XcodeProjectInterpreter {
final ProcessUtils _processUtils;
final OperatingSystemUtils _operatingSystemUtils;
final Logger _logger;
final Usage _usage;
final Analytics _analytics;
static final RegExp _versionRegex = RegExp(r'Xcode ([0-9.]+).*Build version (\w+)');
@ -243,12 +237,6 @@ class XcodeProjectInterpreter {
XcodeSdk.IPhoneOS || XcodeSdk.IPhoneSimulator => 'ios',
XcodeSdk.WatchOS || XcodeSdk.WatchSimulator => 'watchos',
};
BuildEvent(
'xcode-show-build-settings-timeout',
type: eventType,
command: showBuildSettingsCommand.join(' '),
flutterUsage: _usage,
).send();
_analytics.send(
Event.flutterBuildInfo(
label: 'xcode-show-build-settings-timeout',
@ -306,12 +294,6 @@ class XcodeProjectInterpreter {
return result.stdout.trim();
} on Exception catch (error) {
if (error is ProcessException && error.toString().contains('timed out')) {
BuildEvent(
'xcode-show-build-settings-timeout',
type: 'ios',
command: showBuildSettingsCommand.join(' '),
flutterUsage: _usage,
).send();
_analytics.send(
Event.flutterBuildInfo(
label: 'xcode-show-build-settings-timeout',

View File

@ -54,7 +54,6 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
required Logger logger,
required FileSystem fileSystem,
required SystemClock systemClock,
required Usage usage,
required Analytics analytics,
bool machine = false,
}) {
@ -66,7 +65,6 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
stayResident: stayResident,
urlTunneller: urlTunneller,
machine: machine,
usage: usage,
analytics: analytics,
systemClock: systemClock,
fileSystem: fileSystem,
@ -91,7 +89,6 @@ class ResidentWebRunner extends ResidentRunner {
required FileSystem fileSystem,
required Logger logger,
required SystemClock systemClock,
required Usage usage,
required Analytics analytics,
UrlTunneller? urlTunneller,
// TODO(bkonyi): remove when ready to serve DevTools from DDS.
@ -99,7 +96,6 @@ class ResidentWebRunner extends ResidentRunner {
}) : _fileSystem = fileSystem,
_logger = logger,
_systemClock = systemClock,
_usage = usage,
_analytics = analytics,
_urlTunneller = urlTunneller,
super(
@ -114,7 +110,6 @@ class ResidentWebRunner extends ResidentRunner {
final FileSystem _fileSystem;
final Logger _logger;
final SystemClock _systemClock;
final Usage _usage;
final Analytics _analytics;
final UrlTunneller? _urlTunneller;
@ -342,7 +337,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
buildSystem: globals.buildSystem,
fileSystem: _fileSystem,
flutterVersion: globals.flutterVersion,
usage: globals.flutterUsage,
analytics: globals.analytics,
);
await webBuilder.buildWeb(
@ -436,7 +430,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
buildSystem: globals.buildSystem,
fileSystem: _fileSystem,
flutterVersion: globals.flutterVersion,
usage: globals.flutterUsage,
analytics: globals.analytics,
);
await webBuilder.buildWeb(
@ -480,7 +473,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
// Don't track restart times for dart2js builds or web-server devices.
if (debuggingOptions.buildInfo.isDebug && deviceIsDebuggable) {
_usage.sendTiming('hot', 'web-incremental-restart', elapsed);
_analytics.send(
Event.timing(
workflow: 'hot',

View File

@ -185,7 +185,6 @@ Future<void> _runCmake(
throwToolExit('Unable to generate build files');
}
final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'cmake-linux', elapsedDuration);
globals.analytics.send(
Event.timing(
workflow: 'build',
@ -216,7 +215,6 @@ Future<void> _runBuild(Directory buildDir) async {
throwToolExit('Build process failed');
}
final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'linux-ninja', elapsedDuration);
globals.analytics.send(
Event.timing(
workflow: 'build',

View File

@ -85,7 +85,6 @@ Future<void> buildMacOS({
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
flutterProject.macos,
globals.logger,
globals.flutterUsage,
globals.analytics,
),
MacOSDeploymentTargetMigration(flutterProject.macos, globals.logger),
@ -246,7 +245,6 @@ Future<void> buildMacOS({
}
await _writeCodeSizeAnalysis(buildInfo, sizeAnalyzer);
final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'xcode-macos', elapsedDuration);
globals.analytics.send(
Event.timing(
workflow: 'build',

View File

@ -22,7 +22,6 @@ import '../ios/xcodeproj.dart';
import '../migrations/cocoapods_script_symlink.dart';
import '../migrations/cocoapods_toolchain_directory_migration.dart';
import '../project.dart';
import '../reporting/reporting.dart';
const String noCocoaPodsConsequence = '''
CocoaPods is a package manager for iOS or macOS platform code.
@ -100,13 +99,11 @@ class CocoaPods {
required XcodeProjectInterpreter xcodeProjectInterpreter,
required Logger logger,
required Platform platform,
required Usage usage,
required Analytics analytics,
}) : _fileSystem = fileSystem,
_processManager = processManager,
_xcodeProjectInterpreter = xcodeProjectInterpreter,
_logger = logger,
_usage = usage,
_analytics = analytics,
_processUtils = ProcessUtils(processManager: processManager, logger: logger),
_operatingSystemUtils = OperatingSystemUtils(
@ -122,7 +119,6 @@ class CocoaPods {
final OperatingSystemUtils _operatingSystemUtils;
final XcodeProjectInterpreter _xcodeProjectInterpreter;
final Logger _logger;
final Usage _usage;
final Analytics _analytics;
Future<String?>? _versionText;
@ -403,7 +399,6 @@ class CocoaPods {
} else if ((_isFfiX86Error(stdout) || _isFfiX86Error(stderr)) &&
_operatingSystemUtils.hostPlatform == HostPlatform.darwin_arm64) {
// https://github.com/flutter/flutter/issues/70796
UsageEvent('pod-install-failure', 'arm-ffi', flutterUsage: _usage).send();
_analytics.send(Event.appleUsageEvent(workflow: 'pod-install-failure', parameter: 'arm-ffi'));
_logger.printError(
'Error: To set up CocoaPods for ARM macOS, run:\n'

View File

@ -7,7 +7,6 @@ import 'package:unified_analytics/unified_analytics.dart';
import '../../base/common.dart';
import '../../base/file_system.dart';
import '../../base/project_migrator.dart';
import '../../reporting/reporting.dart';
import '../../xcode_project.dart';
// Remove the linking and embedding logic from the Xcode project to give the tool more control over these.
@ -15,14 +14,11 @@ class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
MacOSProject project,
super.logger,
Usage usage,
Analytics analytics,
) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile,
_usage = usage,
_analytics = analytics;
final File _xcodeProjectInfoFile;
final Usage _usage;
final Analytics _analytics;
@override
@ -91,12 +87,6 @@ class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
}
if (line.contains('/* App.framework ') || line.contains('/* FlutterMacOS.framework ')) {
UsageEvent(
'macos-migration',
'remove-frameworks',
label: 'failure',
flutterUsage: _usage,
).send();
_analytics.send(
Event.appleUsageEvent(
workflow: 'macos-migration',

View File

@ -26,7 +26,6 @@ import '../ios/ios_deploy.dart';
import '../ios/iproxy.dart';
import '../ios/mac.dart';
import '../ios/xcode_debug.dart';
import '../reporting/reporting.dart';
import 'xcode.dart';
class XCDeviceEventNotification {
@ -520,7 +519,6 @@ class XCDevice {
final String? errorMessage = _parseErrorMessage(errorProperties);
if (errorMessage != null) {
if (errorMessage.contains('not paired')) {
UsageEvent('device', 'ios-trust-failure', flutterUsage: globals.flutterUsage).send();
_analytics.send(
Event.appleUsageEvent(workflow: 'device', parameter: 'ios-trust-failure'),
);

View File

@ -16,7 +16,6 @@ import 'build_info.dart';
import 'convert.dart';
import 'device.dart';
import 'globals.dart' as globals;
import 'reporting/reporting.dart';
/// A wrapper around [MDnsClient] to find a Dart VM Service instance.
class MDnsVmServiceDiscovery {
@ -27,12 +26,10 @@ class MDnsVmServiceDiscovery {
MDnsClient? mdnsClient,
MDnsClient? preliminaryMDnsClient,
required Logger logger,
required Usage flutterUsage,
required Analytics analytics,
}) : _client = mdnsClient ?? MDnsClient(),
_preliminaryClient = preliminaryMDnsClient,
_logger = logger,
_flutterUsage = flutterUsage,
_analytics = analytics;
final MDnsClient _client;
@ -42,7 +39,6 @@ class MDnsVmServiceDiscovery {
final MDnsClient? _preliminaryClient;
final Logger _logger;
final Usage _flutterUsage;
final Analytics _analytics;
@visibleForTesting
@ -575,7 +571,6 @@ class MDnsVmServiceDiscovery {
final TargetPlatform targetPlatform = await device.targetPlatform;
switch (targetPlatform) {
case TargetPlatform.ios:
UsageEvent('ios-mdns', 'no-ipv4-link-local', flutterUsage: _flutterUsage).send();
_analytics.send(
Event.appleUsageEvent(workflow: 'ios-mdns', parameter: 'no-ipv4-link-local'),
);

View File

@ -716,7 +716,6 @@ class HotRunner extends ResidentRunner {
// Send timing analytics.
final Duration elapsedDuration = restartTimer.elapsed;
globals.flutterUsage.sendTiming('hot', 'restart', elapsedDuration);
_analytics.send(
Event.timing(
workflow: 'hot',
@ -1046,7 +1045,6 @@ class HotRunner extends ResidentRunner {
sdkName,
emulator,
reason,
globals.flutterUsage,
globals.analytics,
);
if (result.code != 0) {
@ -1145,7 +1143,6 @@ class HotRunner extends ResidentRunner {
if ((reassembleResult.reassembleViews.length == 1) &&
!reassembleResult.failedReassemble &&
shouldReportReloadTime) {
globals.flutterUsage.sendTiming('hot', 'reload', reloadDuration);
_analytics.send(
Event.timing(
workflow: 'hot',
@ -1298,7 +1295,6 @@ typedef ReloadSourcesHelper =
String? sdkName,
bool? emulator,
String? reason,
Usage usage,
Analytics analytics,
);
@ -1312,7 +1308,6 @@ Future<OperationResult> defaultReloadSourcesHelper(
String? sdkName,
bool? emulator,
String? reason,
Usage usage,
Analytics analytics,
) async {
final Stopwatch vmReloadTimer = Stopwatch()..start();
@ -1348,22 +1343,12 @@ Future<OperationResult> defaultReloadSourcesHelper(
(await Future.wait(allReportsFutures)).whereType<DeviceReloadReport>();
final vm_service.ReloadReport? reloadReport = reports.isEmpty ? null : reports.first.reports[0];
if (reloadReport == null || !HotRunner.validateReloadReport(reloadReport)) {
// Reload failed.
HotEvent(
'reload-reject',
targetPlatform: targetPlatform!,
sdkName: sdkName!,
emulator: emulator!,
fullRestart: false,
reason: reason,
usage: usage,
).send();
analytics.send(
Event.hotRunnerInfo(
label: 'reload-reject',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
targetPlatform: targetPlatform!,
sdkName: sdkName!,
emulator: emulator!,
fullRestart: false,
reason: reason,
),

View File

@ -1805,14 +1805,6 @@ abstract class FlutterCommand extends Command<void> {
final Duration elapsedDuration = (commandResult.endTimeOverride ?? endTime).difference(
startTime,
);
globals.flutterUsage.sendTiming(
'flutter',
name,
elapsedDuration,
// Report in the form of `success-[parameter1-parameter2]`, all of which
// can be null if the command doesn't provide a FlutterCommandResult.
label: label == '' ? null : label,
);
analytics.send(
Event.timing(
workflow: 'flutter',

View File

@ -440,7 +440,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
}
if ((topLevelResults[FlutterGlobalOptions.kSuppressAnalyticsFlag] as bool?) ?? false) {
globals.flutterUsage.suppressAnalytics = true;
globals.analytics.suppressTelemetry();
}
@ -459,7 +458,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
}
if ((topLevelResults[FlutterGlobalOptions.kVersionFlag] as bool?) ?? false) {
globals.flutterUsage.sendCommand(FlutterGlobalOptions.kVersionFlag);
globals.analytics.send(
Event.flutterCommandResult(
commandPath: 'version',

View File

@ -19,7 +19,6 @@ import '../globals.dart' as globals;
import '../platform_plugins.dart';
import '../plugins.dart';
import '../project.dart';
import '../reporting/reporting.dart';
import '../version.dart';
import 'compiler_config.dart';
import 'file_generators/flutter_service_worker_js.dart';
@ -41,14 +40,12 @@ class WebBuilder {
required Logger logger,
required ProcessManager processManager,
required BuildSystem buildSystem,
required Usage usage,
required Analytics analytics,
required FlutterVersion flutterVersion,
required FileSystem fileSystem,
}) : _logger = logger,
_processManager = processManager,
_buildSystem = buildSystem,
_flutterUsage = usage,
_analytics = analytics,
_flutterVersion = flutterVersion,
_fileSystem = fileSystem;
@ -56,7 +53,6 @@ class WebBuilder {
final Logger _logger;
final ProcessManager _processManager;
final BuildSystem _buildSystem;
final Usage _flutterUsage;
final Analytics _analytics;
final FlutterVersion _flutterVersion;
final FileSystem _fileSystem;
@ -146,19 +142,12 @@ class WebBuilder {
final String buildSettingsString = _buildEventAnalyticsSettings(configs: compilerConfigs);
BuildEvent(
'web-compile',
type: 'web',
settings: buildSettingsString,
flutterUsage: _flutterUsage,
).send();
_analytics.send(
Event.flutterBuildInfo(label: 'web-compile', buildType: 'web', settings: buildSettingsString),
);
final Duration elapsedDuration = sw.elapsed;
final String variableName = compilerConfigs.length > 1 ? 'dual-compile' : 'dart2js';
_flutterUsage.sendTiming('build', variableName, elapsedDuration);
_analytics.send(
Event.timing(
workflow: 'build',

View File

@ -11,7 +11,6 @@ import '../base/net.dart';
import '../base/time.dart';
import '../device.dart';
import '../project.dart';
import '../reporting/reporting.dart';
import '../resident_runner.dart';
WebRunnerFactory? get webRunnerFactory => context.get<WebRunnerFactory>();
@ -31,7 +30,6 @@ abstract class WebRunnerFactory {
required Logger logger,
required FileSystem fileSystem,
required SystemClock systemClock,
required Usage usage,
required Analytics analytics,
bool machine = false,
});

View File

@ -205,7 +205,6 @@ Future<void> _runCmakeGeneration({
throwToolExit('Unable to generate build files');
}
final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'windows-cmake-generation', elapsedDuration);
globals.analytics.send(
Event.timing(
workflow: 'build',
@ -259,7 +258,6 @@ Future<void> _runBuild(
throwToolExit('Build process failed.');
}
final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'windows-cmake-build', elapsedDuration);
globals.analytics.send(
Event.timing(
workflow: 'build',

View File

@ -28,7 +28,6 @@ import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/macos/macos_ipad_device.dart';
import 'package:flutter_tools/src/mdns_discovery.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart';
import 'package:multicast_dns/multicast_dns.dart';
@ -179,7 +178,6 @@ void main() {
<String, List<SrvResourceRecord>>{},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},
@ -260,7 +258,6 @@ void main() {
<String, List<SrvResourceRecord>>{},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
Signals: () => FakeSignals(),
@ -356,7 +353,6 @@ void main() {
<String, List<SrvResourceRecord>>{},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
ProcessManager: () => FakeProcessManager.empty(),
@ -447,7 +443,6 @@ void main() {
},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},
@ -540,7 +535,6 @@ void main() {
},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},
@ -646,7 +640,6 @@ void main() {
},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},
@ -752,7 +745,6 @@ void main() {
},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},
@ -1016,7 +1008,6 @@ void main() {
<String, List<SrvResourceRecord>>{},
),
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
),
},

View File

@ -228,71 +228,38 @@ void main() {
);
testUsingContext(
'no-analytics flag flips usage flag and sends event',
'analytics flag enables/disables analytics',
() async {
final ConfigCommand configCommand = ConfigCommand();
final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand);
expect(testUsage.enabled, true);
expect(fakeAnalytics.telemetryEnabled, true);
await commandRunner.run(<String>['config', '--no-analytics']);
expect(testUsage.enabled, false);
// Verify that we flushed the analytics queue.
expect(testUsage.ensureAnalyticsSentCalls, 1);
// Verify that we only send the analytics disable event, and no other
// info.
expect(
testUsage.events,
equals(<TestUsageEvent>[const TestUsageEvent('analytics', 'enabled', label: 'false')]),
);
expect(testUsage.commands, isEmpty);
expect(testUsage.timings, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
},
overrides: <Type, Generator>{Usage: () => testUsage},
);
testUsingContext(
'analytics flag flips usage flag and sends event',
() async {
final ConfigCommand configCommand = ConfigCommand();
final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand);
expect(fakeAnalytics.telemetryEnabled, false);
await commandRunner.run(<String>['config', '--analytics']);
expect(testUsage.enabled, true);
// Verify that we only send the analytics enable event, and no other
// info.
expect(
testUsage.events,
equals(<TestUsageEvent>[const TestUsageEvent('analytics', 'enabled', label: 'true')]),
);
expect(testUsage.commands, isEmpty);
expect(testUsage.timings, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(fakeAnalytics.telemetryEnabled, true);
},
overrides: <Type, Generator>{Usage: () => testUsage},
overrides: <Type, Generator>{Analytics: () => fakeAnalytics},
);
testUsingContext('analytics reported with help usages', () async {
final ConfigCommand configCommand = ConfigCommand();
createTestCommandRunner(configCommand);
testUsage.suppressAnalytics = true;
await fakeAnalytics.setTelemetry(false);
expect(
configCommand.usage,
containsIgnoringWhitespace('Analytics reporting is currently disabled'),
);
testUsage.suppressAnalytics = false;
await fakeAnalytics.setTelemetry(true);
expect(
configCommand.usage,
containsIgnoringWhitespace('Analytics reporting is currently enabled'),
);
}, overrides: <Type, Generator>{Usage: () => testUsage});
}, overrides: <Type, Generator>{Analytics: () => fakeAnalytics});
});
}

View File

@ -1,455 +0,0 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:args/command_runner.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/android/android_studio.dart';
import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/config.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/process.dart';
import 'package:flutter_tools/src/base/time.dart';
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/commands/config.dart';
import 'package:flutter_tools/src/commands/doctor.dart';
import 'package:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/doctor_validator.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/version.dart';
import 'package:test/fake.dart';
import 'package:usage/usage_io.dart';
import '../src/common.dart';
import '../src/context.dart';
import '../src/fakes.dart';
import '../src/test_build_system.dart';
import '../src/test_flutter_command_runner.dart';
void main() {
setUpAll(() {
Cache.disableLocking();
});
group('analytics', () {
late Directory tempDir;
late Config testConfig;
late FileSystem fs;
const String flutterRoot = '/path/to/flutter';
setUp(() {
Cache.flutterRoot = flutterRoot;
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_analytics_test.');
testConfig = Config.test();
fs = MemoryFileSystem.test();
});
tearDown(() {
tryToDelete(tempDir);
});
// Ensure we don't send anything when analytics is disabled.
testUsingContext(
"doesn't send when disabled",
() async {
int count = 0;
globals.flutterUsage.onSend.listen((Map<String, dynamic> data) => count++);
final FlutterCommand command = FakeFlutterCommand();
final CommandRunner<void> runner = createTestCommandRunner(command);
globals.flutterUsage.enabled = false;
await runner.run(<String>['fake']);
expect(count, 0);
globals.flutterUsage.enabled = true;
await runner.run(<String>['fake']);
// LogToFileAnalytics isFirstRun is hardcoded to false
// so this usage will never act like the first run
// (which would not send usage).
expect(count, 4);
count = 0;
globals.flutterUsage.enabled = false;
await runner.run(<String>['fake']);
expect(count, 0);
},
overrides: <Type, Generator>{
FlutterVersion: () => FakeFlutterVersion(),
Usage:
() => Usage(
configDirOverride: tempDir.path,
logFile: tempDir.childFile('analytics.log').path,
runningOnBot: true,
),
},
);
// Ensure we don't send for the 'flutter config' command.
testUsingContext(
"config doesn't send",
() async {
int count = 0;
globals.flutterUsage.onSend.listen((Map<String, dynamic> data) => count++);
globals.flutterUsage.enabled = false;
final ConfigCommand command = ConfigCommand();
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['config']);
expect(count, 0);
globals.flutterUsage.enabled = true;
await runner.run(<String>['config']);
expect(count, 0);
},
overrides: <Type, Generator>{
FlutterVersion: () => FakeFlutterVersion(),
Usage:
() => Usage(
configDirOverride: tempDir.path,
logFile: tempDir.childFile('analytics.log').path,
runningOnBot: true,
),
},
);
testUsingContext(
'Usage records one feature in experiment setting',
() async {
testConfig.setValue(flutterWebFeature.configSetting!, true);
final Usage usage = Usage(runningOnBot: true);
usage.sendCommand('test');
final String featuresKey = CustomDimensionsEnum.enabledFlutterFeatures.cdKey;
expect(globals.fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web'));
},
overrides: <Type, Generator>{
FlutterVersion: () => FakeFlutterVersion(),
Config: () => testConfig,
Platform:
() => FakePlatform(environment: <String, String>{'FLUTTER_ANALYTICS_LOG_FILE': 'test'}),
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
},
);
testUsingContext(
'Usage records multiple features in experiment setting',
() async {
testConfig.setValue(flutterWebFeature.configSetting!, true);
testConfig.setValue(flutterLinuxDesktopFeature.configSetting!, true);
testConfig.setValue(flutterMacOSDesktopFeature.configSetting!, true);
final Usage usage = Usage(runningOnBot: true);
usage.sendCommand('test');
final String featuresKey = CustomDimensionsEnum.enabledFlutterFeatures.cdKey;
expect(
globals.fs.file('test').readAsStringSync(),
contains('$featuresKey: enable-web,enable-linux-desktop,enable-macos-desktop'),
);
},
overrides: <Type, Generator>{
FlutterVersion: () => FakeFlutterVersion(),
Config: () => testConfig,
Platform:
() => FakePlatform(environment: <String, String>{'FLUTTER_ANALYTICS_LOG_FILE': 'test'}),
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
},
);
});
group('analytics with fakes', () {
late MemoryFileSystem memoryFileSystem;
late FakeStdio fakeStdio;
late TestUsage testUsage;
late FakeClock fakeClock;
late FakeDoctor doctor;
late FakeAndroidStudio androidStudio;
late ProcessManager processManager;
late BufferLogger logger;
late ProcessUtils processUtils;
setUp(() {
memoryFileSystem = MemoryFileSystem.test();
fakeStdio = FakeStdio();
testUsage = TestUsage();
fakeClock = FakeClock();
doctor = FakeDoctor();
androidStudio = FakeAndroidStudio();
processManager = FakeProcessManager.empty();
logger = BufferLogger.test();
processUtils = ProcessUtils(logger: logger, processManager: processManager);
});
testUsingContext(
'flutter commands send timing events',
() async {
fakeClock.times = <int>[1000, 2000];
doctor.diagnoseSucceeds = true;
final DoctorCommand command = DoctorCommand();
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['doctor']);
expect(
testUsage.timings,
contains(
const TestTimingEvent(
'flutter',
'doctor',
Duration(milliseconds: 1000),
label: 'success',
),
),
);
},
overrides: <Type, Generator>{
AndroidStudio: () => androidStudio,
SystemClock: () => fakeClock,
Doctor: () => doctor,
Usage: () => testUsage,
},
);
testUsingContext(
'doctor fail sends warning',
() async {
fakeClock.times = <int>[1000, 2000];
doctor.diagnoseSucceeds = false;
final DoctorCommand command = DoctorCommand();
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['doctor']);
expect(
testUsage.timings,
contains(
const TestTimingEvent(
'flutter',
'doctor',
Duration(milliseconds: 1000),
label: 'warning',
),
),
);
},
overrides: <Type, Generator>{
AndroidStudio: () => androidStudio,
SystemClock: () => fakeClock,
Doctor: () => doctor,
Usage: () => testUsage,
},
);
testUsingContext('single command usage path', () async {
final FlutterCommand doctorCommand = DoctorCommand();
expect(await doctorCommand.usagePath, 'doctor');
}, overrides: <Type, Generator>{Usage: () => testUsage});
testUsingContext('compound command usage path', () async {
final BuildCommand buildCommand = BuildCommand(
artifacts: Artifacts.test(fileSystem: memoryFileSystem),
androidSdk: FakeAndroidSdk(),
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
fileSystem: memoryFileSystem,
logger: logger,
processUtils: processUtils,
osUtils: FakeOperatingSystemUtils(),
);
final FlutterCommand buildApkCommand = buildCommand.subcommands['apk']! as FlutterCommand;
expect(await buildApkCommand.usagePath, 'build/apk');
});
testUsingContext(
'command sends localtime',
() async {
const int kMillis = 1000;
fakeClock.times = <int>[kMillis];
// Since FLUTTER_ANALYTICS_LOG_FILE is set in the environment, analytics
// will be written to a file.
final Usage usage = Usage(versionOverride: 'test', runningOnBot: true);
usage.suppressAnalytics = false;
usage.enabled = true;
usage.sendCommand('test');
final String log = globals.fs.file('analytics.log').readAsStringSync();
final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(kMillis);
expect(log.contains(formatDateTime(dateTime)), isTrue);
},
overrides: <Type, Generator>{
FileSystem: () => memoryFileSystem,
ProcessManager: () => processManager,
SystemClock: () => fakeClock,
Platform:
() => FakePlatform(
environment: <String, String>{'FLUTTER_ANALYTICS_LOG_FILE': 'analytics.log'},
),
Stdio: () => fakeStdio,
},
);
testUsingContext(
'event sends localtime',
() async {
const int kMillis = 1000;
fakeClock.times = <int>[kMillis];
// Since FLUTTER_ANALYTICS_LOG_FILE is set in the environment, analytics
// will be written to a file.
final Usage usage = Usage(versionOverride: 'test', runningOnBot: true);
usage.suppressAnalytics = false;
usage.enabled = true;
usage.sendEvent('test', 'test');
final String log = globals.fs.file('analytics.log').readAsStringSync();
final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(kMillis);
expect(log.contains(formatDateTime(dateTime)), isTrue);
},
overrides: <Type, Generator>{
FileSystem: () => memoryFileSystem,
ProcessManager: () => processManager,
SystemClock: () => fakeClock,
Platform:
() => FakePlatform(
environment: <String, String>{'FLUTTER_ANALYTICS_LOG_FILE': 'analytics.log'},
),
Stdio: () => fakeStdio,
},
);
});
group('analytics bots', () {
late Directory tempDir;
setUp(() {
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_analytics_bots_test.');
});
tearDown(() {
tryToDelete(tempDir);
});
testUsingContext(
"don't send on bots with unknown version",
() async {
int count = 0;
globals.flutterUsage.onSend.listen((Map<String, dynamic> data) => count++);
await createTestCommandRunner().run(<String>['--version']);
expect(count, 0);
},
overrides: <Type, Generator>{
Usage:
() => Usage(
settingsName: 'flutter_bot_test',
versionOverride: 'dev/unknown',
configDirOverride: tempDir.path,
runningOnBot: false,
),
},
);
testUsingContext(
"don't send on bots even when opted in",
() async {
int count = 0;
globals.flutterUsage.onSend.listen((Map<String, dynamic> data) => count++);
globals.flutterUsage.enabled = true;
await createTestCommandRunner().run(<String>['--version']);
expect(count, 0);
},
overrides: <Type, Generator>{
Usage:
() => Usage(
settingsName: 'flutter_bot_test',
versionOverride: 'dev/unknown',
configDirOverride: tempDir.path,
runningOnBot: false,
),
},
);
testUsingContext('Uses AnalyticsMock when .flutter cannot be created', () async {
final Usage usage = Usage(
settingsName: 'flutter_bot_test',
versionOverride: 'dev/known',
configDirOverride: tempDir.path,
analyticsIOFactory: throwingAnalyticsIOFactory,
runningOnBot: false,
);
final AnalyticsMock analyticsMock = AnalyticsMock();
expect(usage.clientId, analyticsMock.clientId);
expect(usage.suppressAnalytics, isTrue);
});
});
}
Analytics throwingAnalyticsIOFactory(
String trackingId,
String applicationName,
String applicationVersion, {
String? analyticsUrl,
Directory? documentDirectory,
}) {
throw const FileSystemException('Could not create file');
}
class FakeFlutterCommand extends FlutterCommand {
@override
String get description => 'A fake command';
@override
String get name => 'fake';
@override
Future<FlutterCommandResult> runCommand() async {
return FlutterCommandResult.success();
}
}
class FakeDoctor extends Fake implements Doctor {
bool diagnoseSucceeds = false;
@override
Future<bool> diagnose({
bool androidLicenses = false,
bool verbose = true,
bool showColor = true,
AndroidLicenseValidator? androidLicenseValidator,
bool showPii = true,
List<ValidatorTask>? startedValidatorTasks,
bool sendEvent = true,
FlutterVersion? version,
}) async {
return diagnoseSucceeds;
}
}
class FakeClock extends Fake implements SystemClock {
List<int> times = <int>[];
@override
DateTime now() {
return DateTime.fromMillisecondsSinceEpoch(times.removeAt(0));
}
}

View File

@ -488,7 +488,6 @@ void main() {
String? sdkName,
bool? emulator,
String? reason,
Usage usage,
Analytics? analytics,
) async {
firstReloadDetails['finalLibraryCount'] = 2;

View File

@ -13,7 +13,6 @@ import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/ios/xcode_build_settings.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:unified_analytics/unified_analytics.dart';
import '../../src/common.dart';
@ -61,7 +60,6 @@ void main() {
fileSystem: fileSystem,
platform: platform,
processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(),
);
});
@ -181,7 +179,6 @@ void main() {
fileSystem: fileSystem,
platform: platform,
processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(),
);
fileSystem.file(xcodebuild).deleteSync();
@ -568,7 +565,6 @@ void main() {
fileSystem: fileSystem,
platform: platform,
processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -598,7 +594,6 @@ void main() {
fileSystem: fileSystem,
platform: platform,
processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -631,7 +626,6 @@ void main() {
fileSystem: fileSystem,
platform: platform,
processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(),
);

View File

@ -15,7 +15,6 @@ import 'package:flutter_tools/src/flutter_plugins.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/macos/cocoapods.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
@ -32,7 +31,6 @@ void main() {
late FakeProcessManager fakeProcessManager;
late CocoaPods cocoaPodsUnderTest;
late BufferLogger logger;
late TestUsage usage;
late FakeAnalytics fakeAnalytics;
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
@ -74,7 +72,6 @@ void main() {
fileSystem = MemoryFileSystem.test();
fakeProcessManager = FakeProcessManager.empty();
logger = BufferLogger.test();
usage = TestUsage();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -85,7 +82,6 @@ void main() {
logger: logger,
platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(),
usage: usage,
analytics: fakeAnalytics,
);
fileSystem.file(
@ -227,7 +223,6 @@ void main() {
logger: logger,
platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: fakeXcodeProjectInterpreter,
usage: usage,
analytics: fakeAnalytics,
);
@ -269,7 +264,6 @@ void main() {
logger: logger,
platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(isInstalled: false),
usage: usage,
analytics: fakeAnalytics,
);
@ -1261,7 +1255,6 @@ end''');
);
expect(logger.errorText, contains('set up CocoaPods for ARM macOS'));
expect(logger.errorText, contains('enable-libffi-alloc'));
expect(usage.events, contains(const TestUsageEvent('pod-install-failure', 'arm-ffi')));
expect(
fakeAnalytics.sentEvents,
contains(
@ -1487,7 +1480,6 @@ end''');
processManager: fakeProcessManager,
version: Version(14, 3, 0),
),
usage: usage,
analytics: fakeAnalytics,
);

View File

@ -12,7 +12,6 @@ import 'package:flutter_tools/src/macos/migrations/nsapplicationmain_deprecation
import 'package:flutter_tools/src/macos/migrations/remove_macos_framework_link_and_embedding_migration.dart';
import 'package:flutter_tools/src/macos/migrations/secure_restorable_state_migration.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
@ -22,7 +21,6 @@ import '../../src/fakes.dart';
void main() {
group('remove link and embed migration', () {
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics;
late MemoryFileSystem memoryFileSystem;
late BufferLogger testLogger;
@ -30,7 +28,6 @@ void main() {
late File xcodeProjectInfoFile;
setUp(() {
testUsage = TestUsage();
memoryFileSystem = MemoryFileSystem.test();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: memoryFileSystem,
@ -44,14 +41,8 @@ void main() {
testWithoutContext('skipped if files are missing', () async {
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.existsSync(), isFalse);
@ -69,14 +60,8 @@ void main() {
final DateTime projectLastModified = xcodeProjectInfoFile.lastModifiedSync();
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.lastModifiedSync(), projectLastModified);
@ -92,12 +77,7 @@ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.
xcodeProjectInfoFile.writeAsStringSync(contents);
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
await macosProjectMigration.migrate();
expect(xcodeProjectInfoFile.readAsStringSync(), contents);
expect(testLogger.statusText, isEmpty);
@ -116,14 +96,8 @@ keep this 2
''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.readAsStringSync(), r'''
@ -140,21 +114,12 @@ keep this 2
''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
expect(
macosProjectMigration.migrate,
throwsToolExit(message: 'Your Xcode project requires migration'),
);
expect(
testUsage.events,
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -173,20 +138,11 @@ keep this 2
''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
expect(
macosProjectMigration.migrate,
throwsToolExit(message: 'Your Xcode project requires migration'),
);
expect(
testUsage.events,
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
);
expect(
fakeAnalytics.sentEvents,
contains(

View File

@ -13,7 +13,6 @@ import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/mdns_discovery.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:multicast_dns/multicast_dns.dart';
import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
@ -57,7 +56,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -88,7 +86,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -117,7 +114,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -141,7 +137,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -169,7 +164,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -181,7 +175,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -202,7 +195,6 @@ void main() {
mdnsClient: emptyClient,
preliminaryMDnsClient: emptyClient,
logger: logger,
flutterUsage: TestUsage(),
analytics: fakeAnalytics,
);
final Uri? uri = await portDiscovery.getVMServiceUriForAttach('', FakeIOSDevice());
@ -229,7 +221,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final int? port = (await portDiscovery.queryForAttach())?.port;
@ -253,7 +244,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.queryForAttach();
@ -281,7 +271,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final int? port = (await portDiscovery.queryForAttach(applicationId: 'fiz'))?.port;
@ -310,7 +299,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final int? port = (await portDiscovery.queryForAttach(applicationId: 'bar'))?.port;
@ -328,7 +316,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(() async => portDiscovery.queryForAttach(), throwsException);
@ -349,7 +336,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -387,7 +373,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -425,7 +410,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -483,7 +467,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(
@ -516,7 +499,6 @@ void main() {
mdnsClient: client,
preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(
@ -536,7 +518,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -555,7 +536,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -578,7 +558,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -602,7 +581,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(
@ -627,7 +605,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -665,7 +642,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -702,7 +678,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -740,7 +715,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -778,7 +752,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -836,7 +809,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(
@ -872,7 +844,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -906,7 +877,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(
@ -922,7 +892,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
@ -933,7 +902,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
expect(portDiscovery.deviceNameMatchesTargetName('My phone', 'My-Phone-2.local'), isFalse);
@ -986,7 +954,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1048,7 +1015,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1087,7 +1053,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1132,7 +1097,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1179,7 +1143,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client,
logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(),
);
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(

View File

@ -313,21 +313,6 @@ void main() {
final OperationResult result = await residentRunner.restart();
expect(result.fatal, true);
expect(result.code, 1);
expect(
(globals.flutterUsage as TestUsage).events,
contains(
TestUsageEvent(
'hot',
'exception',
parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
),
),
),
);
expect(
(globals.analytics as FakeAnalytics).sentEvents,
contains(
@ -398,21 +383,6 @@ void main() {
contains('Unable to hot reload application due to an unrecoverable error'),
);
expect(
(globals.flutterUsage as TestUsage).events,
contains(
TestUsageEvent(
'hot',
'reload-barred',
parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
),
),
),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -467,21 +437,6 @@ void main() {
expect(result.fatal, true);
expect(result.code, 1);
expect(
(globals.flutterUsage as TestUsage).events,
contains(
TestUsageEvent(
'hot',
'exception',
parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: false,
),
),
),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -725,19 +680,11 @@ void main() {
expect(result.fatal, false);
expect(result.code, 0);
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
expect(event.category, 'hot');
expect(event.parameter, 'reload');
final Event event = fakeAnalytics.sentEvents.first;
expect(event.eventName.label, 'hot_runner_info');
expect(event.eventData['label'], 'reload');
expect(
event.parameters?.hotEventTargetPlatform,
getNameForTargetPlatform(TargetPlatform.android_arm),
);
final Event newEvent = fakeAnalytics.sentEvents.first;
expect(newEvent.eventName.label, 'hot_runner_info');
expect(newEvent.eventData['label'], 'reload');
expect(
newEvent.eventData['targetPlatform'],
event.eventData['targetPlatform'],
getNameForTargetPlatform(TargetPlatform.android_arm),
);
}, overrides: <Type, Generator>{Usage: () => TestUsage()}),
@ -876,24 +823,14 @@ void main() {
expect(result.fatal, false);
expect(result.code, 0);
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
expect(event.category, 'hot');
expect(event.parameter, 'restart');
expect(
event.parameters?.hotEventTargetPlatform,
getNameForTargetPlatform(TargetPlatform.android_arm),
);
expect(fakeVmServiceHost?.hasRemainingExpectations, false);
// Parse out the event of interest since we may have timing events with
// the new analytics package
final List<Event> newEventList =
final List<Event> hotRunnerInfoEvents =
fakeAnalytics.sentEvents
.where((Event e) => e.eventName.label == 'hot_runner_info')
.toList();
expect(newEventList, hasLength(1));
final Event newEvent = newEventList.first;
expect(newEvent.eventName.label, 'hot_runner_info');
expect(hotRunnerInfoEvents, hasLength(1));
final Event newEvent = hotRunnerInfoEvents.first;
expect(newEvent.eventData['label'], 'restart');
expect(
newEvent.eventData['targetPlatform'],
@ -1092,21 +1029,6 @@ void main() {
expect(result.fatal, true);
expect(result.code, 1);
expect(
(globals.flutterUsage as TestUsage).events,
contains(
TestUsageEvent(
'hot',
'exception',
parameters: CustomDimensions(
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
hotEventSdkName: 'Android',
hotEventEmulator: false,
hotEventFullRestart: true,
),
),
),
);
expect(
fakeAnalytics.sentEvents,
contains(

View File

@ -18,7 +18,6 @@ import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/isolated/devfs_web.dart';
import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/vmservice.dart';
import 'package:test/fake.dart';
@ -64,7 +63,6 @@ void main() {
fileSystem: fileSystem,
logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -99,7 +97,6 @@ void main() {
fileSystem: fileSystem,
logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -130,7 +127,6 @@ void main() {
fileSystem: fileSystem,
logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -160,7 +156,6 @@ void main() {
fileSystem: fileSystem,
logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -194,7 +189,6 @@ void main() {
fileSystem: fileSystem,
logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),

View File

@ -27,7 +27,6 @@ import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/devfs_web.dart';
import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_devtools_handler.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/vmservice.dart';
@ -89,7 +88,6 @@ void main() {
late FakeVmServiceHost fakeVmServiceHost;
late MemoryFileSystem fileSystem;
late ProcessManager processManager;
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics;
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
@ -99,7 +97,6 @@ void main() {
}
setUp(() {
testUsage = TestUsage();
fileSystem = MemoryFileSystem.test();
processManager = FakeProcessManager.any();
debugConnection = FakeDebugConnection();
@ -146,7 +143,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
);
@ -176,7 +172,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
);
@ -198,7 +193,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
);
@ -210,7 +204,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
);
@ -350,7 +343,6 @@ void main() {
stayResident: false,
fileSystem: fileSystem,
logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -379,7 +371,6 @@ void main() {
stayResident: false,
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -595,7 +586,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -674,21 +664,6 @@ void main() {
expect(result.code, 0);
expect(webDevFS.mainUri.toString(), contains('entrypoint.dart'));
// ensure that analytics are sent.
expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent(
'hot',
'restart',
parameters: CustomDimensions.fromMap(<String, String>{
'cd27': 'web-javascript',
'cd28': '',
'cd29': 'false',
'cd30': 'true',
'cd13': '0',
'cd48': 'false',
}),
),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -702,9 +677,6 @@ void main() {
),
),
);
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -717,7 +689,6 @@ void main() {
);
},
overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
@ -781,21 +752,6 @@ void main() {
expect(logger.statusText, contains('Restarted application in'));
expect(result.code, 0);
// ensure that analytics are sent.
expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent(
'hot',
'restart',
parameters: CustomDimensions.fromMap(<String, String>{
'cd27': 'web-javascript',
'cd28': '',
'cd29': 'false',
'cd30': 'true',
'cd13': '0',
'cd48': 'false',
}),
),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -809,9 +765,6 @@ void main() {
),
),
);
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -824,7 +777,6 @@ void main() {
);
},
overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
@ -857,12 +809,9 @@ void main() {
expect(result.code, 0);
// web-server device does not send restart analytics
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
},
overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
@ -898,12 +847,9 @@ void main() {
unawaited(residentWebRunner.run(connectionInfoCompleter: connectionInfoCompleter));
expect(await residentWebRunner.run(), 1);
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
},
overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
@ -969,12 +915,9 @@ void main() {
expect(result.code, 1);
expect(result.message, contains('Failed to recompile application.'));
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
},
overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
@ -1187,7 +1130,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem,
logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -1233,7 +1175,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem,
logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -1276,7 +1217,6 @@ void main() {
stayResident: false,
fileSystem: fileSystem,
logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler,
@ -1568,7 +1508,6 @@ ResidentRunner setUpResidentRunner(
flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory),
debuggingOptions: debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug),
usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: systemClock ?? SystemClock.fixed(DateTime.now()),
fileSystem: globals.fs,

View File

@ -8,7 +8,6 @@ import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/compile.dart';
import 'package:flutter_tools/src/devfs.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_devtools_handler.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart';
@ -32,7 +31,6 @@ void main() {
'flutter-sdk',
false,
'test-reason',
TestUsage(),
const NoOpAnalytics(),
);
});

View File

@ -10,7 +10,6 @@ import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
@ -30,7 +29,6 @@ void main() {
group('FlutterCommandRunner', () {
late MemoryFileSystem fileSystem;
late Platform platform;
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics;
setUpAll(() {
@ -42,7 +40,6 @@ void main() {
fileSystem.directory(_kFlutterRoot).createSync(recursive: true);
fileSystem.directory(_kProjectRoot).createSync(recursive: true);
fileSystem.currentDirectory = _kProjectRoot;
testUsage = TestUsage();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
@ -210,7 +207,6 @@ void main() {
await runner.run(<String>['--version']);
expect(version.didFetchTagsAndUpdate, true);
expect(testUsage.commands, contains(const TestUsageCommand('version')));
expect(
fakeAnalytics.sentEvents,
contains(
@ -228,7 +224,6 @@ void main() {
Platform: () => platform,
FlutterVersion: () => FakeFlutterVersion(),
OutputPreferences: () => OutputPreferences.test(),
Usage: () => testUsage,
Analytics: () => fakeAnalytics,
},
);

View File

@ -19,14 +19,11 @@ import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/run.dart';
import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/pre_run_validator.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:meta/meta.dart';
import 'package:test/fake.dart';
import 'package:unified_analytics/testing.dart';
import 'package:unified_analytics/unified_analytics.dart';
@ -34,21 +31,13 @@ import 'package:unified_analytics/unified_analytics.dart';
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/fake_devices.dart';
import '../../src/fake_pub_deps.dart';
import '../../src/fakes.dart';
import '../../src/test_flutter_command_runner.dart';
import 'utils.dart';
void main() {
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
// See https://github.com/flutter/flutter/issues/160257 for details.
FeatureFlags enableExplicitPackageDependencies() {
return TestFeatureFlags(isExplicitPackageDependenciesEnabled: true);
}
group('Flutter Command', () {
late FakeCache cache;
late TestUsage usage;
late FakeAnalytics fakeAnalytics;
late FakeClock clock;
late FakeProcessInfo processInfo;
@ -66,7 +55,6 @@ void main() {
setUp(() {
Cache.disableLocking();
cache = FakeCache();
usage = TestUsage();
clock = FakeClock();
processInfo = FakeProcessInfo();
processInfo.maxRss = 10;
@ -237,6 +225,7 @@ void main() {
},
);
@isTest
void testUsingCommandContext(String testName, dynamic Function() testBody) {
testUsingContext(
testName,
@ -246,7 +235,6 @@ void main() {
ProcessInfo: () => processInfo,
ProcessManager: () => processManager,
SystemClock: () => clock,
Usage: () => usage,
Analytics: () => fakeAnalytics,
},
);
@ -263,10 +251,6 @@ void main() {
);
await flutterCommand.run();
expect(usage.events, <TestUsageEvent>[
const TestUsageEvent('tool-command-result', 'dummy', label: 'success'),
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'success', value: 10),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -291,10 +275,6 @@ void main() {
);
await flutterCommand.run();
expect(usage.events, <TestUsageEvent>[
const TestUsageEvent('tool-command-result', 'dummy', label: 'warning'),
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'warning', value: 10),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -318,10 +298,6 @@ void main() {
},
);
await expectLater(() => flutterCommand.run(), throwsToolExit());
expect(usage.events, <TestUsageEvent>[
const TestUsageEvent('tool-command-result', 'dummy', label: 'fail'),
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'fail', value: 10),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -430,10 +406,6 @@ void main() {
signalController.add(mockSignal);
await completer.future;
expect(usage.events, <TestUsageEvent>[
const TestUsageEvent('tool-command-result', 'dummy', label: 'killed'),
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'killed', value: 10),
]);
expect(
fakeAnalytics.sentEvents,
contains(
@ -456,7 +428,6 @@ void main() {
exitSignals: <ProcessSignal>[signalUnderTest],
),
SystemClock: () => clock,
Usage: () => usage,
Analytics: () => fakeAnalytics,
},
);
@ -499,7 +470,6 @@ void main() {
subForSigTerm: signalUnderTest,
exitSignals: <ProcessSignal>[signalUnderTest],
),
Usage: () => usage,
},
);
});
@ -511,12 +481,6 @@ void main() {
final DummyFlutterCommand flutterCommand = DummyFlutterCommand();
await flutterCommand.run();
expect(
usage.timings,
contains(
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -537,8 +501,6 @@ void main() {
final DummyFlutterCommand flutterCommand = DummyFlutterCommand(noUsagePath: true);
await flutterCommand.run();
expect(usage.timings, isEmpty);
// Iterate through and count all the [Event.timing] instances
int timingEventCounts = 0;
for (final Event e in fakeAnalytics.sentEvents) {
if (e.eventName == DashEvent.timing) {
@ -570,17 +532,6 @@ void main() {
);
await flutterCommand.run();
expect(
usage.timings,
contains(
const TestTimingEvent(
'flutter',
'dummy',
Duration(milliseconds: 500),
label: 'success-blah1-blah2-blah3',
),
),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -605,12 +556,6 @@ void main() {
);
await expectLater(() => flutterCommand.run(), throwsToolExit());
expect(
usage.timings,
contains(
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
),
);
expect(
fakeAnalytics.sentEvents,
contains(
@ -624,66 +569,6 @@ void main() {
);
});
testUsingContext(
'reports null safety analytics when reportNullSafety is true',
() async {
globals.fs.file('lib/main.dart')
..createSync(recursive: true)
..writeAsStringSync('// @dart=2.12');
globals.fs.file('pubspec.yaml').writeAsStringSync('name: example\n');
globals.fs.file('.dart_tool/package_config.json')
..createSync(recursive: true)
..writeAsStringSync(r'''
{
"configVersion": 2,
"packages": [
{
"name": "example",
"rootUri": "../",
"packageUri": "lib/",
"languageVersion": "2.12"
}
],
"generated": "2020-12-02T19:30:53.862346Z",
"generator": "pub",
"generatorVersion": "2.12.0-76.0.dev"
}
''');
final FakeReportingNullSafetyCommand command = FakeReportingNullSafetyCommand();
final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['test']);
expect(
usage.events,
containsAll(<TestUsageEvent>[
const TestUsageEvent(
NullSafetyAnalysisEvent.kNullSafetyCategory,
'runtime-mode',
label: 'NullSafetyMode.sound',
),
TestUsageEvent(
NullSafetyAnalysisEvent.kNullSafetyCategory,
'stats',
parameters: CustomDimensions.fromMap(<String, String>{'cd49': '1', 'cd50': '1'}),
),
const TestUsageEvent(
NullSafetyAnalysisEvent.kNullSafetyCategory,
'language-version',
label: '2.12',
),
]),
);
},
overrides: <Type, Generator>{
Pub: () => FakePub(),
Usage: () => usage,
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(),
FeatureFlags: enableExplicitPackageDependencies,
},
);
testUsingContext(
'use packagesPath to generate BuildInfo',
() async {
@ -1518,32 +1403,6 @@ class FakeTargetCommand extends FlutterCommand {
String get name => 'test';
}
class FakeReportingNullSafetyCommand extends FlutterCommand {
FakeReportingNullSafetyCommand() {
argParser.addFlag('debug');
argParser.addFlag('release');
argParser.addFlag('jit-release');
argParser.addFlag('profile');
}
@override
String get description => 'test';
@override
String get name => 'test';
@override
bool get shouldRunPub => true;
@override
bool get reportNullSafety => true;
@override
Future<FlutterCommandResult> runCommand() async {
return FlutterCommandResult.success();
}
}
class FakeDdsCommand extends FlutterCommand {
FakeDdsCommand() {
addDdsOptions(verboseHelp: false);
@ -1617,25 +1476,6 @@ class FakeClock extends Fake implements SystemClock {
}
}
class FakePub extends Fake implements Pub {
@override
Future<void> get({
required PubContext context,
required FlutterProject project,
bool upgrade = false,
bool offline = false,
String? flutterRootOverride,
bool checkUpToDate = false,
bool shouldSkipThirdPartyGenerator = true,
PubOutputMode outputMode = PubOutputMode.all,
}) async {}
@override
Future<Map<String, Object?>> deps(FlutterProject project) {
return FakePubWithPrimedDeps().deps(project);
}
}
class _TestDeviceManager extends DeviceManager {
_TestDeviceManager({required super.logger});
List<Device> devices = <Device>[];

View File

@ -80,7 +80,6 @@ void main() {
logger: logger,
processManager: FakeProcessManager.any(),
buildSystem: buildSystem,
usage: testUsage,
flutterVersion: flutterVersion,
fileSystem: fileSystem,
analytics: fakeAnalytics,
@ -104,22 +103,6 @@ void main() {
// Runs ScrubGeneratedPluginRegistrant migrator.
expect(logger.traceText, contains('generated_plugin_registrant.dart not found. Skipping.'));
// Sends build config event
expect(
testUsage.events,
unorderedEquals(<TestUsageEvent>[
const TestUsageEvent(
'build',
'web',
label: 'web-compile',
parameters: CustomDimensions(
buildEventSettings:
'optimizationLevel: 0; web-renderer: skwasm,canvaskit; web-target: wasm,js;',
),
),
]),
);
expect(
fakeAnalytics.sentEvents,
containsAll(<Event>[
@ -131,10 +114,6 @@ void main() {
]),
);
// Sends timing event.
final TestTimingEvent timingEvent = testUsage.timings.single;
expect(timingEvent.category, 'build');
expect(timingEvent.variableName, 'dual-compile');
expect(
analyticsTimingEventExists(
sentEvents: fakeAnalytics.sentEvents,
@ -171,7 +150,6 @@ void main() {
logger: logger,
processManager: FakeProcessManager.any(),
buildSystem: buildSystem,
usage: testUsage,
flutterVersion: flutterVersion,
fileSystem: fileSystem,
analytics: fakeAnalytics,