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, buildSystem: globals.buildSystem,
fileSystem: globals.fs, fileSystem: globals.fs,
flutterVersion: globals.flutterVersion, flutterVersion: globals.flutterVersion,
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
); );
await webBuilder.buildWeb( await webBuilder.buildWeb(

View File

@ -9,7 +9,6 @@ import '../base/common.dart';
import '../convert.dart'; import '../convert.dart';
import '../features.dart'; import '../features.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
import '../reporting/reporting.dart';
import '../runner/flutter_command.dart'; import '../runner/flutter_command.dart';
import '../runner/flutter_command_runner.dart'; import '../runner/flutter_command_runner.dart';
@ -137,22 +136,8 @@ class ConfigCommand extends FlutterCommand {
if (argResults!.wasParsed('analytics')) { if (argResults!.wasParsed('analytics')) {
final bool value = boolArg('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'}.'); 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); await globals.analytics.setTelemetry(value);
} }
@ -273,9 +258,7 @@ class ConfigCommand extends FlutterCommand {
/// List the status of the analytics reporting. /// List the status of the analytics reporting.
String get analyticsUsage { String get analyticsUsage {
final bool analyticsEnabled = return 'Analytics reporting is currently ${globals.analytics.telemetryEnabled ? 'enabled' : 'disabled'}.';
globals.flutterUsage.enabled && !globals.flutterUsage.suppressAnalytics;
return 'Analytics reporting is currently ${analyticsEnabled ? 'enabled' : 'disabled'}.';
} }
/// Raising the reload tip for setting changes. /// Raising the reload tip for setting changes.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -22,7 +22,6 @@ import '../ios/xcodeproj.dart';
import '../migrations/cocoapods_script_symlink.dart'; import '../migrations/cocoapods_script_symlink.dart';
import '../migrations/cocoapods_toolchain_directory_migration.dart'; import '../migrations/cocoapods_toolchain_directory_migration.dart';
import '../project.dart'; import '../project.dart';
import '../reporting/reporting.dart';
const String noCocoaPodsConsequence = ''' const String noCocoaPodsConsequence = '''
CocoaPods is a package manager for iOS or macOS platform code. CocoaPods is a package manager for iOS or macOS platform code.
@ -100,13 +99,11 @@ class CocoaPods {
required XcodeProjectInterpreter xcodeProjectInterpreter, required XcodeProjectInterpreter xcodeProjectInterpreter,
required Logger logger, required Logger logger,
required Platform platform, required Platform platform,
required Usage usage,
required Analytics analytics, required Analytics analytics,
}) : _fileSystem = fileSystem, }) : _fileSystem = fileSystem,
_processManager = processManager, _processManager = processManager,
_xcodeProjectInterpreter = xcodeProjectInterpreter, _xcodeProjectInterpreter = xcodeProjectInterpreter,
_logger = logger, _logger = logger,
_usage = usage,
_analytics = analytics, _analytics = analytics,
_processUtils = ProcessUtils(processManager: processManager, logger: logger), _processUtils = ProcessUtils(processManager: processManager, logger: logger),
_operatingSystemUtils = OperatingSystemUtils( _operatingSystemUtils = OperatingSystemUtils(
@ -122,7 +119,6 @@ class CocoaPods {
final OperatingSystemUtils _operatingSystemUtils; final OperatingSystemUtils _operatingSystemUtils;
final XcodeProjectInterpreter _xcodeProjectInterpreter; final XcodeProjectInterpreter _xcodeProjectInterpreter;
final Logger _logger; final Logger _logger;
final Usage _usage;
final Analytics _analytics; final Analytics _analytics;
Future<String?>? _versionText; Future<String?>? _versionText;
@ -403,7 +399,6 @@ class CocoaPods {
} else if ((_isFfiX86Error(stdout) || _isFfiX86Error(stderr)) && } else if ((_isFfiX86Error(stdout) || _isFfiX86Error(stderr)) &&
_operatingSystemUtils.hostPlatform == HostPlatform.darwin_arm64) { _operatingSystemUtils.hostPlatform == HostPlatform.darwin_arm64) {
// https://github.com/flutter/flutter/issues/70796 // 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')); _analytics.send(Event.appleUsageEvent(workflow: 'pod-install-failure', parameter: 'arm-ffi'));
_logger.printError( _logger.printError(
'Error: To set up CocoaPods for ARM macOS, run:\n' '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/common.dart';
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../reporting/reporting.dart';
import '../../xcode_project.dart'; import '../../xcode_project.dart';
// Remove the linking and embedding logic from the Xcode project to give the tool more control over these. // 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( RemoveMacOSFrameworkLinkAndEmbeddingMigration(
MacOSProject project, MacOSProject project,
super.logger, super.logger,
Usage usage,
Analytics analytics, Analytics analytics,
) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile, ) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile,
_usage = usage,
_analytics = analytics; _analytics = analytics;
final File _xcodeProjectInfoFile; final File _xcodeProjectInfoFile;
final Usage _usage;
final Analytics _analytics; final Analytics _analytics;
@override @override
@ -91,12 +87,6 @@ class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
} }
if (line.contains('/* App.framework ') || line.contains('/* FlutterMacOS.framework ')) { if (line.contains('/* App.framework ') || line.contains('/* FlutterMacOS.framework ')) {
UsageEvent(
'macos-migration',
'remove-frameworks',
label: 'failure',
flutterUsage: _usage,
).send();
_analytics.send( _analytics.send(
Event.appleUsageEvent( Event.appleUsageEvent(
workflow: 'macos-migration', workflow: 'macos-migration',

View File

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

View File

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

View File

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

View File

@ -1805,14 +1805,6 @@ abstract class FlutterCommand extends Command<void> {
final Duration elapsedDuration = (commandResult.endTimeOverride ?? endTime).difference( final Duration elapsedDuration = (commandResult.endTimeOverride ?? endTime).difference(
startTime, 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( analytics.send(
Event.timing( Event.timing(
workflow: 'flutter', workflow: 'flutter',

View File

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

View File

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

View File

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

View File

@ -205,7 +205,6 @@ Future<void> _runCmakeGeneration({
throwToolExit('Unable to generate build files'); throwToolExit('Unable to generate build files');
} }
final Duration elapsedDuration = sw.elapsed; final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'windows-cmake-generation', elapsedDuration);
globals.analytics.send( globals.analytics.send(
Event.timing( Event.timing(
workflow: 'build', workflow: 'build',
@ -259,7 +258,6 @@ Future<void> _runBuild(
throwToolExit('Build process failed.'); throwToolExit('Build process failed.');
} }
final Duration elapsedDuration = sw.elapsed; final Duration elapsedDuration = sw.elapsed;
globals.flutterUsage.sendTiming('build', 'windows-cmake-build', elapsedDuration);
globals.analytics.send( globals.analytics.send(
Event.timing( Event.timing(
workflow: 'build', 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/macos/macos_ipad_device.dart';
import 'package:flutter_tools/src/mdns_discovery.dart'; import 'package:flutter_tools/src/mdns_discovery.dart';
import 'package:flutter_tools/src/project.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/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/run_hot.dart';
import 'package:multicast_dns/multicast_dns.dart'; import 'package:multicast_dns/multicast_dns.dart';
@ -179,7 +178,6 @@ void main() {
<String, List<SrvResourceRecord>>{}, <String, List<SrvResourceRecord>>{},
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },
@ -260,7 +258,6 @@ void main() {
<String, List<SrvResourceRecord>>{}, <String, List<SrvResourceRecord>>{},
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
Signals: () => FakeSignals(), Signals: () => FakeSignals(),
@ -356,7 +353,6 @@ void main() {
<String, List<SrvResourceRecord>>{}, <String, List<SrvResourceRecord>>{},
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
ProcessManager: () => FakeProcessManager.empty(), ProcessManager: () => FakeProcessManager.empty(),
@ -447,7 +443,6 @@ void main() {
}, },
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },
@ -540,7 +535,6 @@ void main() {
}, },
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },
@ -646,7 +640,6 @@ void main() {
}, },
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },
@ -752,7 +745,6 @@ void main() {
}, },
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },
@ -1016,7 +1008,6 @@ void main() {
<String, List<SrvResourceRecord>>{}, <String, List<SrvResourceRecord>>{},
), ),
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
), ),
}, },

View File

@ -228,71 +228,38 @@ void main() {
); );
testUsingContext( testUsingContext(
'no-analytics flag flips usage flag and sends event', 'analytics flag enables/disables analytics',
() async { () async {
final ConfigCommand configCommand = ConfigCommand(); final ConfigCommand configCommand = ConfigCommand();
final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand); final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand);
expect(testUsage.enabled, true); expect(fakeAnalytics.telemetryEnabled, true);
await commandRunner.run(<String>['config', '--no-analytics']); await commandRunner.run(<String>['config', '--no-analytics']);
expect(fakeAnalytics.telemetryEnabled, false);
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);
await commandRunner.run(<String>['config', '--analytics']); await commandRunner.run(<String>['config', '--analytics']);
expect(fakeAnalytics.telemetryEnabled, true);
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);
}, },
overrides: <Type, Generator>{Usage: () => testUsage}, overrides: <Type, Generator>{Analytics: () => fakeAnalytics},
); );
testUsingContext('analytics reported with help usages', () async { testUsingContext('analytics reported with help usages', () async {
final ConfigCommand configCommand = ConfigCommand(); final ConfigCommand configCommand = ConfigCommand();
createTestCommandRunner(configCommand); createTestCommandRunner(configCommand);
testUsage.suppressAnalytics = true; await fakeAnalytics.setTelemetry(false);
expect( expect(
configCommand.usage, configCommand.usage,
containsIgnoringWhitespace('Analytics reporting is currently disabled'), containsIgnoringWhitespace('Analytics reporting is currently disabled'),
); );
testUsage.suppressAnalytics = false; await fakeAnalytics.setTelemetry(true);
expect( expect(
configCommand.usage, configCommand.usage,
containsIgnoringWhitespace('Analytics reporting is currently enabled'), 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, String? sdkName,
bool? emulator, bool? emulator,
String? reason, String? reason,
Usage usage,
Analytics? analytics, Analytics? analytics,
) async { ) async {
firstReloadDetails['finalLibraryCount'] = 2; 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/xcode_build_settings.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:unified_analytics/unified_analytics.dart'; import 'package:unified_analytics/unified_analytics.dart';
import '../../src/common.dart'; import '../../src/common.dart';
@ -61,7 +60,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
processManager: fakeProcessManager, processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
}); });
@ -181,7 +179,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
processManager: fakeProcessManager, processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
fileSystem.file(xcodebuild).deleteSync(); fileSystem.file(xcodebuild).deleteSync();
@ -568,7 +565,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
processManager: fakeProcessManager, processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -598,7 +594,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
processManager: fakeProcessManager, processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -631,7 +626,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
processManager: fakeProcessManager, processManager: fakeProcessManager,
usage: TestUsage(),
analytics: const NoOpAnalytics(), 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/ios/xcodeproj.dart';
import 'package:flutter_tools/src/macos/cocoapods.dart'; import 'package:flutter_tools/src/macos/cocoapods.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart'; import 'package:unified_analytics/unified_analytics.dart';
@ -32,7 +31,6 @@ void main() {
late FakeProcessManager fakeProcessManager; late FakeProcessManager fakeProcessManager;
late CocoaPods cocoaPodsUnderTest; late CocoaPods cocoaPodsUnderTest;
late BufferLogger logger; late BufferLogger logger;
late TestUsage usage;
late FakeAnalytics fakeAnalytics; late FakeAnalytics fakeAnalytics;
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default. // TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
@ -74,7 +72,6 @@ void main() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
fakeProcessManager = FakeProcessManager.empty(); fakeProcessManager = FakeProcessManager.empty();
logger = BufferLogger.test(); logger = BufferLogger.test();
usage = TestUsage();
fakeAnalytics = getInitializedFakeAnalyticsInstance( fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -85,7 +82,6 @@ void main() {
logger: logger, logger: logger,
platform: FakePlatform(operatingSystem: 'macos'), platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(), xcodeProjectInterpreter: FakeXcodeProjectInterpreter(),
usage: usage,
analytics: fakeAnalytics, analytics: fakeAnalytics,
); );
fileSystem.file( fileSystem.file(
@ -227,7 +223,6 @@ void main() {
logger: logger, logger: logger,
platform: FakePlatform(operatingSystem: 'macos'), platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: fakeXcodeProjectInterpreter, xcodeProjectInterpreter: fakeXcodeProjectInterpreter,
usage: usage,
analytics: fakeAnalytics, analytics: fakeAnalytics,
); );
@ -269,7 +264,6 @@ void main() {
logger: logger, logger: logger,
platform: FakePlatform(operatingSystem: 'macos'), platform: FakePlatform(operatingSystem: 'macos'),
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(isInstalled: false), xcodeProjectInterpreter: FakeXcodeProjectInterpreter(isInstalled: false),
usage: usage,
analytics: fakeAnalytics, analytics: fakeAnalytics,
); );
@ -1261,7 +1255,6 @@ end''');
); );
expect(logger.errorText, contains('set up CocoaPods for ARM macOS')); expect(logger.errorText, contains('set up CocoaPods for ARM macOS'));
expect(logger.errorText, contains('enable-libffi-alloc')); expect(logger.errorText, contains('enable-libffi-alloc'));
expect(usage.events, contains(const TestUsageEvent('pod-install-failure', 'arm-ffi')));
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -1487,7 +1480,6 @@ end''');
processManager: fakeProcessManager, processManager: fakeProcessManager,
version: Version(14, 3, 0), version: Version(14, 3, 0),
), ),
usage: usage,
analytics: fakeAnalytics, 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/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/macos/migrations/secure_restorable_state_migration.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart'; import 'package:unified_analytics/unified_analytics.dart';
@ -22,7 +21,6 @@ import '../../src/fakes.dart';
void main() { void main() {
group('remove link and embed migration', () { group('remove link and embed migration', () {
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics; late FakeAnalytics fakeAnalytics;
late MemoryFileSystem memoryFileSystem; late MemoryFileSystem memoryFileSystem;
late BufferLogger testLogger; late BufferLogger testLogger;
@ -30,7 +28,6 @@ void main() {
late File xcodeProjectInfoFile; late File xcodeProjectInfoFile;
setUp(() { setUp(() {
testUsage = TestUsage();
memoryFileSystem = MemoryFileSystem.test(); memoryFileSystem = MemoryFileSystem.test();
fakeAnalytics = getInitializedFakeAnalyticsInstance( fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: memoryFileSystem, fs: memoryFileSystem,
@ -44,14 +41,8 @@ void main() {
testWithoutContext('skipped if files are missing', () async { testWithoutContext('skipped if files are missing', () async {
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
await macosProjectMigration.migrate(); await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.existsSync(), isFalse); expect(xcodeProjectInfoFile.existsSync(), isFalse);
@ -69,14 +60,8 @@ void main() {
final DateTime projectLastModified = xcodeProjectInfoFile.lastModifiedSync(); final DateTime projectLastModified = xcodeProjectInfoFile.lastModifiedSync();
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
await macosProjectMigration.migrate(); await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.lastModifiedSync(), projectLastModified); expect(xcodeProjectInfoFile.lastModifiedSync(), projectLastModified);
@ -92,12 +77,7 @@ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.
xcodeProjectInfoFile.writeAsStringSync(contents); xcodeProjectInfoFile.writeAsStringSync(contents);
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
await macosProjectMigration.migrate(); await macosProjectMigration.migrate();
expect(xcodeProjectInfoFile.readAsStringSync(), contents); expect(xcodeProjectInfoFile.readAsStringSync(), contents);
expect(testLogger.statusText, isEmpty); expect(testLogger.statusText, isEmpty);
@ -116,14 +96,8 @@ keep this 2
'''); ''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
await macosProjectMigration.migrate(); await macosProjectMigration.migrate();
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(xcodeProjectInfoFile.readAsStringSync(), r''' expect(xcodeProjectInfoFile.readAsStringSync(), r'''
@ -140,21 +114,12 @@ keep this 2
'''); ''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
expect( expect(
macosProjectMigration.migrate, macosProjectMigration.migrate,
throwsToolExit(message: 'Your Xcode project requires migration'), throwsToolExit(message: 'Your Xcode project requires migration'),
); );
expect(
testUsage.events,
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -173,20 +138,11 @@ keep this 2
'''); ''');
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration = final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
RemoveMacOSFrameworkLinkAndEmbeddingMigration( RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
macOSProject,
testLogger,
testUsage,
fakeAnalytics,
);
expect( expect(
macosProjectMigration.migrate, macosProjectMigration.migrate,
throwsToolExit(message: 'Your Xcode project requires migration'), throwsToolExit(message: 'Your Xcode project requires migration'),
); );
expect(
testUsage.events,
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( 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/ios/devices.dart';
import 'package:flutter_tools/src/mdns_discovery.dart'; import 'package:flutter_tools/src/mdns_discovery.dart';
import 'package:flutter_tools/src/project.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:multicast_dns/multicast_dns.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart'; import 'package:unified_analytics/unified_analytics.dart';
@ -57,7 +56,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: client, preliminaryMDnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -88,7 +86,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -117,7 +114,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: client, preliminaryMDnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -141,7 +137,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: client, preliminaryMDnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -169,7 +164,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: client, preliminaryMDnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -181,7 +175,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -202,7 +195,6 @@ void main() {
mdnsClient: emptyClient, mdnsClient: emptyClient,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: fakeAnalytics, analytics: fakeAnalytics,
); );
final Uri? uri = await portDiscovery.getVMServiceUriForAttach('', FakeIOSDevice()); final Uri? uri = await portDiscovery.getVMServiceUriForAttach('', FakeIOSDevice());
@ -229,7 +221,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final int? port = (await portDiscovery.queryForAttach())?.port; final int? port = (await portDiscovery.queryForAttach())?.port;
@ -253,7 +244,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.queryForAttach(); final MDnsVmServiceDiscoveryResult? result = await portDiscovery.queryForAttach();
@ -281,7 +271,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final int? port = (await portDiscovery.queryForAttach(applicationId: 'fiz'))?.port; final int? port = (await portDiscovery.queryForAttach(applicationId: 'fiz'))?.port;
@ -310,7 +299,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final int? port = (await portDiscovery.queryForAttach(applicationId: 'bar'))?.port; final int? port = (await portDiscovery.queryForAttach(applicationId: 'bar'))?.port;
@ -328,7 +316,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect(() async => portDiscovery.queryForAttach(), throwsException); expect(() async => portDiscovery.queryForAttach(), throwsException);
@ -349,7 +336,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForAttach( final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -387,7 +373,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForAttach( final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -425,7 +410,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForAttach( final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
@ -483,7 +467,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect( expect(
@ -516,7 +499,6 @@ void main() {
mdnsClient: client, mdnsClient: client,
preliminaryMDnsClient: emptyClient, preliminaryMDnsClient: emptyClient,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect( expect(
@ -536,7 +518,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -555,7 +536,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -578,7 +558,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: logger, logger: logger,
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -602,7 +581,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect( expect(
@ -627,7 +605,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -665,7 +642,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -702,7 +678,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch( final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -740,7 +715,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch( final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -778,7 +752,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch( final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
@ -836,7 +809,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect( expect(
@ -872,7 +844,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -906,7 +877,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect( expect(
@ -922,7 +892,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}), mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
@ -933,7 +902,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}), mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
expect(portDiscovery.deviceNameMatchesTargetName('My phone', 'My-Phone-2.local'), isFalse); expect(portDiscovery.deviceNameMatchesTargetName('My phone', 'My-Phone-2.local'), isFalse);
@ -986,7 +954,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService( final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1048,7 +1015,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService( final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1087,7 +1053,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService( final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1132,7 +1097,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService( final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
@ -1179,7 +1143,6 @@ void main() {
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery( final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
mdnsClient: client, mdnsClient: client,
logger: BufferLogger.test(), logger: BufferLogger.test(),
flutterUsage: TestUsage(),
analytics: const NoOpAnalytics(), analytics: const NoOpAnalytics(),
); );
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService( final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(

View File

@ -313,21 +313,6 @@ void main() {
final OperationResult result = await residentRunner.restart(); final OperationResult result = await residentRunner.restart();
expect(result.fatal, true); expect(result.fatal, true);
expect(result.code, 1); 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( expect(
(globals.analytics as FakeAnalytics).sentEvents, (globals.analytics as FakeAnalytics).sentEvents,
contains( contains(
@ -398,21 +383,6 @@ void main() {
contains('Unable to hot reload application due to an unrecoverable error'), 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -467,21 +437,6 @@ void main() {
expect(result.fatal, true); expect(result.fatal, true);
expect(result.code, 1); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -725,19 +680,11 @@ void main() {
expect(result.fatal, false); expect(result.fatal, false);
expect(result.code, 0); expect(result.code, 0);
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first; final Event event = fakeAnalytics.sentEvents.first;
expect(event.category, 'hot'); expect(event.eventName.label, 'hot_runner_info');
expect(event.parameter, 'reload'); expect(event.eventData['label'], 'reload');
expect( expect(
event.parameters?.hotEventTargetPlatform, event.eventData['targetPlatform'],
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'],
getNameForTargetPlatform(TargetPlatform.android_arm), getNameForTargetPlatform(TargetPlatform.android_arm),
); );
}, overrides: <Type, Generator>{Usage: () => TestUsage()}), }, overrides: <Type, Generator>{Usage: () => TestUsage()}),
@ -876,24 +823,14 @@ void main() {
expect(result.fatal, false); expect(result.fatal, false);
expect(result.code, 0); 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); expect(fakeVmServiceHost?.hasRemainingExpectations, false);
// Parse out the event of interest since we may have timing events with final List<Event> hotRunnerInfoEvents =
// the new analytics package
final List<Event> newEventList =
fakeAnalytics.sentEvents fakeAnalytics.sentEvents
.where((Event e) => e.eventName.label == 'hot_runner_info') .where((Event e) => e.eventName.label == 'hot_runner_info')
.toList(); .toList();
expect(newEventList, hasLength(1)); expect(hotRunnerInfoEvents, hasLength(1));
final Event newEvent = newEventList.first; final Event newEvent = hotRunnerInfoEvents.first;
expect(newEvent.eventName.label, 'hot_runner_info');
expect(newEvent.eventData['label'], 'restart'); expect(newEvent.eventData['label'], 'restart');
expect( expect(
newEvent.eventData['targetPlatform'], newEvent.eventData['targetPlatform'],
@ -1092,21 +1029,6 @@ void main() {
expect(result.fatal, true); expect(result.fatal, true);
expect(result.code, 1); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( 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/devfs_web.dart';
import 'package:flutter_tools/src/isolated/resident_web_runner.dart'; import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
import 'package:flutter_tools/src/project.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/resident_runner.dart';
import 'package:flutter_tools/src/vmservice.dart'; import 'package:flutter_tools/src/vmservice.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
@ -64,7 +63,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance( analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -99,7 +97,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance( analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -130,7 +127,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance( analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -160,7 +156,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance( analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -194,7 +189,6 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance( analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), 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/devfs_web.dart';
import 'package:flutter_tools/src/isolated/resident_web_runner.dart'; import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
import 'package:flutter_tools/src/project.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_devtools_handler.dart';
import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/vmservice.dart'; import 'package:flutter_tools/src/vmservice.dart';
@ -89,7 +88,6 @@ void main() {
late FakeVmServiceHost fakeVmServiceHost; late FakeVmServiceHost fakeVmServiceHost;
late MemoryFileSystem fileSystem; late MemoryFileSystem fileSystem;
late ProcessManager processManager; late ProcessManager processManager;
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics; late FakeAnalytics fakeAnalytics;
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default. // TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
@ -99,7 +97,6 @@ void main() {
} }
setUp(() { setUp(() {
testUsage = TestUsage();
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
processManager = FakeProcessManager.any(); processManager = FakeProcessManager.any();
debugConnection = FakeDebugConnection(); debugConnection = FakeDebugConnection();
@ -146,7 +143,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
@ -176,7 +172,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
@ -198,7 +193,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
@ -210,7 +204,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile), debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
@ -350,7 +343,6 @@ void main() {
stayResident: false, stayResident: false,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -379,7 +371,6 @@ void main() {
stayResident: false, stayResident: false,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -595,7 +586,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -674,21 +664,6 @@ void main() {
expect(result.code, 0); expect(result.code, 0);
expect(webDevFS.mainUri.toString(), contains('entrypoint.dart')); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -702,9 +677,6 @@ void main() {
), ),
), ),
); );
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -717,7 +689,6 @@ void main() {
); );
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
@ -781,21 +752,6 @@ void main() {
expect(logger.statusText, contains('Restarted application in')); expect(logger.statusText, contains('Restarted application in'));
expect(result.code, 0); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -809,9 +765,6 @@ void main() {
), ),
), ),
); );
expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -824,7 +777,6 @@ void main() {
); );
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
@ -857,12 +809,9 @@ void main() {
expect(result.code, 0); expect(result.code, 0);
// web-server device does not send restart analytics // web-server device does not send restart analytics
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
@ -898,12 +847,9 @@ void main() {
unawaited(residentWebRunner.run(connectionInfoCompleter: connectionInfoCompleter)); unawaited(residentWebRunner.run(connectionInfoCompleter: connectionInfoCompleter));
expect(await residentWebRunner.run(), 1); expect(await residentWebRunner.run(), 1);
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
@ -969,12 +915,9 @@ void main() {
expect(result.code, 1); expect(result.code, 1);
expect(result.message, contains('Failed to recompile application.')); expect(result.message, contains('Failed to recompile application.'));
expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty); expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty);
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
Usage: () => testUsage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
@ -1187,7 +1130,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -1233,7 +1175,6 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -1276,7 +1217,6 @@ void main() {
stayResident: false, stayResident: false,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
@ -1568,7 +1508,6 @@ ResidentRunner setUpResidentRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory), flutterProject: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory),
debuggingOptions: debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug),
usage: globals.flutterUsage,
analytics: globals.analytics, analytics: globals.analytics,
systemClock: systemClock ?? SystemClock.fixed(DateTime.now()), systemClock: systemClock ?? SystemClock.fixed(DateTime.now()),
fileSystem: globals.fs, 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/compile.dart';
import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/devfs.dart';
import 'package:flutter_tools/src/device.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_devtools_handler.dart';
import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/run_hot.dart';
@ -32,7 +31,6 @@ void main() {
'flutter-sdk', 'flutter-sdk',
false, false,
'test-reason', 'test-reason',
TestUsage(),
const NoOpAnalytics(), 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/base/terminal.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/globals.dart' as globals; 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/resident_runner.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
@ -30,7 +29,6 @@ void main() {
group('FlutterCommandRunner', () { group('FlutterCommandRunner', () {
late MemoryFileSystem fileSystem; late MemoryFileSystem fileSystem;
late Platform platform; late Platform platform;
late TestUsage testUsage;
late FakeAnalytics fakeAnalytics; late FakeAnalytics fakeAnalytics;
setUpAll(() { setUpAll(() {
@ -42,7 +40,6 @@ void main() {
fileSystem.directory(_kFlutterRoot).createSync(recursive: true); fileSystem.directory(_kFlutterRoot).createSync(recursive: true);
fileSystem.directory(_kProjectRoot).createSync(recursive: true); fileSystem.directory(_kProjectRoot).createSync(recursive: true);
fileSystem.currentDirectory = _kProjectRoot; fileSystem.currentDirectory = _kProjectRoot;
testUsage = TestUsage();
fakeAnalytics = getInitializedFakeAnalyticsInstance( fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem, fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(), fakeFlutterVersion: FakeFlutterVersion(),
@ -210,7 +207,6 @@ void main() {
await runner.run(<String>['--version']); await runner.run(<String>['--version']);
expect(version.didFetchTagsAndUpdate, true); expect(version.didFetchTagsAndUpdate, true);
expect(testUsage.commands, contains(const TestUsageCommand('version')));
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -228,7 +224,6 @@ void main() {
Platform: () => platform, Platform: () => platform,
FlutterVersion: () => FakeFlutterVersion(), FlutterVersion: () => FakeFlutterVersion(),
OutputPreferences: () => OutputPreferences.test(), OutputPreferences: () => OutputPreferences.test(),
Usage: () => testUsage,
Analytics: () => fakeAnalytics, 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/build_info.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/run.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/device.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/pre_run_validator.dart'; 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:flutter_tools/src/runner/flutter_command.dart';
import 'package:meta/meta.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/testing.dart'; import 'package:unified_analytics/testing.dart';
import 'package:unified_analytics/unified_analytics.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/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/fake_devices.dart'; import '../../src/fake_devices.dart';
import '../../src/fake_pub_deps.dart';
import '../../src/fakes.dart'; import '../../src/fakes.dart';
import '../../src/test_flutter_command_runner.dart'; import '../../src/test_flutter_command_runner.dart';
import 'utils.dart'; import 'utils.dart';
void main() { 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', () { group('Flutter Command', () {
late FakeCache cache; late FakeCache cache;
late TestUsage usage;
late FakeAnalytics fakeAnalytics; late FakeAnalytics fakeAnalytics;
late FakeClock clock; late FakeClock clock;
late FakeProcessInfo processInfo; late FakeProcessInfo processInfo;
@ -66,7 +55,6 @@ void main() {
setUp(() { setUp(() {
Cache.disableLocking(); Cache.disableLocking();
cache = FakeCache(); cache = FakeCache();
usage = TestUsage();
clock = FakeClock(); clock = FakeClock();
processInfo = FakeProcessInfo(); processInfo = FakeProcessInfo();
processInfo.maxRss = 10; processInfo.maxRss = 10;
@ -237,6 +225,7 @@ void main() {
}, },
); );
@isTest
void testUsingCommandContext(String testName, dynamic Function() testBody) { void testUsingCommandContext(String testName, dynamic Function() testBody) {
testUsingContext( testUsingContext(
testName, testName,
@ -246,7 +235,6 @@ void main() {
ProcessInfo: () => processInfo, ProcessInfo: () => processInfo,
ProcessManager: () => processManager, ProcessManager: () => processManager,
SystemClock: () => clock, SystemClock: () => clock,
Usage: () => usage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
}, },
); );
@ -263,10 +251,6 @@ void main() {
); );
await flutterCommand.run(); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -291,10 +275,6 @@ void main() {
); );
await flutterCommand.run(); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -318,10 +298,6 @@ void main() {
}, },
); );
await expectLater(() => flutterCommand.run(), throwsToolExit()); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -430,10 +406,6 @@ void main() {
signalController.add(mockSignal); signalController.add(mockSignal);
await completer.future; 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -456,7 +428,6 @@ void main() {
exitSignals: <ProcessSignal>[signalUnderTest], exitSignals: <ProcessSignal>[signalUnderTest],
), ),
SystemClock: () => clock, SystemClock: () => clock,
Usage: () => usage,
Analytics: () => fakeAnalytics, Analytics: () => fakeAnalytics,
}, },
); );
@ -499,7 +470,6 @@ void main() {
subForSigTerm: signalUnderTest, subForSigTerm: signalUnderTest,
exitSignals: <ProcessSignal>[signalUnderTest], exitSignals: <ProcessSignal>[signalUnderTest],
), ),
Usage: () => usage,
}, },
); );
}); });
@ -511,12 +481,6 @@ void main() {
final DummyFlutterCommand flutterCommand = DummyFlutterCommand(); final DummyFlutterCommand flutterCommand = DummyFlutterCommand();
await flutterCommand.run(); await flutterCommand.run();
expect(
usage.timings,
contains(
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
),
);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -537,8 +501,6 @@ void main() {
final DummyFlutterCommand flutterCommand = DummyFlutterCommand(noUsagePath: true); final DummyFlutterCommand flutterCommand = DummyFlutterCommand(noUsagePath: true);
await flutterCommand.run(); await flutterCommand.run();
expect(usage.timings, isEmpty);
// Iterate through and count all the [Event.timing] instances
int timingEventCounts = 0; int timingEventCounts = 0;
for (final Event e in fakeAnalytics.sentEvents) { for (final Event e in fakeAnalytics.sentEvents) {
if (e.eventName == DashEvent.timing) { if (e.eventName == DashEvent.timing) {
@ -570,17 +532,6 @@ void main() {
); );
await flutterCommand.run(); await flutterCommand.run();
expect(
usage.timings,
contains(
const TestTimingEvent(
'flutter',
'dummy',
Duration(milliseconds: 500),
label: 'success-blah1-blah2-blah3',
),
),
);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( contains(
@ -605,12 +556,6 @@ void main() {
); );
await expectLater(() => flutterCommand.run(), throwsToolExit()); await expectLater(() => flutterCommand.run(), throwsToolExit());
expect(
usage.timings,
contains(
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
),
);
expect( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
contains( 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( testUsingContext(
'use packagesPath to generate BuildInfo', 'use packagesPath to generate BuildInfo',
() async { () async {
@ -1518,32 +1403,6 @@ class FakeTargetCommand extends FlutterCommand {
String get name => 'test'; 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 { class FakeDdsCommand extends FlutterCommand {
FakeDdsCommand() { FakeDdsCommand() {
addDdsOptions(verboseHelp: false); 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 { class _TestDeviceManager extends DeviceManager {
_TestDeviceManager({required super.logger}); _TestDeviceManager({required super.logger});
List<Device> devices = <Device>[]; List<Device> devices = <Device>[];

View File

@ -80,7 +80,6 @@ void main() {
logger: logger, logger: logger,
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
buildSystem: buildSystem, buildSystem: buildSystem,
usage: testUsage,
flutterVersion: flutterVersion, flutterVersion: flutterVersion,
fileSystem: fileSystem, fileSystem: fileSystem,
analytics: fakeAnalytics, analytics: fakeAnalytics,
@ -104,22 +103,6 @@ void main() {
// Runs ScrubGeneratedPluginRegistrant migrator. // Runs ScrubGeneratedPluginRegistrant migrator.
expect(logger.traceText, contains('generated_plugin_registrant.dart not found. Skipping.')); 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( expect(
fakeAnalytics.sentEvents, fakeAnalytics.sentEvents,
containsAll(<Event>[ 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( expect(
analyticsTimingEventExists( analyticsTimingEventExists(
sentEvents: fakeAnalytics.sentEvents, sentEvents: fakeAnalytics.sentEvents,
@ -171,7 +150,6 @@ void main() {
logger: logger, logger: logger,
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
buildSystem: buildSystem, buildSystem: buildSystem,
usage: testUsage,
flutterVersion: flutterVersion, flutterVersion: flutterVersion,
fileSystem: fileSystem, fileSystem: fileSystem,
analytics: fakeAnalytics, analytics: fakeAnalytics,