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:
parent
1eecbf1256
commit
bc7703f886
@ -247,7 +247,6 @@ class BuildWebCommand extends BuildSubCommand {
|
||||
buildSystem: globals.buildSystem,
|
||||
fileSystem: globals.fs,
|
||||
flutterVersion: globals.flutterVersion,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
);
|
||||
await webBuilder.buildWeb(
|
||||
|
@ -9,7 +9,6 @@ import '../base/common.dart';
|
||||
import '../convert.dart';
|
||||
import '../features.dart';
|
||||
import '../globals.dart' as globals;
|
||||
import '../reporting/reporting.dart';
|
||||
import '../runner/flutter_command.dart';
|
||||
import '../runner/flutter_command_runner.dart';
|
||||
|
||||
@ -137,22 +136,8 @@ class ConfigCommand extends FlutterCommand {
|
||||
|
||||
if (argResults!.wasParsed('analytics')) {
|
||||
final bool value = boolArg('analytics');
|
||||
// The tool sends the analytics event *before* toggling the flag
|
||||
// intentionally to be sure that opt-out events are sent correctly.
|
||||
AnalyticsConfigEvent(enabled: value).send();
|
||||
if (!value) {
|
||||
// Normally, the tool waits for the analytics to all send before the
|
||||
// tool exits, but only when analytics are enabled. When reporting that
|
||||
// analytics have been disable, the wait must be done here instead.
|
||||
await globals.flutterUsage.ensureAnalyticsSent();
|
||||
}
|
||||
globals.flutterUsage.enabled = value;
|
||||
globals.printStatus('Analytics reporting ${value ? 'enabled' : 'disabled'}.');
|
||||
|
||||
// TODO(eliasyishak): Set the telemetry for the unified_analytics
|
||||
// package as well, the above will be removed once we have
|
||||
// fully transitioned to using the new package,
|
||||
// https://github.com/flutter/flutter/issues/128251
|
||||
await globals.analytics.setTelemetry(value);
|
||||
}
|
||||
|
||||
@ -273,9 +258,7 @@ class ConfigCommand extends FlutterCommand {
|
||||
|
||||
/// List the status of the analytics reporting.
|
||||
String get analyticsUsage {
|
||||
final bool analyticsEnabled =
|
||||
globals.flutterUsage.enabled && !globals.flutterUsage.suppressAnalytics;
|
||||
return 'Analytics reporting is currently ${analyticsEnabled ? 'enabled' : 'disabled'}.';
|
||||
return 'Analytics reporting is currently ${globals.analytics.telemetryEnabled ? 'enabled' : 'disabled'}.';
|
||||
}
|
||||
|
||||
/// Raising the reload tip for setting changes.
|
||||
|
@ -709,7 +709,6 @@ class AppDomain extends Domain {
|
||||
stayResident: true,
|
||||
urlTunneller: options.webEnableExposeUrl! ? daemon.daemonDomain.exposeUrl : null,
|
||||
machine: machine,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
logger: globals.logger,
|
||||
|
@ -348,7 +348,6 @@ class PackagesGetCommand extends FlutterCommand {
|
||||
touchesPackageConfig: !(isHelp || dryRun),
|
||||
);
|
||||
final Duration elapsedDuration = timer.elapsed;
|
||||
globals.flutterUsage.sendTiming('pub', 'get', elapsedDuration, label: 'success');
|
||||
analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'pub',
|
||||
@ -361,7 +360,6 @@ class PackagesGetCommand extends FlutterCommand {
|
||||
} catch (_) {
|
||||
// ignore: avoid_catches_without_on_clauses
|
||||
final Duration elapsedDuration = timer.elapsed;
|
||||
globals.flutterUsage.sendTiming('pub', 'get', elapsedDuration, label: 'failure');
|
||||
analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'pub',
|
||||
|
@ -761,7 +761,6 @@ class RunCommand extends RunCommandBase {
|
||||
debuggingOptions: await createDebuggingOptions(webMode),
|
||||
stayResident: stayResident,
|
||||
fileSystem: globals.fs,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
logger: globals.logger,
|
||||
systemClock: globals.systemClock,
|
||||
|
@ -167,7 +167,6 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
|
||||
logger: globals.logger,
|
||||
platform: globals.platform,
|
||||
xcodeProjectInterpreter: globals.xcodeProjectInterpreter!,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
),
|
||||
CocoaPodsValidator: () => CocoaPodsValidator(globals.cocoaPods!, globals.userMessages),
|
||||
@ -289,11 +288,7 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
|
||||
),
|
||||
MacOSWorkflow: () => MacOSWorkflow(featureFlags: featureFlags, platform: globals.platform),
|
||||
MDnsVmServiceDiscovery:
|
||||
() => MDnsVmServiceDiscovery(
|
||||
logger: globals.logger,
|
||||
flutterUsage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
),
|
||||
() => MDnsVmServiceDiscovery(logger: globals.logger, analytics: globals.analytics),
|
||||
OperatingSystemUtils:
|
||||
() => OperatingSystemUtils(
|
||||
fileSystem: globals.fs,
|
||||
@ -384,7 +379,6 @@ Future<T> runInContext<T>(FutureOr<T> Function() runner, {Map<Type, Generator>?
|
||||
processManager: globals.processManager,
|
||||
platform: globals.platform,
|
||||
fileSystem: globals.fs,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
),
|
||||
},
|
||||
|
@ -97,7 +97,6 @@ class WebDriverService extends DriverService {
|
||||
stayResident: true,
|
||||
flutterProject: FlutterProject.current(),
|
||||
fileSystem: globals.fs,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
logger: _logger,
|
||||
systemClock: globals.systemClock,
|
||||
|
@ -30,7 +30,6 @@ class XcodeProjectInterpreter {
|
||||
required ProcessManager processManager,
|
||||
required Logger logger,
|
||||
required FileSystem fileSystem,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
}) {
|
||||
return XcodeProjectInterpreter._(
|
||||
@ -38,7 +37,6 @@ class XcodeProjectInterpreter {
|
||||
processManager: processManager,
|
||||
logger: logger,
|
||||
fileSystem: fileSystem,
|
||||
usage: usage,
|
||||
analytics: analytics,
|
||||
);
|
||||
}
|
||||
@ -48,7 +46,6 @@ class XcodeProjectInterpreter {
|
||||
required ProcessManager processManager,
|
||||
required Logger logger,
|
||||
required FileSystem fileSystem,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
Version? version,
|
||||
String? build,
|
||||
@ -65,7 +62,6 @@ class XcodeProjectInterpreter {
|
||||
_version = version,
|
||||
_build = build,
|
||||
_versionText = version?.toString(),
|
||||
_usage = usage,
|
||||
_analytics = analytics;
|
||||
|
||||
/// Create an [XcodeProjectInterpreter] for testing.
|
||||
@ -88,7 +84,6 @@ class XcodeProjectInterpreter {
|
||||
fileSystem: MemoryFileSystem.test(),
|
||||
platform: platform,
|
||||
processManager: processManager,
|
||||
usage: TestUsage(),
|
||||
logger: BufferLogger.test(),
|
||||
version: version,
|
||||
build: build,
|
||||
@ -101,7 +96,6 @@ class XcodeProjectInterpreter {
|
||||
final ProcessUtils _processUtils;
|
||||
final OperatingSystemUtils _operatingSystemUtils;
|
||||
final Logger _logger;
|
||||
final Usage _usage;
|
||||
final Analytics _analytics;
|
||||
static final RegExp _versionRegex = RegExp(r'Xcode ([0-9.]+).*Build version (\w+)');
|
||||
|
||||
@ -243,12 +237,6 @@ class XcodeProjectInterpreter {
|
||||
XcodeSdk.IPhoneOS || XcodeSdk.IPhoneSimulator => 'ios',
|
||||
XcodeSdk.WatchOS || XcodeSdk.WatchSimulator => 'watchos',
|
||||
};
|
||||
BuildEvent(
|
||||
'xcode-show-build-settings-timeout',
|
||||
type: eventType,
|
||||
command: showBuildSettingsCommand.join(' '),
|
||||
flutterUsage: _usage,
|
||||
).send();
|
||||
_analytics.send(
|
||||
Event.flutterBuildInfo(
|
||||
label: 'xcode-show-build-settings-timeout',
|
||||
@ -306,12 +294,6 @@ class XcodeProjectInterpreter {
|
||||
return result.stdout.trim();
|
||||
} on Exception catch (error) {
|
||||
if (error is ProcessException && error.toString().contains('timed out')) {
|
||||
BuildEvent(
|
||||
'xcode-show-build-settings-timeout',
|
||||
type: 'ios',
|
||||
command: showBuildSettingsCommand.join(' '),
|
||||
flutterUsage: _usage,
|
||||
).send();
|
||||
_analytics.send(
|
||||
Event.flutterBuildInfo(
|
||||
label: 'xcode-show-build-settings-timeout',
|
||||
|
@ -54,7 +54,6 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
|
||||
required Logger logger,
|
||||
required FileSystem fileSystem,
|
||||
required SystemClock systemClock,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
bool machine = false,
|
||||
}) {
|
||||
@ -66,7 +65,6 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
|
||||
stayResident: stayResident,
|
||||
urlTunneller: urlTunneller,
|
||||
machine: machine,
|
||||
usage: usage,
|
||||
analytics: analytics,
|
||||
systemClock: systemClock,
|
||||
fileSystem: fileSystem,
|
||||
@ -91,7 +89,6 @@ class ResidentWebRunner extends ResidentRunner {
|
||||
required FileSystem fileSystem,
|
||||
required Logger logger,
|
||||
required SystemClock systemClock,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
UrlTunneller? urlTunneller,
|
||||
// TODO(bkonyi): remove when ready to serve DevTools from DDS.
|
||||
@ -99,7 +96,6 @@ class ResidentWebRunner extends ResidentRunner {
|
||||
}) : _fileSystem = fileSystem,
|
||||
_logger = logger,
|
||||
_systemClock = systemClock,
|
||||
_usage = usage,
|
||||
_analytics = analytics,
|
||||
_urlTunneller = urlTunneller,
|
||||
super(
|
||||
@ -114,7 +110,6 @@ class ResidentWebRunner extends ResidentRunner {
|
||||
final FileSystem _fileSystem;
|
||||
final Logger _logger;
|
||||
final SystemClock _systemClock;
|
||||
final Usage _usage;
|
||||
final Analytics _analytics;
|
||||
final UrlTunneller? _urlTunneller;
|
||||
|
||||
@ -342,7 +337,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
|
||||
buildSystem: globals.buildSystem,
|
||||
fileSystem: _fileSystem,
|
||||
flutterVersion: globals.flutterVersion,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
);
|
||||
await webBuilder.buildWeb(
|
||||
@ -436,7 +430,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
|
||||
buildSystem: globals.buildSystem,
|
||||
fileSystem: _fileSystem,
|
||||
flutterVersion: globals.flutterVersion,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
);
|
||||
await webBuilder.buildWeb(
|
||||
@ -480,7 +473,6 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
|
||||
|
||||
// Don't track restart times for dart2js builds or web-server devices.
|
||||
if (debuggingOptions.buildInfo.isDebug && deviceIsDebuggable) {
|
||||
_usage.sendTiming('hot', 'web-incremental-restart', elapsed);
|
||||
_analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'hot',
|
||||
|
@ -185,7 +185,6 @@ Future<void> _runCmake(
|
||||
throwToolExit('Unable to generate build files');
|
||||
}
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
globals.flutterUsage.sendTiming('build', 'cmake-linux', elapsedDuration);
|
||||
globals.analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
@ -216,7 +215,6 @@ Future<void> _runBuild(Directory buildDir) async {
|
||||
throwToolExit('Build process failed');
|
||||
}
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
globals.flutterUsage.sendTiming('build', 'linux-ninja', elapsedDuration);
|
||||
globals.analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
|
@ -85,7 +85,6 @@ Future<void> buildMacOS({
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
flutterProject.macos,
|
||||
globals.logger,
|
||||
globals.flutterUsage,
|
||||
globals.analytics,
|
||||
),
|
||||
MacOSDeploymentTargetMigration(flutterProject.macos, globals.logger),
|
||||
@ -246,7 +245,6 @@ Future<void> buildMacOS({
|
||||
}
|
||||
await _writeCodeSizeAnalysis(buildInfo, sizeAnalyzer);
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
globals.flutterUsage.sendTiming('build', 'xcode-macos', elapsedDuration);
|
||||
globals.analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
|
@ -22,7 +22,6 @@ import '../ios/xcodeproj.dart';
|
||||
import '../migrations/cocoapods_script_symlink.dart';
|
||||
import '../migrations/cocoapods_toolchain_directory_migration.dart';
|
||||
import '../project.dart';
|
||||
import '../reporting/reporting.dart';
|
||||
|
||||
const String noCocoaPodsConsequence = '''
|
||||
CocoaPods is a package manager for iOS or macOS platform code.
|
||||
@ -100,13 +99,11 @@ class CocoaPods {
|
||||
required XcodeProjectInterpreter xcodeProjectInterpreter,
|
||||
required Logger logger,
|
||||
required Platform platform,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
}) : _fileSystem = fileSystem,
|
||||
_processManager = processManager,
|
||||
_xcodeProjectInterpreter = xcodeProjectInterpreter,
|
||||
_logger = logger,
|
||||
_usage = usage,
|
||||
_analytics = analytics,
|
||||
_processUtils = ProcessUtils(processManager: processManager, logger: logger),
|
||||
_operatingSystemUtils = OperatingSystemUtils(
|
||||
@ -122,7 +119,6 @@ class CocoaPods {
|
||||
final OperatingSystemUtils _operatingSystemUtils;
|
||||
final XcodeProjectInterpreter _xcodeProjectInterpreter;
|
||||
final Logger _logger;
|
||||
final Usage _usage;
|
||||
final Analytics _analytics;
|
||||
|
||||
Future<String?>? _versionText;
|
||||
@ -403,7 +399,6 @@ class CocoaPods {
|
||||
} else if ((_isFfiX86Error(stdout) || _isFfiX86Error(stderr)) &&
|
||||
_operatingSystemUtils.hostPlatform == HostPlatform.darwin_arm64) {
|
||||
// https://github.com/flutter/flutter/issues/70796
|
||||
UsageEvent('pod-install-failure', 'arm-ffi', flutterUsage: _usage).send();
|
||||
_analytics.send(Event.appleUsageEvent(workflow: 'pod-install-failure', parameter: 'arm-ffi'));
|
||||
_logger.printError(
|
||||
'Error: To set up CocoaPods for ARM macOS, run:\n'
|
||||
|
@ -7,7 +7,6 @@ import 'package:unified_analytics/unified_analytics.dart';
|
||||
import '../../base/common.dart';
|
||||
import '../../base/file_system.dart';
|
||||
import '../../base/project_migrator.dart';
|
||||
import '../../reporting/reporting.dart';
|
||||
import '../../xcode_project.dart';
|
||||
|
||||
// Remove the linking and embedding logic from the Xcode project to give the tool more control over these.
|
||||
@ -15,14 +14,11 @@ class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
MacOSProject project,
|
||||
super.logger,
|
||||
Usage usage,
|
||||
Analytics analytics,
|
||||
) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile,
|
||||
_usage = usage,
|
||||
_analytics = analytics;
|
||||
|
||||
final File _xcodeProjectInfoFile;
|
||||
final Usage _usage;
|
||||
final Analytics _analytics;
|
||||
|
||||
@override
|
||||
@ -91,12 +87,6 @@ class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
|
||||
}
|
||||
|
||||
if (line.contains('/* App.framework ') || line.contains('/* FlutterMacOS.framework ')) {
|
||||
UsageEvent(
|
||||
'macos-migration',
|
||||
'remove-frameworks',
|
||||
label: 'failure',
|
||||
flutterUsage: _usage,
|
||||
).send();
|
||||
_analytics.send(
|
||||
Event.appleUsageEvent(
|
||||
workflow: 'macos-migration',
|
||||
|
@ -26,7 +26,6 @@ import '../ios/ios_deploy.dart';
|
||||
import '../ios/iproxy.dart';
|
||||
import '../ios/mac.dart';
|
||||
import '../ios/xcode_debug.dart';
|
||||
import '../reporting/reporting.dart';
|
||||
import 'xcode.dart';
|
||||
|
||||
class XCDeviceEventNotification {
|
||||
@ -520,7 +519,6 @@ class XCDevice {
|
||||
final String? errorMessage = _parseErrorMessage(errorProperties);
|
||||
if (errorMessage != null) {
|
||||
if (errorMessage.contains('not paired')) {
|
||||
UsageEvent('device', 'ios-trust-failure', flutterUsage: globals.flutterUsage).send();
|
||||
_analytics.send(
|
||||
Event.appleUsageEvent(workflow: 'device', parameter: 'ios-trust-failure'),
|
||||
);
|
||||
|
@ -16,7 +16,6 @@ import 'build_info.dart';
|
||||
import 'convert.dart';
|
||||
import 'device.dart';
|
||||
import 'globals.dart' as globals;
|
||||
import 'reporting/reporting.dart';
|
||||
|
||||
/// A wrapper around [MDnsClient] to find a Dart VM Service instance.
|
||||
class MDnsVmServiceDiscovery {
|
||||
@ -27,12 +26,10 @@ class MDnsVmServiceDiscovery {
|
||||
MDnsClient? mdnsClient,
|
||||
MDnsClient? preliminaryMDnsClient,
|
||||
required Logger logger,
|
||||
required Usage flutterUsage,
|
||||
required Analytics analytics,
|
||||
}) : _client = mdnsClient ?? MDnsClient(),
|
||||
_preliminaryClient = preliminaryMDnsClient,
|
||||
_logger = logger,
|
||||
_flutterUsage = flutterUsage,
|
||||
_analytics = analytics;
|
||||
|
||||
final MDnsClient _client;
|
||||
@ -42,7 +39,6 @@ class MDnsVmServiceDiscovery {
|
||||
final MDnsClient? _preliminaryClient;
|
||||
|
||||
final Logger _logger;
|
||||
final Usage _flutterUsage;
|
||||
final Analytics _analytics;
|
||||
|
||||
@visibleForTesting
|
||||
@ -575,7 +571,6 @@ class MDnsVmServiceDiscovery {
|
||||
final TargetPlatform targetPlatform = await device.targetPlatform;
|
||||
switch (targetPlatform) {
|
||||
case TargetPlatform.ios:
|
||||
UsageEvent('ios-mdns', 'no-ipv4-link-local', flutterUsage: _flutterUsage).send();
|
||||
_analytics.send(
|
||||
Event.appleUsageEvent(workflow: 'ios-mdns', parameter: 'no-ipv4-link-local'),
|
||||
);
|
||||
|
@ -716,7 +716,6 @@ class HotRunner extends ResidentRunner {
|
||||
|
||||
// Send timing analytics.
|
||||
final Duration elapsedDuration = restartTimer.elapsed;
|
||||
globals.flutterUsage.sendTiming('hot', 'restart', elapsedDuration);
|
||||
_analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'hot',
|
||||
@ -1046,7 +1045,6 @@ class HotRunner extends ResidentRunner {
|
||||
sdkName,
|
||||
emulator,
|
||||
reason,
|
||||
globals.flutterUsage,
|
||||
globals.analytics,
|
||||
);
|
||||
if (result.code != 0) {
|
||||
@ -1145,7 +1143,6 @@ class HotRunner extends ResidentRunner {
|
||||
if ((reassembleResult.reassembleViews.length == 1) &&
|
||||
!reassembleResult.failedReassemble &&
|
||||
shouldReportReloadTime) {
|
||||
globals.flutterUsage.sendTiming('hot', 'reload', reloadDuration);
|
||||
_analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'hot',
|
||||
@ -1298,7 +1295,6 @@ typedef ReloadSourcesHelper =
|
||||
String? sdkName,
|
||||
bool? emulator,
|
||||
String? reason,
|
||||
Usage usage,
|
||||
Analytics analytics,
|
||||
);
|
||||
|
||||
@ -1312,7 +1308,6 @@ Future<OperationResult> defaultReloadSourcesHelper(
|
||||
String? sdkName,
|
||||
bool? emulator,
|
||||
String? reason,
|
||||
Usage usage,
|
||||
Analytics analytics,
|
||||
) async {
|
||||
final Stopwatch vmReloadTimer = Stopwatch()..start();
|
||||
@ -1348,22 +1343,12 @@ Future<OperationResult> defaultReloadSourcesHelper(
|
||||
(await Future.wait(allReportsFutures)).whereType<DeviceReloadReport>();
|
||||
final vm_service.ReloadReport? reloadReport = reports.isEmpty ? null : reports.first.reports[0];
|
||||
if (reloadReport == null || !HotRunner.validateReloadReport(reloadReport)) {
|
||||
// Reload failed.
|
||||
HotEvent(
|
||||
'reload-reject',
|
||||
targetPlatform: targetPlatform!,
|
||||
sdkName: sdkName!,
|
||||
emulator: emulator!,
|
||||
fullRestart: false,
|
||||
reason: reason,
|
||||
usage: usage,
|
||||
).send();
|
||||
analytics.send(
|
||||
Event.hotRunnerInfo(
|
||||
label: 'reload-reject',
|
||||
targetPlatform: targetPlatform,
|
||||
sdkName: sdkName,
|
||||
emulator: emulator,
|
||||
targetPlatform: targetPlatform!,
|
||||
sdkName: sdkName!,
|
||||
emulator: emulator!,
|
||||
fullRestart: false,
|
||||
reason: reason,
|
||||
),
|
||||
|
@ -1805,14 +1805,6 @@ abstract class FlutterCommand extends Command<void> {
|
||||
final Duration elapsedDuration = (commandResult.endTimeOverride ?? endTime).difference(
|
||||
startTime,
|
||||
);
|
||||
globals.flutterUsage.sendTiming(
|
||||
'flutter',
|
||||
name,
|
||||
elapsedDuration,
|
||||
// Report in the form of `success-[parameter1-parameter2]`, all of which
|
||||
// can be null if the command doesn't provide a FlutterCommandResult.
|
||||
label: label == '' ? null : label,
|
||||
);
|
||||
analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'flutter',
|
||||
|
@ -440,7 +440,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
|
||||
}
|
||||
|
||||
if ((topLevelResults[FlutterGlobalOptions.kSuppressAnalyticsFlag] as bool?) ?? false) {
|
||||
globals.flutterUsage.suppressAnalytics = true;
|
||||
globals.analytics.suppressTelemetry();
|
||||
}
|
||||
|
||||
@ -459,7 +458,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
|
||||
}
|
||||
|
||||
if ((topLevelResults[FlutterGlobalOptions.kVersionFlag] as bool?) ?? false) {
|
||||
globals.flutterUsage.sendCommand(FlutterGlobalOptions.kVersionFlag);
|
||||
globals.analytics.send(
|
||||
Event.flutterCommandResult(
|
||||
commandPath: 'version',
|
||||
|
@ -19,7 +19,6 @@ import '../globals.dart' as globals;
|
||||
import '../platform_plugins.dart';
|
||||
import '../plugins.dart';
|
||||
import '../project.dart';
|
||||
import '../reporting/reporting.dart';
|
||||
import '../version.dart';
|
||||
import 'compiler_config.dart';
|
||||
import 'file_generators/flutter_service_worker_js.dart';
|
||||
@ -41,14 +40,12 @@ class WebBuilder {
|
||||
required Logger logger,
|
||||
required ProcessManager processManager,
|
||||
required BuildSystem buildSystem,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
required FlutterVersion flutterVersion,
|
||||
required FileSystem fileSystem,
|
||||
}) : _logger = logger,
|
||||
_processManager = processManager,
|
||||
_buildSystem = buildSystem,
|
||||
_flutterUsage = usage,
|
||||
_analytics = analytics,
|
||||
_flutterVersion = flutterVersion,
|
||||
_fileSystem = fileSystem;
|
||||
@ -56,7 +53,6 @@ class WebBuilder {
|
||||
final Logger _logger;
|
||||
final ProcessManager _processManager;
|
||||
final BuildSystem _buildSystem;
|
||||
final Usage _flutterUsage;
|
||||
final Analytics _analytics;
|
||||
final FlutterVersion _flutterVersion;
|
||||
final FileSystem _fileSystem;
|
||||
@ -146,19 +142,12 @@ class WebBuilder {
|
||||
|
||||
final String buildSettingsString = _buildEventAnalyticsSettings(configs: compilerConfigs);
|
||||
|
||||
BuildEvent(
|
||||
'web-compile',
|
||||
type: 'web',
|
||||
settings: buildSettingsString,
|
||||
flutterUsage: _flutterUsage,
|
||||
).send();
|
||||
_analytics.send(
|
||||
Event.flutterBuildInfo(label: 'web-compile', buildType: 'web', settings: buildSettingsString),
|
||||
);
|
||||
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
final String variableName = compilerConfigs.length > 1 ? 'dual-compile' : 'dart2js';
|
||||
_flutterUsage.sendTiming('build', variableName, elapsedDuration);
|
||||
_analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
|
@ -11,7 +11,6 @@ import '../base/net.dart';
|
||||
import '../base/time.dart';
|
||||
import '../device.dart';
|
||||
import '../project.dart';
|
||||
import '../reporting/reporting.dart';
|
||||
import '../resident_runner.dart';
|
||||
|
||||
WebRunnerFactory? get webRunnerFactory => context.get<WebRunnerFactory>();
|
||||
@ -31,7 +30,6 @@ abstract class WebRunnerFactory {
|
||||
required Logger logger,
|
||||
required FileSystem fileSystem,
|
||||
required SystemClock systemClock,
|
||||
required Usage usage,
|
||||
required Analytics analytics,
|
||||
bool machine = false,
|
||||
});
|
||||
|
@ -205,7 +205,6 @@ Future<void> _runCmakeGeneration({
|
||||
throwToolExit('Unable to generate build files');
|
||||
}
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
globals.flutterUsage.sendTiming('build', 'windows-cmake-generation', elapsedDuration);
|
||||
globals.analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
@ -259,7 +258,6 @@ Future<void> _runBuild(
|
||||
throwToolExit('Build process failed.');
|
||||
}
|
||||
final Duration elapsedDuration = sw.elapsed;
|
||||
globals.flutterUsage.sendTiming('build', 'windows-cmake-build', elapsedDuration);
|
||||
globals.analytics.send(
|
||||
Event.timing(
|
||||
workflow: 'build',
|
||||
|
@ -28,7 +28,6 @@ import 'package:flutter_tools/src/ios/devices.dart';
|
||||
import 'package:flutter_tools/src/macos/macos_ipad_device.dart';
|
||||
import 'package:flutter_tools/src/mdns_discovery.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/resident_runner.dart';
|
||||
import 'package:flutter_tools/src/run_hot.dart';
|
||||
import 'package:multicast_dns/multicast_dns.dart';
|
||||
@ -179,7 +178,6 @@ void main() {
|
||||
<String, List<SrvResourceRecord>>{},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
@ -260,7 +258,6 @@ void main() {
|
||||
<String, List<SrvResourceRecord>>{},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
Signals: () => FakeSignals(),
|
||||
@ -356,7 +353,6 @@ void main() {
|
||||
<String, List<SrvResourceRecord>>{},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
ProcessManager: () => FakeProcessManager.empty(),
|
||||
@ -447,7 +443,6 @@ void main() {
|
||||
},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
@ -540,7 +535,6 @@ void main() {
|
||||
},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
@ -646,7 +640,6 @@ void main() {
|
||||
},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
@ -752,7 +745,6 @@ void main() {
|
||||
},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
@ -1016,7 +1008,6 @@ void main() {
|
||||
<String, List<SrvResourceRecord>>{},
|
||||
),
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
),
|
||||
},
|
||||
|
@ -228,71 +228,38 @@ void main() {
|
||||
);
|
||||
|
||||
testUsingContext(
|
||||
'no-analytics flag flips usage flag and sends event',
|
||||
'analytics flag enables/disables analytics',
|
||||
() async {
|
||||
final ConfigCommand configCommand = ConfigCommand();
|
||||
final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand);
|
||||
|
||||
expect(testUsage.enabled, true);
|
||||
expect(fakeAnalytics.telemetryEnabled, true);
|
||||
|
||||
await commandRunner.run(<String>['config', '--no-analytics']);
|
||||
|
||||
expect(testUsage.enabled, false);
|
||||
|
||||
// Verify that we flushed the analytics queue.
|
||||
expect(testUsage.ensureAnalyticsSentCalls, 1);
|
||||
|
||||
// Verify that we only send the analytics disable event, and no other
|
||||
// info.
|
||||
expect(
|
||||
testUsage.events,
|
||||
equals(<TestUsageEvent>[const TestUsageEvent('analytics', 'enabled', label: 'false')]),
|
||||
);
|
||||
expect(testUsage.commands, isEmpty);
|
||||
expect(testUsage.timings, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
},
|
||||
overrides: <Type, Generator>{Usage: () => testUsage},
|
||||
);
|
||||
|
||||
testUsingContext(
|
||||
'analytics flag flips usage flag and sends event',
|
||||
() async {
|
||||
final ConfigCommand configCommand = ConfigCommand();
|
||||
final CommandRunner<void> commandRunner = createTestCommandRunner(configCommand);
|
||||
expect(fakeAnalytics.telemetryEnabled, false);
|
||||
|
||||
await commandRunner.run(<String>['config', '--analytics']);
|
||||
|
||||
expect(testUsage.enabled, true);
|
||||
|
||||
// Verify that we only send the analytics enable event, and no other
|
||||
// info.
|
||||
expect(
|
||||
testUsage.events,
|
||||
equals(<TestUsageEvent>[const TestUsageEvent('analytics', 'enabled', label: 'true')]),
|
||||
);
|
||||
expect(testUsage.commands, isEmpty);
|
||||
expect(testUsage.timings, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
expect(fakeAnalytics.telemetryEnabled, true);
|
||||
},
|
||||
overrides: <Type, Generator>{Usage: () => testUsage},
|
||||
overrides: <Type, Generator>{Analytics: () => fakeAnalytics},
|
||||
);
|
||||
|
||||
testUsingContext('analytics reported with help usages', () async {
|
||||
final ConfigCommand configCommand = ConfigCommand();
|
||||
createTestCommandRunner(configCommand);
|
||||
|
||||
testUsage.suppressAnalytics = true;
|
||||
await fakeAnalytics.setTelemetry(false);
|
||||
expect(
|
||||
configCommand.usage,
|
||||
containsIgnoringWhitespace('Analytics reporting is currently disabled'),
|
||||
);
|
||||
|
||||
testUsage.suppressAnalytics = false;
|
||||
await fakeAnalytics.setTelemetry(true);
|
||||
expect(
|
||||
configCommand.usage,
|
||||
containsIgnoringWhitespace('Analytics reporting is currently enabled'),
|
||||
);
|
||||
}, overrides: <Type, Generator>{Usage: () => testUsage});
|
||||
}, overrides: <Type, Generator>{Analytics: () => fakeAnalytics});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -488,7 +488,6 @@ void main() {
|
||||
String? sdkName,
|
||||
bool? emulator,
|
||||
String? reason,
|
||||
Usage usage,
|
||||
Analytics? analytics,
|
||||
) async {
|
||||
firstReloadDetails['finalLibraryCount'] = 2;
|
||||
|
@ -13,7 +13,6 @@ import 'package:flutter_tools/src/build_info.dart';
|
||||
import 'package:flutter_tools/src/ios/xcode_build_settings.dart';
|
||||
import 'package:flutter_tools/src/ios/xcodeproj.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:unified_analytics/unified_analytics.dart';
|
||||
|
||||
import '../../src/common.dart';
|
||||
@ -61,7 +60,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
platform: platform,
|
||||
processManager: fakeProcessManager,
|
||||
usage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
});
|
||||
@ -181,7 +179,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
platform: platform,
|
||||
processManager: fakeProcessManager,
|
||||
usage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
fileSystem.file(xcodebuild).deleteSync();
|
||||
@ -568,7 +565,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
platform: platform,
|
||||
processManager: fakeProcessManager,
|
||||
usage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -598,7 +594,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
platform: platform,
|
||||
processManager: fakeProcessManager,
|
||||
usage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -631,7 +626,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
platform: platform,
|
||||
processManager: fakeProcessManager,
|
||||
usage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
|
@ -15,7 +15,6 @@ import 'package:flutter_tools/src/flutter_plugins.dart';
|
||||
import 'package:flutter_tools/src/ios/xcodeproj.dart';
|
||||
import 'package:flutter_tools/src/macos/cocoapods.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:test/fake.dart';
|
||||
import 'package:unified_analytics/unified_analytics.dart';
|
||||
|
||||
@ -32,7 +31,6 @@ void main() {
|
||||
late FakeProcessManager fakeProcessManager;
|
||||
late CocoaPods cocoaPodsUnderTest;
|
||||
late BufferLogger logger;
|
||||
late TestUsage usage;
|
||||
late FakeAnalytics fakeAnalytics;
|
||||
|
||||
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
|
||||
@ -74,7 +72,6 @@ void main() {
|
||||
fileSystem = MemoryFileSystem.test();
|
||||
fakeProcessManager = FakeProcessManager.empty();
|
||||
logger = BufferLogger.test();
|
||||
usage = TestUsage();
|
||||
fakeAnalytics = getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -85,7 +82,6 @@ void main() {
|
||||
logger: logger,
|
||||
platform: FakePlatform(operatingSystem: 'macos'),
|
||||
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(),
|
||||
usage: usage,
|
||||
analytics: fakeAnalytics,
|
||||
);
|
||||
fileSystem.file(
|
||||
@ -227,7 +223,6 @@ void main() {
|
||||
logger: logger,
|
||||
platform: FakePlatform(operatingSystem: 'macos'),
|
||||
xcodeProjectInterpreter: fakeXcodeProjectInterpreter,
|
||||
usage: usage,
|
||||
analytics: fakeAnalytics,
|
||||
);
|
||||
|
||||
@ -269,7 +264,6 @@ void main() {
|
||||
logger: logger,
|
||||
platform: FakePlatform(operatingSystem: 'macos'),
|
||||
xcodeProjectInterpreter: FakeXcodeProjectInterpreter(isInstalled: false),
|
||||
usage: usage,
|
||||
analytics: fakeAnalytics,
|
||||
);
|
||||
|
||||
@ -1261,7 +1255,6 @@ end''');
|
||||
);
|
||||
expect(logger.errorText, contains('set up CocoaPods for ARM macOS'));
|
||||
expect(logger.errorText, contains('enable-libffi-alloc'));
|
||||
expect(usage.events, contains(const TestUsageEvent('pod-install-failure', 'arm-ffi')));
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -1487,7 +1480,6 @@ end''');
|
||||
processManager: fakeProcessManager,
|
||||
version: Version(14, 3, 0),
|
||||
),
|
||||
usage: usage,
|
||||
analytics: fakeAnalytics,
|
||||
);
|
||||
|
||||
|
@ -12,7 +12,6 @@ import 'package:flutter_tools/src/macos/migrations/nsapplicationmain_deprecation
|
||||
import 'package:flutter_tools/src/macos/migrations/remove_macos_framework_link_and_embedding_migration.dart';
|
||||
import 'package:flutter_tools/src/macos/migrations/secure_restorable_state_migration.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:test/fake.dart';
|
||||
import 'package:unified_analytics/unified_analytics.dart';
|
||||
|
||||
@ -22,7 +21,6 @@ import '../../src/fakes.dart';
|
||||
|
||||
void main() {
|
||||
group('remove link and embed migration', () {
|
||||
late TestUsage testUsage;
|
||||
late FakeAnalytics fakeAnalytics;
|
||||
late MemoryFileSystem memoryFileSystem;
|
||||
late BufferLogger testLogger;
|
||||
@ -30,7 +28,6 @@ void main() {
|
||||
late File xcodeProjectInfoFile;
|
||||
|
||||
setUp(() {
|
||||
testUsage = TestUsage();
|
||||
memoryFileSystem = MemoryFileSystem.test();
|
||||
fakeAnalytics = getInitializedFakeAnalyticsInstance(
|
||||
fs: memoryFileSystem,
|
||||
@ -44,14 +41,8 @@ void main() {
|
||||
|
||||
testWithoutContext('skipped if files are missing', () async {
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
await macosProjectMigration.migrate();
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
|
||||
expect(xcodeProjectInfoFile.existsSync(), isFalse);
|
||||
@ -69,14 +60,8 @@ void main() {
|
||||
final DateTime projectLastModified = xcodeProjectInfoFile.lastModifiedSync();
|
||||
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
await macosProjectMigration.migrate();
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
|
||||
expect(xcodeProjectInfoFile.lastModifiedSync(), projectLastModified);
|
||||
@ -92,12 +77,7 @@ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.
|
||||
xcodeProjectInfoFile.writeAsStringSync(contents);
|
||||
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
await macosProjectMigration.migrate();
|
||||
expect(xcodeProjectInfoFile.readAsStringSync(), contents);
|
||||
expect(testLogger.statusText, isEmpty);
|
||||
@ -116,14 +96,8 @@ keep this 2
|
||||
''');
|
||||
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
await macosProjectMigration.migrate();
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
|
||||
expect(xcodeProjectInfoFile.readAsStringSync(), r'''
|
||||
@ -140,21 +114,12 @@ keep this 2
|
||||
''');
|
||||
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
|
||||
expect(
|
||||
macosProjectMigration.migrate,
|
||||
throwsToolExit(message: 'Your Xcode project requires migration'),
|
||||
);
|
||||
expect(
|
||||
testUsage.events,
|
||||
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -173,20 +138,11 @@ keep this 2
|
||||
''');
|
||||
|
||||
final RemoveMacOSFrameworkLinkAndEmbeddingMigration macosProjectMigration =
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(
|
||||
macOSProject,
|
||||
testLogger,
|
||||
testUsage,
|
||||
fakeAnalytics,
|
||||
);
|
||||
RemoveMacOSFrameworkLinkAndEmbeddingMigration(macOSProject, testLogger, fakeAnalytics);
|
||||
expect(
|
||||
macosProjectMigration.migrate,
|
||||
throwsToolExit(message: 'Your Xcode project requires migration'),
|
||||
);
|
||||
expect(
|
||||
testUsage.events,
|
||||
contains(const TestUsageEvent('macos-migration', 'remove-frameworks', label: 'failure')),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
|
@ -13,7 +13,6 @@ import 'package:flutter_tools/src/globals.dart' as globals;
|
||||
import 'package:flutter_tools/src/ios/devices.dart';
|
||||
import 'package:flutter_tools/src/mdns_discovery.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:multicast_dns/multicast_dns.dart';
|
||||
import 'package:test/fake.dart';
|
||||
import 'package:unified_analytics/unified_analytics.dart';
|
||||
@ -57,7 +56,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -88,7 +86,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -117,7 +114,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -141,7 +137,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -169,7 +164,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -181,7 +175,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -202,7 +195,6 @@ void main() {
|
||||
mdnsClient: emptyClient,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: fakeAnalytics,
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForAttach('', FakeIOSDevice());
|
||||
@ -229,7 +221,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final int? port = (await portDiscovery.queryForAttach())?.port;
|
||||
@ -253,7 +244,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.queryForAttach();
|
||||
@ -281,7 +271,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final int? port = (await portDiscovery.queryForAttach(applicationId: 'fiz'))?.port;
|
||||
@ -310,7 +299,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final int? port = (await portDiscovery.queryForAttach(applicationId: 'bar'))?.port;
|
||||
@ -328,7 +316,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(() async => portDiscovery.queryForAttach(), throwsException);
|
||||
@ -349,7 +336,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
|
||||
@ -387,7 +373,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
|
||||
@ -425,7 +410,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForAttach(
|
||||
@ -483,7 +467,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(
|
||||
@ -516,7 +499,6 @@ void main() {
|
||||
mdnsClient: client,
|
||||
preliminaryMDnsClient: emptyClient,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(
|
||||
@ -536,7 +518,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -555,7 +536,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -578,7 +558,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: logger,
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -602,7 +581,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(
|
||||
@ -627,7 +605,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -665,7 +642,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -702,7 +678,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
|
||||
@ -740,7 +715,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
|
||||
@ -778,7 +752,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final Uri? uri = await portDiscovery.getVMServiceUriForLaunch(
|
||||
@ -836,7 +809,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(
|
||||
@ -872,7 +844,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -906,7 +877,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(
|
||||
@ -922,7 +892,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
|
||||
@ -933,7 +902,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: FakeMDnsClient(<PtrResourceRecord>[], <String, List<SrvResourceRecord>>{}),
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
expect(portDiscovery.deviceNameMatchesTargetName('My phone', 'My-Phone-2.local'), isFalse);
|
||||
@ -986,7 +954,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
|
||||
@ -1048,7 +1015,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
|
||||
@ -1087,7 +1053,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
|
||||
@ -1132,7 +1097,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
|
||||
@ -1179,7 +1143,6 @@ void main() {
|
||||
final MDnsVmServiceDiscovery portDiscovery = MDnsVmServiceDiscovery(
|
||||
mdnsClient: client,
|
||||
logger: BufferLogger.test(),
|
||||
flutterUsage: TestUsage(),
|
||||
analytics: const NoOpAnalytics(),
|
||||
);
|
||||
final MDnsVmServiceDiscoveryResult? result = await portDiscovery.firstMatchingVmService(
|
||||
|
@ -313,21 +313,6 @@ void main() {
|
||||
final OperationResult result = await residentRunner.restart();
|
||||
expect(result.fatal, true);
|
||||
expect(result.code, 1);
|
||||
expect(
|
||||
(globals.flutterUsage as TestUsage).events,
|
||||
contains(
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'exception',
|
||||
parameters: CustomDimensions(
|
||||
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
hotEventSdkName: 'Android',
|
||||
hotEventEmulator: false,
|
||||
hotEventFullRestart: false,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
(globals.analytics as FakeAnalytics).sentEvents,
|
||||
contains(
|
||||
@ -398,21 +383,6 @@ void main() {
|
||||
contains('Unable to hot reload application due to an unrecoverable error'),
|
||||
);
|
||||
|
||||
expect(
|
||||
(globals.flutterUsage as TestUsage).events,
|
||||
contains(
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'reload-barred',
|
||||
parameters: CustomDimensions(
|
||||
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
hotEventSdkName: 'Android',
|
||||
hotEventEmulator: false,
|
||||
hotEventFullRestart: false,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -467,21 +437,6 @@ void main() {
|
||||
expect(result.fatal, true);
|
||||
expect(result.code, 1);
|
||||
|
||||
expect(
|
||||
(globals.flutterUsage as TestUsage).events,
|
||||
contains(
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'exception',
|
||||
parameters: CustomDimensions(
|
||||
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
hotEventSdkName: 'Android',
|
||||
hotEventEmulator: false,
|
||||
hotEventFullRestart: false,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -725,19 +680,11 @@ void main() {
|
||||
expect(result.fatal, false);
|
||||
expect(result.code, 0);
|
||||
|
||||
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
|
||||
expect(event.category, 'hot');
|
||||
expect(event.parameter, 'reload');
|
||||
final Event event = fakeAnalytics.sentEvents.first;
|
||||
expect(event.eventName.label, 'hot_runner_info');
|
||||
expect(event.eventData['label'], 'reload');
|
||||
expect(
|
||||
event.parameters?.hotEventTargetPlatform,
|
||||
getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
);
|
||||
|
||||
final Event newEvent = fakeAnalytics.sentEvents.first;
|
||||
expect(newEvent.eventName.label, 'hot_runner_info');
|
||||
expect(newEvent.eventData['label'], 'reload');
|
||||
expect(
|
||||
newEvent.eventData['targetPlatform'],
|
||||
event.eventData['targetPlatform'],
|
||||
getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
);
|
||||
}, overrides: <Type, Generator>{Usage: () => TestUsage()}),
|
||||
@ -876,24 +823,14 @@ void main() {
|
||||
expect(result.fatal, false);
|
||||
expect(result.code, 0);
|
||||
|
||||
final TestUsageEvent event = (globals.flutterUsage as TestUsage).events.first;
|
||||
expect(event.category, 'hot');
|
||||
expect(event.parameter, 'restart');
|
||||
expect(
|
||||
event.parameters?.hotEventTargetPlatform,
|
||||
getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
);
|
||||
expect(fakeVmServiceHost?.hasRemainingExpectations, false);
|
||||
|
||||
// Parse out the event of interest since we may have timing events with
|
||||
// the new analytics package
|
||||
final List<Event> newEventList =
|
||||
final List<Event> hotRunnerInfoEvents =
|
||||
fakeAnalytics.sentEvents
|
||||
.where((Event e) => e.eventName.label == 'hot_runner_info')
|
||||
.toList();
|
||||
expect(newEventList, hasLength(1));
|
||||
final Event newEvent = newEventList.first;
|
||||
expect(newEvent.eventName.label, 'hot_runner_info');
|
||||
expect(hotRunnerInfoEvents, hasLength(1));
|
||||
final Event newEvent = hotRunnerInfoEvents.first;
|
||||
expect(newEvent.eventData['label'], 'restart');
|
||||
expect(
|
||||
newEvent.eventData['targetPlatform'],
|
||||
@ -1092,21 +1029,6 @@ void main() {
|
||||
expect(result.fatal, true);
|
||||
expect(result.code, 1);
|
||||
|
||||
expect(
|
||||
(globals.flutterUsage as TestUsage).events,
|
||||
contains(
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'exception',
|
||||
parameters: CustomDimensions(
|
||||
hotEventTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
|
||||
hotEventSdkName: 'Android',
|
||||
hotEventEmulator: false,
|
||||
hotEventFullRestart: true,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
|
@ -18,7 +18,6 @@ import 'package:flutter_tools/src/features.dart';
|
||||
import 'package:flutter_tools/src/isolated/devfs_web.dart';
|
||||
import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/resident_runner.dart';
|
||||
import 'package:flutter_tools/src/vmservice.dart';
|
||||
import 'package:test/fake.dart';
|
||||
@ -64,7 +63,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
|
||||
usage: TestUsage(),
|
||||
analytics: getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -99,7 +97,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
|
||||
usage: TestUsage(),
|
||||
analytics: getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -130,7 +127,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
|
||||
usage: TestUsage(),
|
||||
analytics: getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -160,7 +156,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
|
||||
usage: TestUsage(),
|
||||
analytics: getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -194,7 +189,6 @@ void main() {
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
|
||||
usage: TestUsage(),
|
||||
analytics: getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
|
@ -27,7 +27,6 @@ import 'package:flutter_tools/src/globals.dart' as globals;
|
||||
import 'package:flutter_tools/src/isolated/devfs_web.dart';
|
||||
import 'package:flutter_tools/src/isolated/resident_web_runner.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/resident_devtools_handler.dart';
|
||||
import 'package:flutter_tools/src/resident_runner.dart';
|
||||
import 'package:flutter_tools/src/vmservice.dart';
|
||||
@ -89,7 +88,6 @@ void main() {
|
||||
late FakeVmServiceHost fakeVmServiceHost;
|
||||
late MemoryFileSystem fileSystem;
|
||||
late ProcessManager processManager;
|
||||
late TestUsage testUsage;
|
||||
late FakeAnalytics fakeAnalytics;
|
||||
|
||||
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
|
||||
@ -99,7 +97,6 @@ void main() {
|
||||
}
|
||||
|
||||
setUp(() {
|
||||
testUsage = TestUsage();
|
||||
fileSystem = MemoryFileSystem.test();
|
||||
processManager = FakeProcessManager.any();
|
||||
debugConnection = FakeDebugConnection();
|
||||
@ -146,7 +143,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
);
|
||||
@ -176,7 +172,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
);
|
||||
@ -198,7 +193,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
);
|
||||
@ -210,7 +204,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
);
|
||||
@ -350,7 +343,6 @@ void main() {
|
||||
stayResident: false,
|
||||
fileSystem: fileSystem,
|
||||
logger: logger,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -379,7 +371,6 @@ void main() {
|
||||
stayResident: false,
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -595,7 +586,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -674,21 +664,6 @@ void main() {
|
||||
expect(result.code, 0);
|
||||
expect(webDevFS.mainUri.toString(), contains('entrypoint.dart'));
|
||||
|
||||
// ensure that analytics are sent.
|
||||
expect(testUsage.events, <TestUsageEvent>[
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'restart',
|
||||
parameters: CustomDimensions.fromMap(<String, String>{
|
||||
'cd27': 'web-javascript',
|
||||
'cd28': '',
|
||||
'cd29': 'false',
|
||||
'cd30': 'true',
|
||||
'cd13': '0',
|
||||
'cd48': 'false',
|
||||
}),
|
||||
),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -702,9 +677,6 @@ void main() {
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(testUsage.timings, const <TestTimingEvent>[
|
||||
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -717,7 +689,6 @@ void main() {
|
||||
);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => processManager,
|
||||
@ -781,21 +752,6 @@ void main() {
|
||||
expect(logger.statusText, contains('Restarted application in'));
|
||||
expect(result.code, 0);
|
||||
|
||||
// ensure that analytics are sent.
|
||||
expect(testUsage.events, <TestUsageEvent>[
|
||||
TestUsageEvent(
|
||||
'hot',
|
||||
'restart',
|
||||
parameters: CustomDimensions.fromMap(<String, String>{
|
||||
'cd27': 'web-javascript',
|
||||
'cd28': '',
|
||||
'cd29': 'false',
|
||||
'cd30': 'true',
|
||||
'cd13': '0',
|
||||
'cd48': 'false',
|
||||
}),
|
||||
),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -809,9 +765,6 @@ void main() {
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(testUsage.timings, const <TestTimingEvent>[
|
||||
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -824,7 +777,6 @@ void main() {
|
||||
);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => processManager,
|
||||
@ -857,12 +809,9 @@ void main() {
|
||||
expect(result.code, 0);
|
||||
|
||||
// web-server device does not send restart analytics
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
expect(testUsage.timings, isEmpty);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => processManager,
|
||||
@ -898,12 +847,9 @@ void main() {
|
||||
unawaited(residentWebRunner.run(connectionInfoCompleter: connectionInfoCompleter));
|
||||
|
||||
expect(await residentWebRunner.run(), 1);
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
expect(testUsage.timings, isEmpty);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => processManager,
|
||||
@ -969,12 +915,9 @@ void main() {
|
||||
|
||||
expect(result.code, 1);
|
||||
expect(result.message, contains('Failed to recompile application.'));
|
||||
expect(testUsage.events, isEmpty);
|
||||
expect(fakeAnalytics.sentEvents, isEmpty);
|
||||
expect(testUsage.timings, isEmpty);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => processManager,
|
||||
@ -1187,7 +1130,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
|
||||
fileSystem: fileSystem,
|
||||
logger: logger,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -1233,7 +1175,6 @@ void main() {
|
||||
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
|
||||
fileSystem: fileSystem,
|
||||
logger: logger,
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -1276,7 +1217,6 @@ void main() {
|
||||
stayResident: false,
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: globals.systemClock,
|
||||
devtoolsHandler: createNoOpHandler,
|
||||
@ -1568,7 +1508,6 @@ ResidentRunner setUpResidentRunner(
|
||||
flutterDevice,
|
||||
flutterProject: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory),
|
||||
debuggingOptions: debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug),
|
||||
usage: globals.flutterUsage,
|
||||
analytics: globals.analytics,
|
||||
systemClock: systemClock ?? SystemClock.fixed(DateTime.now()),
|
||||
fileSystem: globals.fs,
|
||||
|
@ -8,7 +8,6 @@ import 'package:flutter_tools/src/build_info.dart';
|
||||
import 'package:flutter_tools/src/compile.dart';
|
||||
import 'package:flutter_tools/src/devfs.dart';
|
||||
import 'package:flutter_tools/src/device.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/resident_devtools_handler.dart';
|
||||
import 'package:flutter_tools/src/resident_runner.dart';
|
||||
import 'package:flutter_tools/src/run_hot.dart';
|
||||
@ -32,7 +31,6 @@ void main() {
|
||||
'flutter-sdk',
|
||||
false,
|
||||
'test-reason',
|
||||
TestUsage(),
|
||||
const NoOpAnalytics(),
|
||||
);
|
||||
});
|
||||
|
@ -10,7 +10,6 @@ import 'package:flutter_tools/src/base/platform.dart';
|
||||
import 'package:flutter_tools/src/base/terminal.dart';
|
||||
import 'package:flutter_tools/src/cache.dart';
|
||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/resident_runner.dart';
|
||||
import 'package:flutter_tools/src/runner/flutter_command.dart';
|
||||
import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
|
||||
@ -30,7 +29,6 @@ void main() {
|
||||
group('FlutterCommandRunner', () {
|
||||
late MemoryFileSystem fileSystem;
|
||||
late Platform platform;
|
||||
late TestUsage testUsage;
|
||||
late FakeAnalytics fakeAnalytics;
|
||||
|
||||
setUpAll(() {
|
||||
@ -42,7 +40,6 @@ void main() {
|
||||
fileSystem.directory(_kFlutterRoot).createSync(recursive: true);
|
||||
fileSystem.directory(_kProjectRoot).createSync(recursive: true);
|
||||
fileSystem.currentDirectory = _kProjectRoot;
|
||||
testUsage = TestUsage();
|
||||
fakeAnalytics = getInitializedFakeAnalyticsInstance(
|
||||
fs: fileSystem,
|
||||
fakeFlutterVersion: FakeFlutterVersion(),
|
||||
@ -210,7 +207,6 @@ void main() {
|
||||
|
||||
await runner.run(<String>['--version']);
|
||||
expect(version.didFetchTagsAndUpdate, true);
|
||||
expect(testUsage.commands, contains(const TestUsageCommand('version')));
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -228,7 +224,6 @@ void main() {
|
||||
Platform: () => platform,
|
||||
FlutterVersion: () => FakeFlutterVersion(),
|
||||
OutputPreferences: () => OutputPreferences.test(),
|
||||
Usage: () => testUsage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
},
|
||||
);
|
||||
|
@ -19,14 +19,11 @@ import 'package:flutter_tools/src/base/user_messages.dart';
|
||||
import 'package:flutter_tools/src/build_info.dart';
|
||||
import 'package:flutter_tools/src/cache.dart';
|
||||
import 'package:flutter_tools/src/commands/run.dart';
|
||||
import 'package:flutter_tools/src/dart/pub.dart';
|
||||
import 'package:flutter_tools/src/device.dart';
|
||||
import 'package:flutter_tools/src/features.dart';
|
||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||
import 'package:flutter_tools/src/pre_run_validator.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/runner/flutter_command.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:test/fake.dart';
|
||||
import 'package:unified_analytics/testing.dart';
|
||||
import 'package:unified_analytics/unified_analytics.dart';
|
||||
@ -34,21 +31,13 @@ import 'package:unified_analytics/unified_analytics.dart';
|
||||
import '../../src/common.dart';
|
||||
import '../../src/context.dart';
|
||||
import '../../src/fake_devices.dart';
|
||||
import '../../src/fake_pub_deps.dart';
|
||||
import '../../src/fakes.dart';
|
||||
import '../../src/test_flutter_command_runner.dart';
|
||||
import 'utils.dart';
|
||||
|
||||
void main() {
|
||||
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
|
||||
// See https://github.com/flutter/flutter/issues/160257 for details.
|
||||
FeatureFlags enableExplicitPackageDependencies() {
|
||||
return TestFeatureFlags(isExplicitPackageDependenciesEnabled: true);
|
||||
}
|
||||
|
||||
group('Flutter Command', () {
|
||||
late FakeCache cache;
|
||||
late TestUsage usage;
|
||||
late FakeAnalytics fakeAnalytics;
|
||||
late FakeClock clock;
|
||||
late FakeProcessInfo processInfo;
|
||||
@ -66,7 +55,6 @@ void main() {
|
||||
setUp(() {
|
||||
Cache.disableLocking();
|
||||
cache = FakeCache();
|
||||
usage = TestUsage();
|
||||
clock = FakeClock();
|
||||
processInfo = FakeProcessInfo();
|
||||
processInfo.maxRss = 10;
|
||||
@ -237,6 +225,7 @@ void main() {
|
||||
},
|
||||
);
|
||||
|
||||
@isTest
|
||||
void testUsingCommandContext(String testName, dynamic Function() testBody) {
|
||||
testUsingContext(
|
||||
testName,
|
||||
@ -246,7 +235,6 @@ void main() {
|
||||
ProcessInfo: () => processInfo,
|
||||
ProcessManager: () => processManager,
|
||||
SystemClock: () => clock,
|
||||
Usage: () => usage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
},
|
||||
);
|
||||
@ -263,10 +251,6 @@ void main() {
|
||||
);
|
||||
await flutterCommand.run();
|
||||
|
||||
expect(usage.events, <TestUsageEvent>[
|
||||
const TestUsageEvent('tool-command-result', 'dummy', label: 'success'),
|
||||
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'success', value: 10),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -291,10 +275,6 @@ void main() {
|
||||
);
|
||||
await flutterCommand.run();
|
||||
|
||||
expect(usage.events, <TestUsageEvent>[
|
||||
const TestUsageEvent('tool-command-result', 'dummy', label: 'warning'),
|
||||
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'warning', value: 10),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -318,10 +298,6 @@ void main() {
|
||||
},
|
||||
);
|
||||
await expectLater(() => flutterCommand.run(), throwsToolExit());
|
||||
expect(usage.events, <TestUsageEvent>[
|
||||
const TestUsageEvent('tool-command-result', 'dummy', label: 'fail'),
|
||||
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'fail', value: 10),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -430,10 +406,6 @@ void main() {
|
||||
signalController.add(mockSignal);
|
||||
await completer.future;
|
||||
|
||||
expect(usage.events, <TestUsageEvent>[
|
||||
const TestUsageEvent('tool-command-result', 'dummy', label: 'killed'),
|
||||
const TestUsageEvent('tool-command-max-rss', 'dummy', label: 'killed', value: 10),
|
||||
]);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -456,7 +428,6 @@ void main() {
|
||||
exitSignals: <ProcessSignal>[signalUnderTest],
|
||||
),
|
||||
SystemClock: () => clock,
|
||||
Usage: () => usage,
|
||||
Analytics: () => fakeAnalytics,
|
||||
},
|
||||
);
|
||||
@ -499,7 +470,6 @@ void main() {
|
||||
subForSigTerm: signalUnderTest,
|
||||
exitSignals: <ProcessSignal>[signalUnderTest],
|
||||
),
|
||||
Usage: () => usage,
|
||||
},
|
||||
);
|
||||
});
|
||||
@ -511,12 +481,6 @@ void main() {
|
||||
final DummyFlutterCommand flutterCommand = DummyFlutterCommand();
|
||||
await flutterCommand.run();
|
||||
|
||||
expect(
|
||||
usage.timings,
|
||||
contains(
|
||||
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -537,8 +501,6 @@ void main() {
|
||||
final DummyFlutterCommand flutterCommand = DummyFlutterCommand(noUsagePath: true);
|
||||
await flutterCommand.run();
|
||||
|
||||
expect(usage.timings, isEmpty);
|
||||
// Iterate through and count all the [Event.timing] instances
|
||||
int timingEventCounts = 0;
|
||||
for (final Event e in fakeAnalytics.sentEvents) {
|
||||
if (e.eventName == DashEvent.timing) {
|
||||
@ -570,17 +532,6 @@ void main() {
|
||||
);
|
||||
await flutterCommand.run();
|
||||
|
||||
expect(
|
||||
usage.timings,
|
||||
contains(
|
||||
const TestTimingEvent(
|
||||
'flutter',
|
||||
'dummy',
|
||||
Duration(milliseconds: 500),
|
||||
label: 'success-blah1-blah2-blah3',
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -605,12 +556,6 @@ void main() {
|
||||
);
|
||||
|
||||
await expectLater(() => flutterCommand.run(), throwsToolExit());
|
||||
expect(
|
||||
usage.timings,
|
||||
contains(
|
||||
const TestTimingEvent('flutter', 'dummy', Duration(milliseconds: 1000), label: 'fail'),
|
||||
),
|
||||
);
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
contains(
|
||||
@ -624,66 +569,6 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
testUsingContext(
|
||||
'reports null safety analytics when reportNullSafety is true',
|
||||
() async {
|
||||
globals.fs.file('lib/main.dart')
|
||||
..createSync(recursive: true)
|
||||
..writeAsStringSync('// @dart=2.12');
|
||||
globals.fs.file('pubspec.yaml').writeAsStringSync('name: example\n');
|
||||
globals.fs.file('.dart_tool/package_config.json')
|
||||
..createSync(recursive: true)
|
||||
..writeAsStringSync(r'''
|
||||
{
|
||||
"configVersion": 2,
|
||||
"packages": [
|
||||
{
|
||||
"name": "example",
|
||||
"rootUri": "../",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
}
|
||||
],
|
||||
"generated": "2020-12-02T19:30:53.862346Z",
|
||||
"generator": "pub",
|
||||
"generatorVersion": "2.12.0-76.0.dev"
|
||||
}
|
||||
''');
|
||||
final FakeReportingNullSafetyCommand command = FakeReportingNullSafetyCommand();
|
||||
final CommandRunner<void> runner = createTestCommandRunner(command);
|
||||
|
||||
await runner.run(<String>['test']);
|
||||
|
||||
expect(
|
||||
usage.events,
|
||||
containsAll(<TestUsageEvent>[
|
||||
const TestUsageEvent(
|
||||
NullSafetyAnalysisEvent.kNullSafetyCategory,
|
||||
'runtime-mode',
|
||||
label: 'NullSafetyMode.sound',
|
||||
),
|
||||
TestUsageEvent(
|
||||
NullSafetyAnalysisEvent.kNullSafetyCategory,
|
||||
'stats',
|
||||
parameters: CustomDimensions.fromMap(<String, String>{'cd49': '1', 'cd50': '1'}),
|
||||
),
|
||||
const TestUsageEvent(
|
||||
NullSafetyAnalysisEvent.kNullSafetyCategory,
|
||||
'language-version',
|
||||
label: '2.12',
|
||||
),
|
||||
]),
|
||||
);
|
||||
},
|
||||
overrides: <Type, Generator>{
|
||||
Pub: () => FakePub(),
|
||||
Usage: () => usage,
|
||||
FileSystem: () => fileSystem,
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
FeatureFlags: enableExplicitPackageDependencies,
|
||||
},
|
||||
);
|
||||
|
||||
testUsingContext(
|
||||
'use packagesPath to generate BuildInfo',
|
||||
() async {
|
||||
@ -1518,32 +1403,6 @@ class FakeTargetCommand extends FlutterCommand {
|
||||
String get name => 'test';
|
||||
}
|
||||
|
||||
class FakeReportingNullSafetyCommand extends FlutterCommand {
|
||||
FakeReportingNullSafetyCommand() {
|
||||
argParser.addFlag('debug');
|
||||
argParser.addFlag('release');
|
||||
argParser.addFlag('jit-release');
|
||||
argParser.addFlag('profile');
|
||||
}
|
||||
|
||||
@override
|
||||
String get description => 'test';
|
||||
|
||||
@override
|
||||
String get name => 'test';
|
||||
|
||||
@override
|
||||
bool get shouldRunPub => true;
|
||||
|
||||
@override
|
||||
bool get reportNullSafety => true;
|
||||
|
||||
@override
|
||||
Future<FlutterCommandResult> runCommand() async {
|
||||
return FlutterCommandResult.success();
|
||||
}
|
||||
}
|
||||
|
||||
class FakeDdsCommand extends FlutterCommand {
|
||||
FakeDdsCommand() {
|
||||
addDdsOptions(verboseHelp: false);
|
||||
@ -1617,25 +1476,6 @@ class FakeClock extends Fake implements SystemClock {
|
||||
}
|
||||
}
|
||||
|
||||
class FakePub extends Fake implements Pub {
|
||||
@override
|
||||
Future<void> get({
|
||||
required PubContext context,
|
||||
required FlutterProject project,
|
||||
bool upgrade = false,
|
||||
bool offline = false,
|
||||
String? flutterRootOverride,
|
||||
bool checkUpToDate = false,
|
||||
bool shouldSkipThirdPartyGenerator = true,
|
||||
PubOutputMode outputMode = PubOutputMode.all,
|
||||
}) async {}
|
||||
|
||||
@override
|
||||
Future<Map<String, Object?>> deps(FlutterProject project) {
|
||||
return FakePubWithPrimedDeps().deps(project);
|
||||
}
|
||||
}
|
||||
|
||||
class _TestDeviceManager extends DeviceManager {
|
||||
_TestDeviceManager({required super.logger});
|
||||
List<Device> devices = <Device>[];
|
||||
|
@ -80,7 +80,6 @@ void main() {
|
||||
logger: logger,
|
||||
processManager: FakeProcessManager.any(),
|
||||
buildSystem: buildSystem,
|
||||
usage: testUsage,
|
||||
flutterVersion: flutterVersion,
|
||||
fileSystem: fileSystem,
|
||||
analytics: fakeAnalytics,
|
||||
@ -104,22 +103,6 @@ void main() {
|
||||
// Runs ScrubGeneratedPluginRegistrant migrator.
|
||||
expect(logger.traceText, contains('generated_plugin_registrant.dart not found. Skipping.'));
|
||||
|
||||
// Sends build config event
|
||||
expect(
|
||||
testUsage.events,
|
||||
unorderedEquals(<TestUsageEvent>[
|
||||
const TestUsageEvent(
|
||||
'build',
|
||||
'web',
|
||||
label: 'web-compile',
|
||||
parameters: CustomDimensions(
|
||||
buildEventSettings:
|
||||
'optimizationLevel: 0; web-renderer: skwasm,canvaskit; web-target: wasm,js;',
|
||||
),
|
||||
),
|
||||
]),
|
||||
);
|
||||
|
||||
expect(
|
||||
fakeAnalytics.sentEvents,
|
||||
containsAll(<Event>[
|
||||
@ -131,10 +114,6 @@ void main() {
|
||||
]),
|
||||
);
|
||||
|
||||
// Sends timing event.
|
||||
final TestTimingEvent timingEvent = testUsage.timings.single;
|
||||
expect(timingEvent.category, 'build');
|
||||
expect(timingEvent.variableName, 'dual-compile');
|
||||
expect(
|
||||
analyticsTimingEventExists(
|
||||
sentEvents: fakeAnalytics.sentEvents,
|
||||
@ -171,7 +150,6 @@ void main() {
|
||||
logger: logger,
|
||||
processManager: FakeProcessManager.any(),
|
||||
buildSystem: buildSystem,
|
||||
usage: testUsage,
|
||||
flutterVersion: flutterVersion,
|
||||
fileSystem: fileSystem,
|
||||
analytics: fakeAnalytics,
|
||||
|
Loading…
x
Reference in New Issue
Block a user