Skip to content

Commit 11a77a8

Browse files
committed
Added getter to await init futures, closes #61
1 parent 6d3d90c commit 11a77a8

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

lib/src/logger.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class Logger {
3232

3333
static final Set<OutputCallback> _outputCallbacks = {};
3434

35+
late final Future<void> _initialization;
3536
final LogFilter _filter;
3637
final LogPrinter _printer;
3738
final LogOutput _output;
@@ -50,14 +51,22 @@ class Logger {
5051
}) : _filter = filter ?? defaultFilter(),
5152
_printer = printer ?? defaultPrinter(),
5253
_output = output ?? defaultOutput() {
53-
_filter.init();
54+
var filterInit = _filter.init();
5455
if (level != null) {
5556
_filter.level = level;
5657
}
57-
_printer.init();
58-
_output.init();
58+
var printerInit = _printer.init();
59+
var outputInit = _output.init();
60+
_initialization = Future.wait([filterInit, printerInit, outputInit]);
5961
}
6062

63+
/// Future indicating if the initialization of the
64+
/// logger components (filter, printer and output) has been finished.
65+
///
66+
/// This is only necessary if your [LogFilter]/[LogPrinter]/[LogOutput]
67+
/// uses `async` in their `init` method.
68+
Future<void> get init => _initialization;
69+
6170
/// Log a message at level [Level.verbose].
6271
@Deprecated(
6372
"[Level.verbose] is being deprecated in favor of [Level.trace], use [t] instead.")

test/logger_test.dart

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,56 @@ class _CallbackPrinter extends LogPrinter {
3636
}
3737
}
3838

39+
class _AsyncFilter extends LogFilter {
40+
final Duration delay;
41+
bool initialized = false;
42+
43+
_AsyncFilter(this.delay);
44+
45+
@override
46+
Future<void> init() async {
47+
await Future.delayed(delay);
48+
initialized = true;
49+
}
50+
51+
@override
52+
bool shouldLog(LogEvent event) => false;
53+
}
54+
55+
class _AsyncPrinter extends LogPrinter {
56+
final Duration delay;
57+
bool initialized = false;
58+
59+
_AsyncPrinter(this.delay);
60+
61+
@override
62+
Future<void> init() async {
63+
await Future.delayed(delay);
64+
initialized = true;
65+
}
66+
67+
@override
68+
List<String> log(LogEvent event) => [event.message.toString()];
69+
}
70+
71+
class _AsyncOutput extends LogOutput {
72+
final Duration delay;
73+
bool initialized = false;
74+
75+
_AsyncOutput(this.delay);
76+
77+
@override
78+
Future<void> init() async {
79+
await Future.delayed(delay);
80+
initialized = true;
81+
}
82+
83+
@override
84+
void output(OutputEvent event) {
85+
// No-op.
86+
}
87+
}
88+
3989
/// Test class for the lazy-initialization of variables.
4090
class LazyLogger {
4191
static bool? printed;
@@ -235,4 +285,43 @@ void main() {
235285
LazyLogger.logger.i("This is an info message and should not show");
236286
expect(LazyLogger.printed, isNull);
237287
});
288+
289+
test('Async Filter Initialization', () async {
290+
var comp = _AsyncFilter(const Duration(milliseconds: 100));
291+
var logger = Logger(
292+
filter: comp,
293+
);
294+
295+
expect(comp.initialized, false);
296+
await Future.delayed(const Duration(milliseconds: 50));
297+
expect(comp.initialized, false);
298+
await logger.init;
299+
expect(comp.initialized, true);
300+
});
301+
302+
test('Async Printer Initialization', () async {
303+
var comp = _AsyncPrinter(const Duration(milliseconds: 100));
304+
var logger = Logger(
305+
printer: comp,
306+
);
307+
308+
expect(comp.initialized, false);
309+
await Future.delayed(const Duration(milliseconds: 50));
310+
expect(comp.initialized, false);
311+
await logger.init;
312+
expect(comp.initialized, true);
313+
});
314+
315+
test('Async Output Initialization', () async {
316+
var comp = _AsyncOutput(const Duration(milliseconds: 100));
317+
var logger = Logger(
318+
output: comp,
319+
);
320+
321+
expect(comp.initialized, false);
322+
await Future.delayed(const Duration(milliseconds: 50));
323+
expect(comp.initialized, false);
324+
await logger.init;
325+
expect(comp.initialized, true);
326+
});
238327
}

0 commit comments

Comments
 (0)