Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1567)

Unified Diff: infra_libs/time_functions/testing.py

Issue 2213143002: Add infra_libs as a bootstrap dependency. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Removed the ugly import hack Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: infra_libs/time_functions/testing.py
diff --git a/infra_libs/time_functions/testing.py b/infra_libs/time_functions/testing.py
deleted file mode 100644
index 3eef8e33a8e298dbeae916d88f54f224cbb6465b..0000000000000000000000000000000000000000
--- a/infra_libs/time_functions/testing.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# 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.
-
-
-"""Provides functions to mock current time in tests."""
-
-import datetime
-import functools
-import mock
-import pytz
-import tzlocal
-
-
-def mock_datetime_utc(*dec_args, **dec_kwargs):
- """Overrides built-in datetime and date classes to always return a given time.
-
- Args:
- Same arguments as datetime.datetime accepts to mock UTC time.
-
- Example usage:
- @mock_datetime_utc(2015, 10, 11, 20, 0, 0)
- def my_test(self):
- hour_ago_utc = datetime.datetime.utcnow() - datetime.timedelta(hours=1)
- self.assertEqual(hour_ago_utc, datetime.datetime(2015, 10, 11, 19, 0, 0))
-
- Note that if you are using now() and today() methods, you should also use
- mock_timezone decorator to have consistent test results across timezones:
-
- @mock_timezone('US/Pacific')
- @mock_datetime_utc(2015, 10, 11, 20, 0, 0)
- def my_test(self):
- local_dt = datetime.datetime.now()
- self.assertEqual(local_dt, datetime.datetime(2015, 10, 11, 12, 0, 0))
- """
- # We record original values currently stored in the datetime.datetime and
- # datetime.date here. Note that they are no necessarily vanilla Python types
- # and can already be mock classes - this can happen if nested mocking is used.
- original_datetime = datetime.datetime
- original_date = datetime.date
-
- # Our metaclass must be derived from the parent class metaclass, but if the
- # parent class doesn't have one, we use 'type' type.
- class MockDateTimeMeta(original_datetime.__dict__.get('__metaclass__', type)):
- @classmethod
- def __instancecheck__(cls, instance):
- return isinstance(instance, original_datetime)
-
- class _MockDateTime(original_datetime):
- __metaclass__ = MockDateTimeMeta
- mock_utcnow = original_datetime(*dec_args, **dec_kwargs)
-
- @classmethod
- def utcnow(cls):
- return cls.mock_utcnow
-
- @classmethod
- def now(cls, tz=None):
- if not tz:
- tz = tzlocal.get_localzone()
- tzaware_utcnow = pytz.utc.localize(cls.mock_utcnow)
- return tz.normalize(tzaware_utcnow.astimezone(tz)).replace(tzinfo=None)
-
- @classmethod
- def today(cls):
- return cls.now().date()
-
- @classmethod
- def fromtimestamp(cls, timestamp, tz=None):
- if not tz:
- # TODO(sergiyb): This may fail for some unclear reason because pytz
- # doesn't find normal timezones such as 'Europe/Berlin'. This seems to
- # happen only in appengine/chromium_try_flakes tests, and not in tests
- # for this module itself.
- tz = tzlocal.get_localzone()
- tzaware_dt = pytz.utc.localize(cls.utcfromtimestamp(timestamp))
- return tz.normalize(tzaware_dt.astimezone(tz)).replace(tzinfo=None)
-
- # Our metaclass must be derived from the parent class metaclass, but if the
- # parent class doesn't have one, we use 'type' type.
- class MockDateMeta(original_date.__dict__.get('__metaclass__', type)):
- @classmethod
- def __instancecheck__(cls, instance):
- return isinstance(instance, original_date)
-
- class _MockDate(original_date):
- __metaclass__ = MockDateMeta
-
- @classmethod
- def today(cls):
- return _MockDateTime.today()
-
- @classmethod
- def fromtimestamp(cls, timestamp, tz=None):
- return _MockDateTime.fromtimestamp(timestamp, tz).date()
-
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kwargs):
- with mock.patch('datetime.datetime', _MockDateTime):
- with mock.patch('datetime.date', _MockDate):
- return func(*args, **kwargs)
- return wrapper
- return decorator
-
-
-def mock_timezone(tzname):
- """Mocks tzlocal.get_localzone method to always return a given timezone.
-
- This should be used in combination with mock_datetime_utc in order to achieve
- consistent test results accross timezones if datetime.now, datetime.today or
- date.today functions are used.
-
- Args:
- tzname: Name of the timezone to be used (as passed to pytz.timezone).
- """
- # TODO(sergiyb): Also mock other common libraries, e.g. time, pytz.reference.
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kwargs):
- with mock.patch('tzlocal.get_localzone', lambda: pytz.timezone(tzname)):
- return func(*args, **kwargs)
- return wrapper
- return decorator

Powered by Google App Engine
This is Rietveld 408576698