// 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); }); }