blob: 691bc62701b995a4a0f3aeb46c9db5028d134de8 [file] [log] [blame]
# Copyright 2014 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.
from datetime import datetime
from datetime import timedelta
import mock
import unittest
from libs import time_util
class TimeUtilTest(unittest.TestCase):
def testConvertToTimestamp(self):
self.assertEqual(
1490918400, time_util.ConvertToTimestamp(
datetime(2017, 03, 31, 0, 0, 0)))
def testRemoveMicrosecondsFromDelta(self):
date1 = datetime(2016, 5, 1, 1, 1, 1, 1)
date2 = datetime(2016, 5, 1, 1, 1, 1, 2)
delta = date2 - date1
self.assertEqual(
time_util.RemoveMicrosecondsFromDelta(delta).microseconds, 0)
def testFormatTimedelta(self):
self.assertIsNone(time_util.FormatTimedelta(None))
self.assertEqual(time_util.FormatTimedelta(timedelta(0, 0)), '00:00:00')
self.assertEqual(time_util.FormatTimedelta(timedelta(0, 1)), '00:00:01')
self.assertEqual(time_util.FormatTimedelta(timedelta(0, 60)), '00:01:00')
self.assertEqual(time_util.FormatTimedelta(timedelta(0, 3600)), '01:00:00')
self.assertEqual(time_util.FormatTimedelta(timedelta(0, 0, 1)), '00:00:00')
self.assertEqual(
time_util.FormatTimedelta(
datetime(2018, 1, 2, 1) - datetime(2018, 1, 1, 1), with_days=True),
'1 day, 00:00:00')
self.assertEqual(
time_util.FormatTimedelta(
datetime(2018, 1, 3, 1) - datetime(2018, 1, 1), with_days=True),
'2 days, 01:00:00')
def testFormatDatetime(self):
self.assertIsNone(time_util.FormatDatetime(None))
self.assertEqual(
time_util.FormatDatetime(datetime(2016, 1, 2, 1, 2, 3)),
'2016-01-02 01:02:03 UTC')
self.assertEqual(
time_util.FormatDatetime(datetime(2016, 1, 2, 1, 2, 3), day_only=True),
'2016-01-02')
def testFormatDuration(self):
date1 = datetime(2016, 5, 1, 1, 1, 1)
date2 = datetime(2016, 5, 1, 1, 2, 1)
self.assertIsNone(time_util.FormatDuration(None, date1))
self.assertIsNone(time_util.FormatDuration(date1, None))
self.assertEqual('00:01:00', time_util.FormatDuration(date1, date2))
def testMicrosecondsToDatetime(self):
self.assertEqual(
datetime(2016, 2, 1, 22, 59, 34),
time_util.MicrosecondsToDatetime(1454367574000000))
self.assertIsNone(time_util.MicrosecondsToDatetime(None))
def testTimeZoneInfo(self):
naive_time = datetime(2016, 9, 1, 10, 0, 0)
tz = time_util.TimeZoneInfo('+0800')
self.assertEqual(tz.LocalToUTC(naive_time), datetime(2016, 9, 1, 2, 0, 0))
tz_negative = time_util.TimeZoneInfo('-0700')
self.assertEqual(
tz_negative.LocalToUTC(naive_time), datetime(2016, 9, 1, 17, 0, 0))
def testDatetimeFromString(self):
self.assertEqual(None, time_util.DatetimeFromString('None'))
self.assertEqual(None, time_util.DatetimeFromString(None))
iso_time_str = '2016-01-02T01:02:03.123456'
iso_time_datetime = time_util.DatetimeFromString(iso_time_str)
# Check that our function reverses datetime.isoformat
self.assertEqual(iso_time_datetime.isoformat(), iso_time_str)
self.assertEqual(iso_time_datetime,
time_util.DatetimeFromString(iso_time_datetime))
bq_time_str = ' 2018-03-27 08:39:00 UTC'
bq_time_datetime = datetime(2018, 3, 27, 8, 39)
self.assertEqual(bq_time_datetime,
time_util.DatetimeFromString(bq_time_str))
with self.assertRaises(ValueError):
time_util.DatetimeFromString('Yesterday, at 5 o\'clock')
def testSecondsToHMS(self):
self.assertIsNone(time_util.SecondsToHMS(None))
self.assertEqual('00:00:00', time_util.SecondsToHMS(0))
self.assertEqual('00:00:01', time_util.SecondsToHMS(1))
self.assertEqual('00:01:01', time_util.SecondsToHMS(61))
def testGetMostRecentUTCMidnight(self):
self.assertEqual(datetime, type(time_util.GetMostRecentUTCMidnight()))
@mock.patch.object(
time_util,
'GetMostRecentUTCMidnight',
return_value=datetime(2017, 3, 19, 0, 0, 0))
def testGetStartEndDates(self, _):
self.assertEqual(
(datetime(2017, 3, 18, 0, 0, 0), datetime(2017, 3, 20, 0, 0, 0)),
time_util.GetStartEndDates(None, None))
self.assertEqual((None, datetime(2017, 3, 20, 0, 0, 0)),
time_util.GetStartEndDates(None, '2017-03-19'))
self.assertEqual(
(datetime(2017, 3, 18, 0, 0, 0), datetime(2017, 3, 20, 0, 0, 0)),
time_util.GetStartEndDates('2017-03-18', None))
self.assertEqual(
(datetime(2017, 3, 15, 0, 0, 0), datetime(2017, 3, 16, 0, 0, 0)),
time_util.GetStartEndDates('2017-03-15', '2017-03-16'))
@mock.patch.object(
time_util,
'GetMostRecentUTCMidnight',
return_value=datetime(2017, 3, 19, 0, 0, 0))
def testGetStartEndDatesDefaultStartDefaultEnd(self, _):
default_start = datetime(2017, 3, 15, 0, 0, 0)
default_end = datetime(2017, 3, 16, 0, 0, 0)
self.assertEqual((default_start, default_end),
time_util.GetStartEndDates(
None,
None,
default_start=default_start,
default_end=default_end))
self.assertEqual((default_start, datetime(2017, 3, 20, 0, 0, 0)),
time_util.GetStartEndDates(
None, '2017-03-19', default_start=default_start))
self.assertEqual((datetime(2017, 3, 18, 0, 0, 0), default_end),
time_util.GetStartEndDates(
'2017-03-18', None, default_end=default_end))
@mock.patch.object(
time_util, 'GetUTCNow', return_value=datetime(2017, 4, 27, 8, 0, 0))
def testGetPSTNow(self, _):
self.assertEqual(datetime(2017, 4, 27, 0, 0, 0), time_util.GetPSTNow())
def testConvertPSTToUTC(self):
self.assertEqual(
datetime(2017, 4, 27, 8, 0, 0),
time_util.ConvertPSTToUTC(datetime(2017, 4, 27, 0, 0, 0)))
def testConvertUTCToPST(self):
self.assertEqual(
datetime(2017, 4, 27, 0, 0, 0),
time_util.ConvertUTCToPST(datetime(2017, 4, 27, 8, 0, 0)))
@mock.patch.object(
time_util, 'GetUTCNow', return_value=datetime(2017, 4, 27, 8, 0, 0))
def testGetDatetimeBeforeNow(self, _):
self.assertEqual(
datetime(2017, 4, 26, 8, 0, 0), time_util.GetDatetimeBeforeNow(days=1))
self.assertEqual(
datetime(2017, 4, 27, 7, 0, 0), time_util.GetDatetimeBeforeNow(hours=1))
self.assertEqual(
datetime(2017, 4, 26, 7, 0, 0),
time_util.GetDatetimeBeforeNow(days=1, hours=1))
@mock.patch.object(
time_util, 'GetUTCNow', return_value=datetime(2018, 4, 27, 8, 0, 0))
def testGetPreviousWeekMonday(self, _):
self.assertEqual(
datetime(2018, 4, 16, 0, 0, 0), time_util.GetPreviousWeekMonday())
def testGetMidnight(self):
self.assertEqual(
datetime(2018, 4, 16, 0, 0, 0),
time_util.GetMidnight(datetime(2018, 4, 16, 1, 2, 3)))