error.dart 2.17 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Copyright 2016 The Chromium Authors. 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:async';
import 'dart:io' show stderr;

/// Standard error thrown by Flutter Driver API.
class DriverError extends Error {
  DriverError(this.message, [this.originalError, this.originalStackTrace]);

  /// Human-readable error message.
  final String message;

  final dynamic originalError;
  final dynamic originalStackTrace;

18
  @override
19 20 21 22 23 24 25
  String toString() {
    return '''DriverError: $message
Original error: $originalError
Original stack trace:
$originalStackTrace
    ''';
  }
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
}

// Whether someone redirected the log messages somewhere.
bool _noLogSubscribers = true;

final StreamController<LogRecord> _logger =
    new StreamController<LogRecord>.broadcast(sync: true, onListen: () {
      _noLogSubscribers = false;
    });

void _log(LogLevel level, String loggerName, Object message) {
  LogRecord record = new LogRecord._(level, loggerName, '$message');
  // If nobody expressed interest in rerouting log messages somewhere specific,
  // print them to stderr.
  if (_noLogSubscribers)
    stderr.writeln(record);
  else
    _logger.add(record);
}

/// Emits log records from Flutter Driver.
final Stream<LogRecord> flutterDriverLog = _logger.stream;

/// Severity of a log entry.
enum LogLevel { trace, info, warning, error, critical }

/// A log entry.
class LogRecord {
  const LogRecord._(this.level, this.loggerName, this.message);

  final LogLevel level;
  final String loggerName;
  final String message;

60
  @override
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  String toString() => '[${"$level".split(".").last}] $loggerName: $message';
}

/// Package-private; users should use other public logging libraries.
class Logger {
  Logger(this.name);

  final String name;

  void trace(Object message) {
    _log(LogLevel.trace, name, message);
  }

  void info(Object message) {
    _log(LogLevel.info, name, message);
  }

  void warning(Object message) {
    _log(LogLevel.warning, name, message);
  }

  void error(Object message) {
    _log(LogLevel.error, name, message);
  }

  void critical(Object message) {
    _log(LogLevel.critical, name, message);
  }
}