# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for merge_logs."""

from __future__ import print_function

import datetime
import sys

import dateutil.tz  # pylint: disable=import-error

from chromite.lib import cros_test_lib
from chromite.scripts import merge_logs

pytestmark = cros_test_lib.pytestmark_inside_only


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


TZOFFSET = dateutil.tz.tzoffset(None, -25200)


class ParseDateTestBase(cros_test_lib.MockTestCase):
  """Test that ParseDate behaves correctly."""

  def setUp(self):
    now = datetime.datetime(2017, 8, 1, 13, 14, 8, 357309)
    self.now_mock = self.PatchObject(merge_logs, 'Now', return_value=now)


class ParseDateTest(ParseDateTestBase):
  """Test that ParseDate behaves correctly."""

  def testBasicFunctionality(self):
    # ARC
    dt = merge_logs.ParseDate('2017-07-31 07:05:10.257860139-07:00')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 7, 5, 10, 257860,
                                           TZOFFSET))

    # CrOS
    dt = merge_logs.ParseDate('2017/07/31 09:18:08.871')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 9, 18, 8, 871000,
                                           TZOFFSET))

    # Status Log
    dt = merge_logs.ParseDate('Jul 31 09:17:02')
    self.assertEqual(dt, datetime.datetime(datetime.datetime.now().year, 7, 31,
                                           9, 17, 2, 0, TZOFFSET))

    # Sysinfo
    dt = merge_logs.ParseDate('2017-07-31T09:17:25.907285-07:00')
    self.assertEqual(
        dt, datetime.datetime(2017, 7, 31, 9, 17, 25, 907285, TZOFFSET))

  def testUTC(self):
    dt = merge_logs.ParseDate('2017-07-31T13:55:29.455280+00:00')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 13, 55, 29, 455280,
                                           dateutil.tz.tzutc()))

    dt = merge_logs.ParseDate('2017-07-31T09:17:25.907285Z')
    self.assertEqual(
        dt,
        datetime.datetime(2017, 7, 31, 9, 17, 25, 907285, dateutil.tz.tzutc()))


class ParseAutoservDateTest(ParseDateTestBase):
  """Test that ParseAutoservDate behaves correctly."""

  def testBasicFunctionality(self):
    dt = merge_logs.ParseAutoservDate('07/31 09:17:27.919')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 9, 17, 27, 919000,
                                           TZOFFSET))


class ParseChromeDateTest(ParseDateTestBase):
  """Test that ParseChromeDate behaves correctly."""

  def testBasicFunctionality(self):
    dt = merge_logs.ParseChromeDate('0731/072833.409065')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 7, 28, 33, 409065,
                                           TZOFFSET))


class ParsePowerdDateTest(ParseDateTestBase):
  """Test that ParsePowerdDate behaves correctly."""

  def testBasicFunctionality(self):
    dt = merge_logs.ParsePowerdDate('0731/070232')
    self.assertEqual(dt, datetime.datetime(2017, 7, 31, 7, 2, 32, 0,
                                           TZOFFSET))


class ParseFileContentsTest(cros_test_lib.TestCase):
  """Test that ParseFileContents behaves correctly."""

  def testParseSysinfoPatterns(self):
    filename = 'messages'
    content = """2017-07-31T07:05:10.257860-07:00 INFO ag[12]: Memory leak.
2017-07-31T07:05:10.257860Z INFO ag[12]: Memory leak."""

    logs = merge_logs.ParseFileContents(filename, content)
    lines = content.splitlines()

    self.assertEqual(len(logs), 2)
    self.assertEqual(logs[0].filename, filename)
    self.assertEqual(logs[0].date,
                     datetime.datetime(2017, 7, 31, 7, 5, 10, 257860, TZOFFSET))
    self.assertEqual(logs[0].log, lines[0])
    self.assertEqual(
        logs[1].date,
        datetime.datetime(2017, 7, 31, 7, 5, 10, 257860, dateutil.tz.tzutc()))
    self.assertEqual(logs[1].log, lines[1])
