blob: 05fab15f174248d7d265e08629c0050392cd6c64 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io' as io;
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:test/test.dart';
import 'package:unified_analytics/src/enums.dart';
import 'package:unified_analytics/unified_analytics.dart';
void main() {
late MemoryFileSystem fs;
late Directory home;
late Analytics initializationAnalytics;
late Analytics analytics;
const homeDirName = 'home';
const initialTool = DashTool.flutterTool;
const toolsMessageVersion = 1;
const toolsMessage = 'toolsMessage';
const flutterChannel = 'flutterChannel';
const flutterVersion = 'flutterVersion';
const dartVersion = 'dartVersion';
const platform = DevicePlatform.macos;
final testEvent = Event.hotReloadTime(timeMs: 50);
setUp(() {
// Setup the filesystem with the home directory
final fsStyle =
io.Platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix;
fs = MemoryFileSystem.test(style: fsStyle);
home = fs.directory(homeDirName);
// This is the first analytics instance that will be used to demonstrate
// that events will not be sent with the first run of analytics
initializationAnalytics = Analytics.fake(
tool: initialTool,
homeDirectory: home,
flutterChannel: flutterChannel,
toolsMessageVersion: toolsMessageVersion,
toolsMessage: toolsMessage,
flutterVersion: flutterVersion,
dartVersion: dartVersion,
fs: fs,
platform: platform,
);
initializationAnalytics.clientShowedMessage();
// The main analytics instance, other instances can be spawned within tests
// to test how to instances running together work
//
// This instance should have the same parameters as the one above for
// [initializationAnalytics]
analytics = Analytics.fake(
tool: initialTool,
homeDirectory: home,
flutterChannel: flutterChannel,
toolsMessageVersion: toolsMessageVersion,
toolsMessage: toolsMessage,
flutterVersion: flutterVersion,
dartVersion: dartVersion,
fs: fs,
platform: platform,
);
analytics.clientShowedMessage();
});
test('Suppression works as expected', () async {
analytics.suppressTelemetry();
analytics.send(testEvent);
final logFileStats = analytics.logFileStats();
expect(logFileStats, isNull,
reason: 'Returns null because no records have been recorded');
});
test('Second instance is not suppressed', () async {
analytics.suppressTelemetry();
analytics.send(testEvent);
final logFileStats = analytics.logFileStats();
expect(logFileStats, isNull,
reason: 'Returns null because no records have been recorded');
// The newly created instance will not be suppressed
final secondAnalytics = Analytics.fake(
tool: initialTool,
homeDirectory: home,
flutterChannel: flutterChannel,
toolsMessageVersion: toolsMessageVersion,
toolsMessage: toolsMessage,
flutterVersion: flutterVersion,
dartVersion: dartVersion,
fs: fs,
platform: platform,
);
// Using a new event here to differentiate from the first one
final newEvent = Event.commandExecuted(count: 2, name: 'commandName');
secondAnalytics.send(newEvent);
// Both instances of `Analytics` should now have data retrieved
// from `LogFileStats()` even though only the second instance
// was the instance to send an event
final secondLogFileStats = analytics.logFileStats()!;
final thirdLogFileStats = secondAnalytics.logFileStats()!;
// Series of checks for each parameter in logFileStats
expect(secondLogFileStats.startDateTime, thirdLogFileStats.startDateTime);
expect(secondLogFileStats.minsFromStartDateTime,
thirdLogFileStats.minsFromStartDateTime);
expect(secondLogFileStats.endDateTime, thirdLogFileStats.endDateTime);
expect(secondLogFileStats.minsFromEndDateTime,
thirdLogFileStats.minsFromEndDateTime);
expect(secondLogFileStats.sessionCount, thirdLogFileStats.sessionCount);
expect(secondLogFileStats.flutterChannelCount,
thirdLogFileStats.flutterChannelCount);
expect(secondLogFileStats.toolCount, thirdLogFileStats.toolCount);
expect(secondLogFileStats.recordCount, thirdLogFileStats.recordCount);
expect(secondLogFileStats.eventCount, thirdLogFileStats.eventCount);
// Ensure the correct data is in the object
expect(secondLogFileStats.eventCount.containsKey(newEvent.eventName.label),
true);
expect(secondLogFileStats.eventCount[newEvent.eventName.label], 1);
});
}