| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // ignore_for_file: implementation_imports |
| |
| import 'dart:async'; |
| |
| import 'package:fuchsia_logger/src/internal/_stdout_log_writer.dart'; |
| import 'package:logging/logging.dart'; |
| import 'package:test/test.dart'; |
| |
| void main() { |
| group('log messages', () { |
| test( |
| 'finest message', |
| () => _overridePrint((logger, _) => logger.finest('foo'), |
| (l) => expect(l, '[FINEST] foo'))); |
| |
| test( |
| 'finer message', |
| () => _overridePrint((logger, _) => logger.finer('foo'), |
| (l) => expect(l, '[FINER] foo'))); |
| |
| test( |
| 'fine message', |
| () => _overridePrint( |
| (logger, _) => logger.fine('foo'), (l) => expect(l, '[FINE] foo'))); |
| |
| test( |
| 'info message', |
| () => _overridePrint( |
| (logger, _) => logger.info('foo'), (l) => expect(l, '[INFO] foo'))); |
| |
| test( |
| 'config message', |
| () => _overridePrint((logger, _) => logger.config('foo'), |
| (l) => expect(l, '[CONFIG] foo'))); |
| |
| test( |
| 'warning message', |
| () => _overridePrint((logger, _) => logger.warning('foo'), |
| (l) => expect(l, '[WARNING] foo'))); |
| |
| test( |
| 'severe message', |
| () => _overridePrint((logger, _) => logger.severe('foo'), |
| (l) => expect(l, '[ERROR] foo'))); |
| |
| test( |
| 'shout message', |
| () => _overridePrint((logger, _) => logger.shout('foo'), |
| (l) => expect(l, '[FATAL] foo'))); |
| |
| test( |
| 'includes error object', |
| () => _overridePrint( |
| (logger, _) => logger.severe('foo', 'fail message'), |
| (l) => expect(l, '[ERROR] foo: fail message'))); |
| |
| test('includes stack trace', () { |
| final lines = <String>[]; |
| _overridePrint( |
| (logger, _) => logger.severe( |
| 'foo', 'fail message', StackTrace.fromString('my stacktrace')), |
| lines.add); |
| expect(lines.length, 2); |
| expect(lines[1], 'my stacktrace'); |
| }); |
| |
| test('includes code location', () { |
| _overridePrint((logger, writer) { |
| writer.forceShowCodeLocation = true; |
| logger.info('foo'); |
| }, (l) => expect(l, matches(r'INFO:stdout_log_writer_test.dart\(\d+\)'))); |
| }); |
| }); |
| |
| group('tags', () { |
| test('setting global tags adds them to the log line', () { |
| _overridePrint((logger, writer) { |
| writer.globalTags = ['baz', 'bar']; |
| logger.info('foo'); |
| }, (l) => expect(l, '[INFO:baz:bar] foo')); |
| }); |
| }); |
| } |
| |
| // helper method for capturing stdout. Code executed within the [zoned] function |
| // will pass the logged output to the [receiver] function with the line that |
| // would have gone to stdout. |
| void _overridePrint(void Function(Logger, StdoutLogWriter) zoned, |
| void Function(String) receiver) { |
| runZoned( |
| () { |
| final logger = Logger('foo'); |
| zoned(logger, StdoutLogWriter(logger: logger)); |
| logger.clearListeners(); |
| }, |
| zoneSpecification: ZoneSpecification( |
| print: (Zone self, ZoneDelegate parent, Zone zone, String line) { |
| receiver(line); |
| }, |
| ), |
| ); |
| } |