# Copyright 2015 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 unittest

from dashboard import quick_logger
from dashboard import testing_common


class QuickLoggerTest(testing_common.TestCase):

  def testQuickLogger_SaveAndGetNewLogEntry(self):
    template = '{message}{extra}'
    formatter = quick_logger.Formatter(template, extra='!')
    logger = quick_logger.QuickLogger('a_namespace', 'a_log_name', formatter)
    logger.Log('Hello %s', 'world')
    logger.Save()
    logs = quick_logger.Get('a_namespace', 'a_log_name')
    self.assertEqual(len(logs), 1)
    self.assertEqual(logs[0].message, 'Hello world!')

  def testQuickLogger_LogSizeAndNumberAtSizeLimit(self):
    logger = quick_logger.QuickLogger('a_namespace', 'a_log_name')
    for i in xrange(quick_logger._MAX_NUM_RECORD):
      logger.Log(str(i%2) * quick_logger._MAX_MSG_SIZE)
    logger.Save()
    logs = quick_logger.Get('a_namespace', 'a_log_name')
    self.assertEqual(len(logs), quick_logger._MAX_NUM_RECORD)

  def testQuickLogger_MultipleLogs_UsesCorrectOrder(self):
    logger = quick_logger.QuickLogger('a_namespace', 'a_log_name')
    for i in xrange(quick_logger._MAX_NUM_RECORD + 10):
      logger.Log(i)
    logger.Save()
    logs = quick_logger.Get('a_namespace', 'a_log_name')
    self.assertEqual(len(logs), quick_logger._MAX_NUM_RECORD)
    # First record is the last log added.
    self.assertEqual(logs[0].message, str(quick_logger._MAX_NUM_RECORD + 9))


if __name__ == '__main__':
  unittest.main()
