diff --git a/.github/workflows/unified_analytics.yml b/.github/workflows/unified_analytics.yml index cc45d5e988..9f4f160e7d 100644 --- a/.github/workflows/unified_analytics.yml +++ b/.github/workflows/unified_analytics.yml @@ -3,7 +3,6 @@ permissions: read-all on: pull_request: - branches: [ main ] paths: - '.github/workflows/unified_analytics.yml' - 'pkgs/unified_analytics/**' diff --git a/pkgs/unified_analytics/lib/src/log_handler.dart b/pkgs/unified_analytics/lib/src/log_handler.dart index 286f4a64c7..57eecfcacb 100644 --- a/pkgs/unified_analytics/lib/src/log_handler.dart +++ b/pkgs/unified_analytics/lib/src/log_handler.dart @@ -6,6 +6,7 @@ import 'dart:convert'; import 'package:clock/clock.dart'; import 'package:file/file.dart'; +import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; import 'constants.dart'; @@ -161,16 +162,21 @@ class LogFileStats { class LogHandler { final FileSystem fs; final Directory homeDirectory; - final File logFile; + File _logFile; final ErrorHandler _errorHandler; + File get logFile => _logFile; + + @visibleForTesting + set logFile(File value) => _logFile = value; + /// A log handler constructor that will delegate saving /// logs and retrieving stats from the persisted log. LogHandler({ required this.fs, required this.homeDirectory, required ErrorHandler errorHandler, - }) : logFile = fs.file(p.join( + }) : _logFile = fs.file(p.join( homeDirectory.path, kDartToolDirectoryName, kLogFileName, @@ -186,7 +192,7 @@ class LogHandler { // Parse each line of the log file through [LogItem], // some returned records may be null if malformed, they will be // removed later through `whereType` - final records = logFile + final records = _logFile .readAsLinesSync() .map((String e) { try { @@ -283,26 +289,26 @@ class LogHandler { /// or less than [kLogFileLength] records. void save({required Map data}) { try { - final stat = logFile.statSync(); + final stat = _logFile.statSync(); List records; if (stat.size > kMaxLogFileSize) { - logFile.deleteSync(); - logFile.createSync(); + _logFile.deleteSync(); + _logFile.createSync(); records = []; } else { - records = logFile.readAsLinesSync(); + records = _logFile.readAsLinesSync(); } final content = '${jsonEncode(data)}\n'; // When the record count is less than the max, add as normal; // else drop the oldest records until equal to max if (records.length < kLogFileLength) { - logFile.writeAsStringSync(content, mode: FileMode.writeOnlyAppend); + _logFile.writeAsStringSync(content, mode: FileMode.writeOnlyAppend); } else { records.add(content); records = records.skip(records.length - kLogFileLength).toList(); - logFile.writeAsStringSync(records.join('\n')); + _logFile.writeAsStringSync(records.join('\n')); } } on FileSystemException { // Logging isn't important enough to warrant raising a diff --git a/pkgs/unified_analytics/test/log_handler_test.dart b/pkgs/unified_analytics/test/log_handler_test.dart index 1842cee553..50f7f3f414 100644 --- a/pkgs/unified_analytics/test/log_handler_test.dart +++ b/pkgs/unified_analytics/test/log_handler_test.dart @@ -12,6 +12,7 @@ import 'package:test/test.dart'; import 'package:unified_analytics/src/constants.dart'; import 'package:unified_analytics/src/enums.dart'; +import 'package:unified_analytics/src/error_handler.dart'; import 'package:unified_analytics/src/log_handler.dart'; import 'package:unified_analytics/src/utils.dart'; import 'package:unified_analytics/unified_analytics.dart'; @@ -207,19 +208,20 @@ void main() { test( 'Catches and discards any FileSystemException raised from attempting ' 'to write to the log file', () async { - final logFilePath = 'log.txt'; final fs = MemoryFileSystem.test(opHandle: (context, operation) { - if (context == logFilePath && operation == FileSystemOp.write) { + if (context.endsWith(kLogFileName) && operation == FileSystemOp.write) { throw FileSystemException( 'writeFrom failed', - logFilePath, + context, const OSError('No space left on device', 28), ); } }); - final logFile = fs.file(logFilePath); - logFile.createSync(); - final logHandler = LogHandler(logFile: logFile); + final logHandler = LogHandler( + fs: fs, + homeDirectory: fs.currentDirectory, + errorHandler: ErrorHandler(sendFunction: (_) {}), + ); logHandler.save(data: {}); }); @@ -228,7 +230,13 @@ void main() { var deletedLargeLogFile = false; var wroteDataToLogFile = false; const data = {}; - final logFile = _FakeFile('log.txt') + + final logHandler = LogHandler( + fs: fs, + homeDirectory: fs.currentDirectory, + errorHandler: ErrorHandler(sendFunction: (_) {}), + ); + logHandler.logFile = _FakeFile('log.txt') .._deleteSyncImpl = (() => deletedLargeLogFile = true) .._createSyncImpl = () {} .._statSyncImpl = (() => _FakeFileStat(kMaxLogFileSize + 1)) @@ -237,7 +245,6 @@ void main() { expect(mode, FileMode.writeOnlyAppend); wroteDataToLogFile = true; }; - final logHandler = LogHandler(logFile: logFile); logHandler.save(data: data); expect(deletedLargeLogFile, isTrue); @@ -247,7 +254,7 @@ void main() { test('does not delete log file if smaller than kMaxLogFileSize', () async { var wroteDataToLogFile = false; const data = {}; - final logFile = _FakeFile('log.txt') + final fakeLogFile = _FakeFile('log.txt') .._deleteSyncImpl = (() => fail('called logFile.deleteSync() when file was less than ' 'kMaxLogFileSize')) @@ -259,7 +266,12 @@ void main() { expect(mode, FileMode.writeOnlyAppend); wroteDataToLogFile = true; }; - final logHandler = LogHandler(logFile: logFile); + final logHandler = LogHandler( + fs: fs, + homeDirectory: fs.currentDirectory, + errorHandler: ErrorHandler(sendFunction: (_) {}), + ); + logHandler.logFile = fakeLogFile; logHandler.save(data: data); expect(wroteDataToLogFile, isTrue);