// 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.

import 'dart:io';

import 'package:test/test.dart';
import 'package:zircon/zircon.dart';

import 'package:lib.app.dart/logging.dart';
import 'package:lib.app.dart/src/fuchsia_log_record.dart';

const int _lookBackTimeGap = 15 * 1000 * 1000 * 1000; // 15 sec in nanoseconds

const int _zxClockMonotonic = 0;

class LoggerStub {
  final List<LogWriterMessage> logMessages = <LogWriterMessage>[];

  void writeLogMessage(LogWriterMessage message) {
    logMessages.add(message);
  }
}

void main() {
  test('simple message', _testSimpleMessage);
  test('message with exception', _testMessageWithException);
}

void _testSimpleMessage() {
  LoggerStub logger = LoggerStub();
  setupLogger(
    logWriter: logger.writeLogMessage,
  );
  expect(logger.logMessages.isEmpty, true);

  log.infoT('hello', tag: 'tag');
  expect(logger.logMessages.length, equals(1));
  FuchsiaLogRecord underTest = logger.logMessages[0].logRecord;

  int now = Platform.isFuchsia
      ? System.clockGet(_zxClockMonotonic)
      : DateTime.now().microsecondsSinceEpoch * 1000;

  expect(underTest.systemTime, lessThanOrEqualTo(now));
  expect(underTest.systemTime, greaterThanOrEqualTo(now - _lookBackTimeGap));

  expect(underTest.localTag, equals('tag'));
  expect(underTest.level, equals(Level.INFO));
  expect(underTest.message, equals('hello'));
  expect(underTest.sequenceNumber, equals(1));
  expect(underTest.error, equals(null));
  expect(underTest.stackTrace, equals(null));

  log.info('world');
  expect(logger.logMessages.length, equals(2));
  underTest = logger.logMessages[1].logRecord;
  expect(underTest.sequenceNumber, equals(2));
}

void _testMessageWithException() {
  LoggerStub logger = LoggerStub();
  setupLogger(
    logWriter: logger.writeLogMessage,
  );
  expect(logger.logMessages.isEmpty, true);

  Exception exception = Exception('cause');
  log.infoT('hello',
      tag: 'tag', error: exception, stackTrace: StackTrace.current);
  expect(logger.logMessages.length, equals(1));
  FuchsiaLogRecord underTest = logger.logMessages[0].logRecord;

  int now = Platform.isFuchsia
      ? System.clockGet(_zxClockMonotonic)
      : DateTime.now().microsecondsSinceEpoch * 1000;

  expect(underTest.systemTime, lessThanOrEqualTo(now));
  expect(underTest.systemTime, greaterThanOrEqualTo(now - _lookBackTimeGap));

  expect(underTest.localTag, equals('tag'));
  expect(underTest.level, equals(Level.INFO));
  expect(underTest.message, equals('hello'));
  expect(underTest.error, equals(exception));
  expect(
      underTest.stackTrace.toString(), contains('_testMessageWithException'));
}
