Unverified Commit 17e0fe1a authored by Elias Yishak's avatar Elias Yishak Committed by GitHub

Migration for `HotEvent` for Flutter hot runner (#137717)

Related to tracker issue:
- https://github.com/flutter/flutter/issues/128251

For this migration, the `HotEvent` was being referenced in 2 additional files outside of `lib/src/reporting/events.dart`, shown below in the screenshot

<img width="257" alt="image" src="https://github.com/flutter/flutter/assets/42216813/97986f89-2253-4db1-9deb-bbced6321a16">
parent 925f3eee
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:async'; import 'dart:async';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service.dart';
import '../android/android_device.dart'; import '../android/android_device.dart';
...@@ -538,6 +539,7 @@ known, it can be explicitly provided to attach via the command-line, e.g. ...@@ -538,6 +539,7 @@ known, it can be explicitly provided to attach via the command-line, e.g.
dillOutputPath: stringArg('output-dill'), dillOutputPath: stringArg('output-dill'),
ipv6: usesIpv6, ipv6: usesIpv6,
flutterProject: flutterProject, flutterProject: flutterProject,
analytics: analytics,
) )
: ColdRunner( : ColdRunner(
flutterDevices, flutterDevices,
...@@ -570,6 +572,7 @@ class HotRunnerFactory { ...@@ -570,6 +572,7 @@ class HotRunnerFactory {
bool stayResident = true, bool stayResident = true,
bool ipv6 = false, bool ipv6 = false,
FlutterProject? flutterProject, FlutterProject? flutterProject,
required Analytics analytics,
}) => HotRunner( }) => HotRunner(
devices, devices,
target: target, target: target,
...@@ -581,5 +584,6 @@ class HotRunnerFactory { ...@@ -581,5 +584,6 @@ class HotRunnerFactory {
dillOutputPath: dillOutputPath, dillOutputPath: dillOutputPath,
stayResident: stayResident, stayResident: stayResident,
ipv6: ipv6, ipv6: ipv6,
analytics: analytics,
); );
} }
...@@ -545,6 +545,7 @@ class AppDomain extends Domain { ...@@ -545,6 +545,7 @@ class AppDomain extends Domain {
urlTunneller: options.webEnableExposeUrl! ? daemon.daemonDomain.exposeUrl : null, urlTunneller: options.webEnableExposeUrl! ? daemon.daemonDomain.exposeUrl : null,
machine: machine, machine: machine,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
logger: globals.logger, logger: globals.logger,
fileSystem: globals.fs, fileSystem: globals.fs,
...@@ -561,6 +562,7 @@ class AppDomain extends Domain { ...@@ -561,6 +562,7 @@ class AppDomain extends Domain {
multidexEnabled: multidexEnabled, multidexEnabled: multidexEnabled,
hostIsIde: true, hostIsIde: true,
machine: machine, machine: machine,
analytics: globals.analytics,
); );
} else { } else {
runner = ColdRunner( runner = ColdRunner(
......
...@@ -597,6 +597,7 @@ class RunCommand extends RunCommandBase { ...@@ -597,6 +597,7 @@ class RunCommand extends RunCommandBase {
stayResident: stayResident, stayResident: stayResident,
ipv6: ipv6 ?? false, ipv6: ipv6 ?? false,
multidexEnabled: boolArg('multidex'), multidexEnabled: boolArg('multidex'),
analytics: globals.analytics,
); );
} else if (webMode) { } else if (webMode) {
return webRunnerFactory!.createWebRunner( return webRunnerFactory!.createWebRunner(
...@@ -608,6 +609,7 @@ class RunCommand extends RunCommandBase { ...@@ -608,6 +609,7 @@ class RunCommand extends RunCommandBase {
stayResident: stayResident, stayResident: stayResident,
fileSystem: globals.fs, fileSystem: globals.fs,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
logger: globals.logger, logger: globals.logger,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
......
...@@ -89,6 +89,7 @@ class WebDriverService extends DriverService { ...@@ -89,6 +89,7 @@ class WebDriverService extends DriverService {
flutterProject: FlutterProject.current(), flutterProject: FlutterProject.current(),
fileSystem: globals.fs, fileSystem: globals.fs,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
logger: _logger, logger: _logger,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
......
...@@ -7,6 +7,7 @@ import 'dart:async'; ...@@ -7,6 +7,7 @@ import 'dart:async';
// ignore: import_of_legacy_library_into_null_safe // ignore: import_of_legacy_library_into_null_safe
import 'package:dwds/dwds.dart'; import 'package:dwds/dwds.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vmservice; import 'package:vm_service/vm_service.dart' as vmservice;
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
hide StackTrace; hide StackTrace;
...@@ -57,6 +58,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory { ...@@ -57,6 +58,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
required FileSystem fileSystem, required FileSystem fileSystem,
required SystemClock systemClock, required SystemClock systemClock,
required Usage usage, required Usage usage,
required Analytics analytics,
bool machine = false, bool machine = false,
}) { }) {
return ResidentWebRunner( return ResidentWebRunner(
...@@ -69,6 +71,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory { ...@@ -69,6 +71,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
urlTunneller: urlTunneller, urlTunneller: urlTunneller,
machine: machine, machine: machine,
usage: usage, usage: usage,
analytics: analytics,
systemClock: systemClock, systemClock: systemClock,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
...@@ -93,12 +96,14 @@ class ResidentWebRunner extends ResidentRunner { ...@@ -93,12 +96,14 @@ class ResidentWebRunner extends ResidentRunner {
required Logger logger, required Logger logger,
required SystemClock systemClock, required SystemClock systemClock,
required Usage usage, required Usage usage,
required Analytics analytics,
UrlTunneller? urlTunneller, UrlTunneller? urlTunneller,
ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler, ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler,
}) : _fileSystem = fileSystem, }) : _fileSystem = fileSystem,
_logger = logger, _logger = logger,
_systemClock = systemClock, _systemClock = systemClock,
_usage = usage, _usage = usage,
_analytics = analytics,
_urlTunneller = urlTunneller, _urlTunneller = urlTunneller,
super( super(
<FlutterDevice>[device], <FlutterDevice>[device],
...@@ -114,6 +119,7 @@ class ResidentWebRunner extends ResidentRunner { ...@@ -114,6 +119,7 @@ class ResidentWebRunner extends ResidentRunner {
final Logger _logger; final Logger _logger;
final SystemClock _systemClock; final SystemClock _systemClock;
final Usage _usage; final Usage _usage;
final Analytics _analytics;
final UrlTunneller? _urlTunneller; final UrlTunneller? _urlTunneller;
@override @override
...@@ -441,15 +447,25 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive). ...@@ -441,15 +447,25 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
// Don't track restart times for dart2js builds or web-server devices. // Don't track restart times for dart2js builds or web-server devices.
if (debuggingOptions.buildInfo.isDebug && deviceIsDebuggable) { if (debuggingOptions.buildInfo.isDebug && deviceIsDebuggable) {
_usage.sendTiming('hot', 'web-incremental-restart', elapsed); _usage.sendTiming('hot', 'web-incremental-restart', elapsed);
final String sdkName = await device!.device!.sdkNameAndVersion;
HotEvent( HotEvent(
'restart', 'restart',
targetPlatform: getNameForTargetPlatform(TargetPlatform.web_javascript), targetPlatform: getNameForTargetPlatform(TargetPlatform.web_javascript),
sdkName: await device!.device!.sdkNameAndVersion, sdkName: sdkName,
emulator: false, emulator: false,
fullRestart: true, fullRestart: true,
reason: reason, reason: reason,
overallTimeInMs: elapsed.inMilliseconds, overallTimeInMs: elapsed.inMilliseconds,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: 'restart',
targetPlatform: getNameForTargetPlatform(TargetPlatform.web_javascript),
sdkName: sdkName,
emulator: false,
fullRestart: true,
reason: reason,
overallTimeInMs: elapsed.inMilliseconds
));
} }
return OperationResult.ok; return OperationResult.ok;
} }
......
...@@ -7,6 +7,7 @@ import 'dart:async'; ...@@ -7,6 +7,7 @@ import 'dart:async';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:pool/pool.dart'; import 'package:pool/pool.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import 'base/context.dart'; import 'base/context.dart';
...@@ -94,17 +95,20 @@ class HotRunner extends ResidentRunner { ...@@ -94,17 +95,20 @@ class HotRunner extends ResidentRunner {
ReloadSourcesHelper reloadSourcesHelper = defaultReloadSourcesHelper, ReloadSourcesHelper reloadSourcesHelper = defaultReloadSourcesHelper,
ReassembleHelper reassembleHelper = _defaultReassembleHelper, ReassembleHelper reassembleHelper = _defaultReassembleHelper,
NativeAssetsBuildRunner? buildRunner, NativeAssetsBuildRunner? buildRunner,
}) : _stopwatchFactory = stopwatchFactory, required Analytics analytics,
_reloadSourcesHelper = reloadSourcesHelper, }) : _stopwatchFactory = stopwatchFactory,
_reassembleHelper = reassembleHelper, _reloadSourcesHelper = reloadSourcesHelper,
_reassembleHelper = reassembleHelper,
_buildRunner = buildRunner, _buildRunner = buildRunner,
super( _analytics = analytics,
super(
hotMode: true, hotMode: true,
); );
final StopwatchFactory _stopwatchFactory; final StopwatchFactory _stopwatchFactory;
final ReloadSourcesHelper _reloadSourcesHelper; final ReloadSourcesHelper _reloadSourcesHelper;
final ReassembleHelper _reassembleHelper; final ReassembleHelper _reassembleHelper;
final Analytics _analytics;
final bool benchmarkMode; final bool benchmarkMode;
final File? applicationBinary; final File? applicationBinary;
...@@ -429,15 +433,29 @@ class HotRunner extends ResidentRunner { ...@@ -429,15 +433,29 @@ class HotRunner extends ResidentRunner {
})); }));
} }
unawaited(appStartedCompleter?.future.then((_) => HotEvent('reload-ready', unawaited(appStartedCompleter?.future.then((_) {
targetPlatform: _targetPlatform!, HotEvent(
sdkName: _sdkName!, 'reload-ready',
emulator: _emulator!, targetPlatform: _targetPlatform!,
fullRestart: false, sdkName: _sdkName!,
overallTimeInMs: appStartedTimer.elapsed.inMilliseconds, emulator: _emulator!,
compileTimeInMs: totalCompileTime.inMilliseconds, fullRestart: false,
transferTimeInMs: totalLaunchAppTime.inMilliseconds, overallTimeInMs: appStartedTimer.elapsed.inMilliseconds,
).send())); compileTimeInMs: totalCompileTime.inMilliseconds,
transferTimeInMs: totalLaunchAppTime.inMilliseconds,
).send();
_analytics.send(Event.hotRunnerInfo(
label: 'reload-ready',
targetPlatform: _targetPlatform!,
sdkName: _sdkName!,
emulator: _emulator!,
fullRestart: false,
overallTimeInMs: appStartedTimer.elapsed.inMilliseconds,
compileTimeInMs: totalCompileTime.inMilliseconds,
transferTimeInMs: totalLaunchAppTime.inMilliseconds,
));
}));
try { try {
final List<bool> results = await Future.wait(startupTasks); final List<bool> results = await Future.wait(startupTasks);
...@@ -828,6 +846,21 @@ class HotRunner extends ResidentRunner { ...@@ -828,6 +846,21 @@ class HotRunner extends ResidentRunner {
findInvalidatedTimeInMs: result.updateFSReport?.findInvalidatedDuration.inMilliseconds, findInvalidatedTimeInMs: result.updateFSReport?.findInvalidatedDuration.inMilliseconds,
scannedSourcesCount: result.updateFSReport?.scannedSourcesCount, scannedSourcesCount: result.updateFSReport?.scannedSourcesCount,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: 'restart',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: true,
reason: reason,
overallTimeInMs: restartTimer.elapsed.inMilliseconds,
syncedBytes: result.updateFSReport?.syncedBytes,
invalidatedSourcesCount: result.updateFSReport?.invalidatedSourcesCount,
transferTimeInMs: result.updateFSReport?.transferDuration.inMilliseconds,
compileTimeInMs: result.updateFSReport?.compileDuration.inMilliseconds,
findInvalidatedTimeInMs: result.updateFSReport?.findInvalidatedDuration.inMilliseconds,
scannedSourcesCount: result.updateFSReport?.scannedSourcesCount,
));
} }
} on vm_service.SentinelException catch (err, st) { } on vm_service.SentinelException catch (err, st) {
restartEvent = 'exception'; restartEvent = 'exception';
...@@ -846,6 +879,14 @@ class HotRunner extends ResidentRunner { ...@@ -846,6 +879,14 @@ class HotRunner extends ResidentRunner {
fullRestart: true, fullRestart: true,
reason: reason, reason: reason,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: restartEvent,
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: true,
reason: reason,
));
} }
status?.cancel(); status?.cancel();
} }
...@@ -895,6 +936,14 @@ class HotRunner extends ResidentRunner { ...@@ -895,6 +936,14 @@ class HotRunner extends ResidentRunner {
fullRestart: false, fullRestart: false,
reason: reason, reason: reason,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: 'reload-barred',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: false,
reason: reason,
));
} else { } else {
HotEvent('exception', HotEvent('exception',
targetPlatform: targetPlatform!, targetPlatform: targetPlatform!,
...@@ -903,6 +952,14 @@ class HotRunner extends ResidentRunner { ...@@ -903,6 +952,14 @@ class HotRunner extends ResidentRunner {
fullRestart: false, fullRestart: false,
reason: reason, reason: reason,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: 'exception',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: false,
reason: reason,
));
} }
return OperationResult(errorCode, errorMessage, fatal: true); return OperationResult(errorCode, errorMessage, fatal: true);
} finally { } finally {
...@@ -965,6 +1022,7 @@ class HotRunner extends ResidentRunner { ...@@ -965,6 +1022,7 @@ class HotRunner extends ResidentRunner {
emulator, emulator,
reason, reason,
globals.flutterUsage, globals.flutterUsage,
globals.analytics,
); );
if (result.code != 0) { if (result.code != 0) {
return result; return result;
...@@ -1024,6 +1082,27 @@ class HotRunner extends ResidentRunner { ...@@ -1024,6 +1082,27 @@ class HotRunner extends ResidentRunner {
reassembleTimeInMs: reassembleTimer.elapsed.inMilliseconds, reassembleTimeInMs: reassembleTimer.elapsed.inMilliseconds,
reloadVMTimeInMs: reloadVMTimer.elapsed.inMilliseconds, reloadVMTimeInMs: reloadVMTimer.elapsed.inMilliseconds,
).send(); ).send();
_analytics.send(Event.hotRunnerInfo(
label: 'reload',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: false,
reason: reason,
overallTimeInMs: reloadInMs,
finalLibraryCount: firstReloadDetails['finalLibraryCount'] as int? ?? 0,
syncedLibraryCount: firstReloadDetails['receivedLibraryCount'] as int? ?? 0,
syncedClassesCount: firstReloadDetails['receivedClassesCount'] as int? ?? 0,
syncedProceduresCount: firstReloadDetails['receivedProceduresCount'] as int? ?? 0,
syncedBytes: updatedDevFS.syncedBytes,
invalidatedSourcesCount: updatedDevFS.invalidatedSourcesCount,
transferTimeInMs: updatedDevFS.transferDuration.inMilliseconds,
compileTimeInMs: updatedDevFS.compileDuration.inMilliseconds,
findInvalidatedTimeInMs: updatedDevFS.findInvalidatedDuration.inMilliseconds,
scannedSourcesCount: updatedDevFS.scannedSourcesCount,
reassembleTimeInMs: reassembleTimer.elapsed.inMilliseconds,
reloadVMTimeInMs: reloadVMTimer.elapsed.inMilliseconds,
));
if (shouldReportReloadTime) { if (shouldReportReloadTime) {
globals.printTrace('Hot reload performed in ${getElapsedAsMilliseconds(reloadDuration)}.'); globals.printTrace('Hot reload performed in ${getElapsedAsMilliseconds(reloadDuration)}.');
...@@ -1186,6 +1265,7 @@ typedef ReloadSourcesHelper = Future<OperationResult> Function( ...@@ -1186,6 +1265,7 @@ typedef ReloadSourcesHelper = Future<OperationResult> Function(
bool? emulator, bool? emulator,
String? reason, String? reason,
Usage usage, Usage usage,
Analytics analytics,
); );
@visibleForTesting @visibleForTesting
...@@ -1199,6 +1279,7 @@ Future<OperationResult> defaultReloadSourcesHelper( ...@@ -1199,6 +1279,7 @@ Future<OperationResult> defaultReloadSourcesHelper(
bool? emulator, bool? emulator,
String? reason, String? reason,
Usage usage, Usage usage,
Analytics analytics,
) async { ) async {
final Stopwatch vmReloadTimer = Stopwatch()..start(); final Stopwatch vmReloadTimer = Stopwatch()..start();
const String entryPath = 'main.dart.incremental.dill'; const String entryPath = 'main.dart.incremental.dill';
...@@ -1239,6 +1320,14 @@ Future<OperationResult> defaultReloadSourcesHelper( ...@@ -1239,6 +1320,14 @@ Future<OperationResult> defaultReloadSourcesHelper(
reason: reason, reason: reason,
usage: usage, usage: usage,
).send(); ).send();
analytics.send(Event.hotRunnerInfo(
label: 'reload-reject',
targetPlatform: targetPlatform,
sdkName: sdkName,
emulator: emulator,
fullRestart: false,
reason: reason,
));
// Reset devFS lastCompileTime to ensure the file will still be marked // Reset devFS lastCompileTime to ensure the file will still be marked
// as dirty on subsequent reloads. // as dirty on subsequent reloads.
_resetDevFSCompileTime(flutterDevices); _resetDevFSCompileTime(flutterDevices);
......
...@@ -7,6 +7,7 @@ import 'package:args/command_runner.dart'; ...@@ -7,6 +7,7 @@ import 'package:args/command_runner.dart';
import 'package:file/file.dart'; import 'package:file/file.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import 'package:unified_analytics/unified_analytics.dart';
import '../application_package.dart'; import '../application_package.dart';
import '../base/common.dart'; import '../base/common.dart';
...@@ -223,6 +224,11 @@ abstract class FlutterCommand extends Command<void> { ...@@ -223,6 +224,11 @@ abstract class FlutterCommand extends Command<void> {
bool _excludeDebug = false; bool _excludeDebug = false;
bool _excludeRelease = false; bool _excludeRelease = false;
/// Grabs the [Analytics] instance from the global context. It is defined
/// at the [FlutterCommand] level to enable any classes that extend it to
/// easily reference it or overwrite as necessary.
Analytics get analytics => globals.analytics;
void requiresPubspecYaml() { void requiresPubspecYaml() {
_requiresPubspecYaml = true; _requiresPubspecYaml = true;
} }
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:unified_analytics/unified_analytics.dart';
import '../base/context.dart'; import '../base/context.dart';
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../base/logger.dart'; import '../base/logger.dart';
...@@ -31,6 +33,7 @@ abstract class WebRunnerFactory { ...@@ -31,6 +33,7 @@ abstract class WebRunnerFactory {
required FileSystem fileSystem, required FileSystem fileSystem,
required SystemClock systemClock, required SystemClock systemClock,
required Usage usage, required Usage usage,
required Analytics analytics,
bool machine = false, bool machine = false,
}); });
} }
...@@ -48,7 +48,7 @@ dependencies: ...@@ -48,7 +48,7 @@ dependencies:
http_multi_server: 3.2.1 http_multi_server: 3.2.1
convert: 3.1.1 convert: 3.1.1
async: 2.11.0 async: 2.11.0
unified_analytics: 5.1.0 unified_analytics: 5.2.0
cli_config: 0.1.2 cli_config: 0.1.2
graphs: 2.3.1 graphs: 2.3.1
...@@ -114,4 +114,4 @@ dartdoc: ...@@ -114,4 +114,4 @@ dartdoc:
# Exclude this package from the hosted API docs. # Exclude this package from the hosted API docs.
nodoc: true nodoc: true
# PUBSPEC CHECKSUM: 490d # PUBSPEC CHECKSUM: 080e
...@@ -33,6 +33,7 @@ import 'package:flutter_tools/src/run_hot.dart'; ...@@ -33,6 +33,7 @@ import 'package:flutter_tools/src/run_hot.dart';
import 'package:flutter_tools/src/vmservice.dart'; import 'package:flutter_tools/src/vmservice.dart';
import 'package:multicast_dns/multicast_dns.dart'; import 'package:multicast_dns/multicast_dns.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import '../../src/common.dart'; import '../../src/common.dart';
...@@ -1199,6 +1200,7 @@ class FakeHotRunnerFactory extends Fake implements HotRunnerFactory { ...@@ -1199,6 +1200,7 @@ class FakeHotRunnerFactory extends Fake implements HotRunnerFactory {
bool stayResident = true, bool stayResident = true,
bool ipv6 = false, bool ipv6 = false,
FlutterProject? flutterProject, FlutterProject? flutterProject,
Analytics? analytics,
}) { }) {
if (_artifactTester != null) { if (_artifactTester != null) {
for (final FlutterDevice device in devices) { for (final FlutterDevice device in devices) {
......
...@@ -17,6 +17,7 @@ import 'package:flutter_tools/src/reporting/reporting.dart'; ...@@ -17,6 +17,7 @@ import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/web/web_runner.dart'; import 'package:flutter_tools/src/web/web_runner.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:webdriver/sync_io.dart' as sync_io; import 'package:webdriver/sync_io.dart' as sync_io;
import '../../src/common.dart'; import '../../src/common.dart';
...@@ -303,7 +304,21 @@ class FakeWebRunnerFactory implements WebRunnerFactory { ...@@ -303,7 +304,21 @@ class FakeWebRunnerFactory implements WebRunnerFactory {
final bool doResolveToError; final bool doResolveToError;
@override @override
ResidentRunner createWebRunner(FlutterDevice device, {String? target, bool? stayResident, FlutterProject? flutterProject, bool? ipv6, DebuggingOptions? debuggingOptions, UrlTunneller? urlTunneller, Logger? logger, FileSystem? fileSystem, SystemClock? systemClock, Usage? usage, bool machine = false}) { ResidentRunner createWebRunner(
FlutterDevice device, {
String? target,
bool? stayResident,
FlutterProject? flutterProject,
bool? ipv6,
DebuggingOptions? debuggingOptions,
UrlTunneller? urlTunneller,
Logger? logger,
FileSystem? fileSystem,
SystemClock? systemClock,
Usage? usage,
Analytics? analytics,
bool machine = false,
}) {
expect(stayResident, isTrue); expect(stayResident, isTrue);
return FakeResidentRunner( return FakeResidentRunner(
doResolveToError: doResolveToError, doResolveToError: doResolveToError,
......
...@@ -25,6 +25,7 @@ import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode, Target ...@@ -25,6 +25,7 @@ import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode, Target
import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli; import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli;
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import '../src/common.dart'; import '../src/common.dart';
...@@ -120,10 +121,15 @@ void main() { ...@@ -120,10 +121,15 @@ void main() {
final FakeResidentCompiler residentCompiler = FakeResidentCompiler(); final FakeResidentCompiler residentCompiler = FakeResidentCompiler();
late FileSystem fileSystem; late FileSystem fileSystem;
late TestUsage testUsage; late TestUsage testUsage;
late FakeAnalytics fakeAnalytics;
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
testUsage = TestUsage(); testUsage = TestUsage();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
);
}); });
group('fails to setup', () { group('fails to setup', () {
...@@ -149,6 +155,8 @@ void main() { ...@@ -149,6 +155,8 @@ void main() {
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
analytics: fakeAnalytics,
).restart(fullRestart: true); ).restart(fullRestart: true);
expect(result.isOk, false); expect(result.isOk, false);
expect(result.message, 'setupHotRestart failed'); expect(result.message, 'setupHotRestart failed');
...@@ -185,6 +193,7 @@ void main() { ...@@ -185,6 +193,7 @@ void main() {
false, false,
true, true,
), ),
analytics: fakeAnalytics,
).restart(); ).restart();
expect(result.isOk, false); expect(result.isOk, false);
expect(result.message, 'setupHotReload failed'); expect(result.message, 'setupHotReload failed');
...@@ -217,6 +226,7 @@ void main() { ...@@ -217,6 +226,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
analytics: fakeAnalytics,
).cleanupAfterSignal(); ).cleanupAfterSignal();
expect(shutdownTestingConfig.shutdownHookCalled, true); expect(shutdownTestingConfig.shutdownHookCalled, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
...@@ -239,6 +249,7 @@ void main() { ...@@ -239,6 +249,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
analytics: fakeAnalytics,
).preExit(); ).preExit();
expect(shutdownTestingConfig.shutdownHookCalled, true); expect(shutdownTestingConfig.shutdownHookCalled, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
...@@ -288,6 +299,7 @@ void main() { ...@@ -288,6 +299,7 @@ void main() {
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
stopwatchFactory: fakeStopwatchFactory, stopwatchFactory: fakeStopwatchFactory,
analytics: fakeAnalytics,
).restart(fullRestart: true); ).restart(fullRestart: true);
expect(result.isOk, true); expect(result.isOk, true);
...@@ -306,6 +318,23 @@ void main() { ...@@ -306,6 +318,23 @@ void main() {
hotEventScannedSourcesCount: 8, hotEventScannedSourcesCount: 8,
)), )),
]); ]);
expect(fakeAnalytics.sentEvents, contains(
Event.hotRunnerInfo(
label: 'restart',
targetPlatform: 'flutter-tester',
sdkName: 'Tester',
emulator: false,
fullRestart: true,
syncedBytes: 4,
invalidatedSourcesCount: 2,
transferTimeInMs: 32000,
overallTimeInMs: 64000,
compileTimeInMs: 16000,
findInvalidatedTimeInMs: 128000,
scannedSourcesCount: 8
)
));
expect(testingConfig.updateDevFSCompleteCalled, true); expect(testingConfig.updateDevFSCompleteCalled, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
HotRunnerConfig: () => testingConfig, HotRunnerConfig: () => testingConfig,
...@@ -357,6 +386,7 @@ void main() { ...@@ -357,6 +386,7 @@ void main() {
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
stopwatchFactory: fakeStopwatchFactory, stopwatchFactory: fakeStopwatchFactory,
analytics: fakeAnalytics,
reloadSourcesHelper: ( reloadSourcesHelper: (
HotRunner hotRunner, HotRunner hotRunner,
List<FlutterDevice?> flutterDevices, List<FlutterDevice?> flutterDevices,
...@@ -367,6 +397,7 @@ void main() { ...@@ -367,6 +397,7 @@ void main() {
bool? emulator, bool? emulator,
String? reason, String? reason,
Usage usage, Usage usage,
Analytics? analytics,
) async { ) async {
firstReloadDetails['finalLibraryCount'] = 2; firstReloadDetails['finalLibraryCount'] = 2;
firstReloadDetails['receivedLibraryCount'] = 3; firstReloadDetails['receivedLibraryCount'] = 3;
...@@ -408,6 +439,28 @@ void main() { ...@@ -408,6 +439,28 @@ void main() {
hotEventReloadVMTimeInMs: 512000, hotEventReloadVMTimeInMs: 512000,
)), )),
]); ]);
expect(fakeAnalytics.sentEvents, contains(
Event.hotRunnerInfo(
label: 'reload',
targetPlatform: 'flutter-tester',
sdkName: 'Tester',
emulator: false,
fullRestart: false,
finalLibraryCount: 2,
syncedLibraryCount: 3,
syncedClassesCount: 4,
syncedProceduresCount: 5,
syncedBytes: 8,
invalidatedSourcesCount: 6,
transferTimeInMs: 32000,
overallTimeInMs: 128000,
compileTimeInMs: 16000,
findInvalidatedTimeInMs: 64000,
scannedSourcesCount: 16,
reassembleTimeInMs: 256000,
reloadVMTimeInMs: 512000
),
));
expect(testingConfig.updateDevFSCompleteCalled, true); expect(testingConfig.updateDevFSCompleteCalled, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
HotRunnerConfig: () => testingConfig, HotRunnerConfig: () => testingConfig,
...@@ -439,6 +492,7 @@ void main() { ...@@ -439,6 +492,7 @@ void main() {
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
analytics: fakeAnalytics,
); );
await expectLater(runner.restart(fullRestart: true), throwsA(isA<Exception>().having((Exception e) => e.toString(), 'message', 'Exception: updateDevFS failed'))); await expectLater(runner.restart(fullRestart: true), throwsA(isA<Exception>().having((Exception e) => e.toString(), 'message', 'Exception: updateDevFS failed')));
...@@ -473,6 +527,7 @@ void main() { ...@@ -473,6 +527,7 @@ void main() {
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
analytics: fakeAnalytics,
); );
await expectLater(runner.restart(), throwsA(isA<Exception>().having((Exception e) => e.toString(), 'message', 'Exception: updateDevFS failed'))); await expectLater(runner.restart(), throwsA(isA<Exception>().having((Exception e) => e.toString(), 'message', 'Exception: updateDevFS failed')));
...@@ -490,9 +545,14 @@ void main() { ...@@ -490,9 +545,14 @@ void main() {
group('hot attach', () { group('hot attach', () {
late FileSystem fileSystem; late FileSystem fileSystem;
late FakeAnalytics fakeAnalytics;
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
);
}); });
testUsingContext('Exits with code 2 when HttpException is thrown ' testUsingContext('Exits with code 2 when HttpException is thrown '
...@@ -515,6 +575,7 @@ void main() { ...@@ -515,6 +575,7 @@ void main() {
final int exitCode = await HotRunner(devices, final int exitCode = await HotRunner(devices,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
analytics: fakeAnalytics,
).attach(needsFullRestart: false); ).attach(needsFullRestart: false);
expect(exitCode, 2); expect(exitCode, 2);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
...@@ -527,6 +588,17 @@ void main() { ...@@ -527,6 +588,17 @@ void main() {
}); });
group('hot cleanupAtFinish()', () { group('hot cleanupAtFinish()', () {
late FileSystem fileSystem;
late FakeAnalytics fakeAnalytics;
setUp(() {
fileSystem = MemoryFileSystem.test();
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
);
});
testUsingContext('disposes each device', () async { testUsingContext('disposes each device', () async {
final FakeDevice device1 = FakeDevice(); final FakeDevice device1 = FakeDevice();
final FakeDevice device2 = FakeDevice(); final FakeDevice device2 = FakeDevice();
...@@ -541,6 +613,7 @@ void main() { ...@@ -541,6 +613,7 @@ void main() {
await HotRunner(devices, await HotRunner(devices,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
analytics: fakeAnalytics,
).cleanupAtFinish(); ).cleanupAtFinish();
expect(device1.disposed, true); expect(device1.disposed, true);
...@@ -554,12 +627,17 @@ void main() { ...@@ -554,12 +627,17 @@ void main() {
group('native assets', () { group('native assets', () {
late TestHotRunnerConfig testingConfig; late TestHotRunnerConfig testingConfig;
late FileSystem fileSystem; late FileSystem fileSystem;
late FakeAnalytics fakeAnalytics;
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
testingConfig = TestHotRunnerConfig( testingConfig = TestHotRunnerConfig(
successfulHotRestartSetup: true, successfulHotRestartSetup: true,
); );
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
);
}); });
testUsingContext('native assets restart', () async { testUsingContext('native assets restart', () async {
final FakeDevice device = FakeDevice(); final FakeDevice device = FakeDevice();
...@@ -601,6 +679,7 @@ void main() { ...@@ -601,6 +679,7 @@ void main() {
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
buildRunner: buildRunner, buildRunner: buildRunner,
analytics: fakeAnalytics,
); );
final OperationResult result = await hotRunner.restart(fullRestart: true); final OperationResult result = await hotRunner.restart(fullRestart: true);
expect(result.isOk, true); expect(result.isOk, true);
...@@ -659,6 +738,7 @@ void main() { ...@@ -659,6 +738,7 @@ void main() {
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler, devtoolsHandler: createNoOpHandler,
buildRunner: buildRunner, buildRunner: buildRunner,
analytics: fakeAnalytics,
); );
expect( expect(
() => hotRunner.run(), () => hotRunner.run(),
......
...@@ -23,6 +23,7 @@ import 'package:test/fake.dart'; ...@@ -23,6 +23,7 @@ import 'package:test/fake.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fakes.dart';
import '../src/test_build_system.dart'; import '../src/test_build_system.dart';
void main() { void main() {
...@@ -54,6 +55,10 @@ void main() { ...@@ -54,6 +55,10 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(), usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
),
); );
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
...@@ -81,6 +86,10 @@ void main() { ...@@ -81,6 +86,10 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(), usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
),
); );
expect(() => residentWebRunner.run(), throwsToolExit()); expect(() => residentWebRunner.run(), throwsToolExit());
...@@ -103,6 +112,10 @@ void main() { ...@@ -103,6 +112,10 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(), usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
),
); );
expect(() async => residentWebRunner.run(), throwsException); expect(() async => residentWebRunner.run(), throwsException);
...@@ -124,6 +137,10 @@ void main() { ...@@ -124,6 +137,10 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(), usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
),
); );
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
...@@ -150,6 +167,10 @@ void main() { ...@@ -150,6 +167,10 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
systemClock: SystemClock.fixed(DateTime(0, 0, 0)), systemClock: SystemClock.fixed(DateTime(0, 0, 0)),
usage: TestUsage(), usage: TestUsage(),
analytics: getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: FakeFlutterVersion(),
),
); );
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
......
...@@ -34,6 +34,7 @@ import 'package:flutter_tools/src/web/web_device.dart'; ...@@ -34,6 +34,7 @@ import 'package:flutter_tools/src/web/web_device.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
...@@ -41,6 +42,7 @@ import '../src/common.dart'; ...@@ -41,6 +42,7 @@ import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fake_process_manager.dart'; import '../src/fake_process_manager.dart';
import '../src/fake_vm_services.dart'; import '../src/fake_vm_services.dart';
import '../src/fakes.dart' as test_fakes;
const List<VmServiceExpectation> kAttachLogExpectations = const List<VmServiceExpectation> kAttachLogExpectations =
<VmServiceExpectation>[ <VmServiceExpectation>[
...@@ -103,6 +105,7 @@ void main() { ...@@ -103,6 +105,7 @@ void main() {
late FileSystem fileSystem; late FileSystem fileSystem;
late ProcessManager processManager; late ProcessManager processManager;
late TestUsage testUsage; late TestUsage testUsage;
late FakeAnalytics fakeAnalytics;
setUp(() { setUp(() {
testUsage = TestUsage(); testUsage = TestUsage();
...@@ -122,6 +125,10 @@ void main() { ...@@ -122,6 +125,10 @@ void main() {
..device = mockDevice ..device = mockDevice
..generator = residentCompiler; ..generator = residentCompiler;
fileSystem.file('.packages').writeAsStringSync('\n'); fileSystem.file('.packages').writeAsStringSync('\n');
fakeAnalytics = getInitializedFakeAnalyticsInstance(
fs: fileSystem,
fakeFlutterVersion: test_fakes.FakeFlutterVersion(),
);
}); });
void setupMocks() { void setupMocks() {
...@@ -156,6 +163,7 @@ void main() { ...@@ -156,6 +163,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -188,6 +196,7 @@ void main() { ...@@ -188,6 +196,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -207,6 +216,7 @@ void main() { ...@@ -207,6 +216,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
...@@ -220,6 +230,7 @@ void main() { ...@@ -220,6 +230,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -353,6 +364,7 @@ void main() { ...@@ -353,6 +364,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -379,6 +391,7 @@ void main() { ...@@ -379,6 +391,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -579,6 +592,7 @@ void main() { ...@@ -579,6 +592,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
fakeVmServiceHost = fakeVmServiceHost =
...@@ -663,11 +677,25 @@ void main() { ...@@ -663,11 +677,25 @@ void main() {
'cd48': 'false' 'cd48': 'false'
})), })),
]); ]);
expect(
fakeAnalytics.sentEvents,
contains(
Event.hotRunnerInfo(
label: 'restart',
targetPlatform: 'web-javascript',
sdkName: '',
emulator: false,
fullRestart: true,
overallTimeInMs: 0,
),
),
);
expect(testUsage.timings, const <TestTimingEvent>[ expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero), TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]); ]);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Usage: () => testUsage, Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
...@@ -735,11 +763,25 @@ void main() { ...@@ -735,11 +763,25 @@ void main() {
'cd48': 'false' 'cd48': 'false'
})), })),
]); ]);
expect(
fakeAnalytics.sentEvents,
contains(
Event.hotRunnerInfo(
label: 'restart',
targetPlatform: 'web-javascript',
sdkName: '',
emulator: false,
fullRestart: true,
overallTimeInMs: 0,
),
),
);
expect(testUsage.timings, const <TestTimingEvent>[ expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero), TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
]); ]);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Usage: () => testUsage, Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
...@@ -771,9 +813,11 @@ void main() { ...@@ -771,9 +813,11 @@ void main() {
// web-server device does not send restart analytics // web-server device does not send restart analytics
expect(testUsage.events, isEmpty); expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty); expect(testUsage.timings, isEmpty);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Usage: () => testUsage, Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
...@@ -803,9 +847,11 @@ void main() { ...@@ -803,9 +847,11 @@ void main() {
expect(await residentWebRunner.run(), 1); expect(await residentWebRunner.run(), 1);
expect(testUsage.events, isEmpty); expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty); expect(testUsage.timings, isEmpty);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Usage: () => testUsage, Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
...@@ -868,9 +914,11 @@ void main() { ...@@ -868,9 +914,11 @@ void main() {
expect(result.code, 1); expect(result.code, 1);
expect(result.message, contains('Failed to recompile application.')); expect(result.message, contains('Failed to recompile application.'));
expect(testUsage.events, isEmpty); expect(testUsage.events, isEmpty);
expect(fakeAnalytics.sentEvents, isEmpty);
expect(testUsage.timings, isEmpty); expect(testUsage.timings, isEmpty);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Usage: () => testUsage, Usage: () => testUsage,
Analytics: () => fakeAnalytics,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
...@@ -1054,6 +1102,7 @@ void main() { ...@@ -1054,6 +1102,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -1102,6 +1151,7 @@ void main() { ...@@ -1102,6 +1151,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -1144,6 +1194,7 @@ void main() { ...@@ -1144,6 +1194,7 @@ void main() {
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
...@@ -1344,6 +1395,7 @@ ResidentRunner setUpResidentRunner( ...@@ -1344,6 +1395,7 @@ ResidentRunner setUpResidentRunner(
debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
usage: globals.flutterUsage, usage: globals.flutterUsage,
analytics: globals.analytics,
systemClock: systemClock ?? SystemClock.fixed(DateTime.now()), systemClock: systemClock ?? SystemClock.fixed(DateTime.now()),
fileSystem: globals.fs, fileSystem: globals.fs,
logger: logger ?? BufferLogger.test(), logger: logger ?? BufferLogger.test(),
......
...@@ -8,6 +8,7 @@ import 'package:flutter_tools/src/resident_runner.dart'; ...@@ -8,6 +8,7 @@ import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/run_hot.dart';
import 'package:flutter_tools/src/vmservice.dart'; import 'package:flutter_tools/src/vmservice.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
//import '../src/context.dart'; //import '../src/context.dart';
...@@ -25,6 +26,7 @@ void main() { ...@@ -25,6 +26,7 @@ void main() {
false, false,
'test-reason', 'test-reason',
TestUsage(), TestUsage(),
NoOpAnalytics(),
); );
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment