blob: 62ddaee7cdce6efde5c622cd825f0970828f5e50 [file] [log] [blame]
# Copyright 2016 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 signal
import time
import unittest
import common_util
class SerializeAttributesTestCase(unittest.TestCase):
class Foo(object):
def __init__(self, foo_fighters, whisky_bar):
# Pylint doesn't like foo and bar, but I guess musical references are OK.
self.foo_fighters = foo_fighters
self.whisky_bar = whisky_bar
def testSerialization(self):
foo_fighters = self.Foo('1', 2)
json_dict = common_util.SerializeAttributesToJsonDict(
{}, foo_fighters, ['foo_fighters', 'whisky_bar'])
self.assertDictEqual({'foo_fighters': '1', 'whisky_bar': 2}, json_dict)
# Partial update
json_dict = common_util.SerializeAttributesToJsonDict(
{'baz': 42}, foo_fighters, ['whisky_bar'])
self.assertDictEqual({'baz': 42, 'whisky_bar': 2}, json_dict)
# Non-existing attribute.
with self.assertRaises(AttributeError):
json_dict = common_util.SerializeAttributesToJsonDict(
{}, foo_fighters, ['foo_fighters', 'whisky_bar', 'baz'])
def testDeserialization(self):
foo_fighters = self.Foo('hello', 'world')
json_dict = {'foo_fighters': 12, 'whisky_bar': 42}
# Partial.
foo_fighters = common_util.DeserializeAttributesFromJsonDict(
json_dict, foo_fighters, ['foo_fighters'])
self.assertEqual(12, foo_fighters.foo_fighters)
self.assertEqual('world', foo_fighters.whisky_bar)
# Complete.
foo_fighters = common_util.DeserializeAttributesFromJsonDict(
json_dict, foo_fighters, ['foo_fighters', 'whisky_bar'])
self.assertEqual(42, foo_fighters.whisky_bar)
# Non-existing attribute.
with self.assertRaises(AttributeError):
json_dict['baz'] = 'bad'
foo_fighters = common_util.DeserializeAttributesFromJsonDict(
json_dict, foo_fighters, ['foo_fighters', 'whisky_bar', 'baz'])
class TimeoutScopeTestCase(unittest.TestCase):
def testTimeoutRaise(self):
self.assertEquals(0, signal.alarm(0))
with self.assertRaisesRegexp(common_util.TimeoutError, 'hello'):
with common_util.TimeoutScope(seconds=1, error_name='hello'):
signal.pause()
self.fail()
self.assertEquals(0, signal.alarm(0))
with self.assertRaisesRegexp(common_util.TimeoutError, 'world'):
with common_util.TimeoutScope(seconds=1, error_name='world'):
time.sleep(2)
self.assertEquals(0, signal.alarm(0))
def testCollisionDetection(self):
ONE_YEAR = 365 * 24 * 60 * 60
def _mock_callback(signum, frame):
del signum, frame # unused.
flag = False
with self.assertRaises(common_util.TimeoutCollisionError):
with common_util.TimeoutScope(seconds=ONE_YEAR, error_name=''):
flag = True
signal.signal(signal.SIGALRM, _mock_callback)
self.assertTrue(flag)
self.assertEquals(0, signal.alarm(0))
flag = False
with self.assertRaises(common_util.TimeoutCollisionError):
with common_util.TimeoutScope(seconds=ONE_YEAR, error_name=''):
flag = True
with common_util.TimeoutScope(seconds=ONE_YEAR, error_name=''):
self.fail()
self.assertTrue(flag)
self.assertEquals(0, signal.alarm(0))
signal.alarm(ONE_YEAR)
with self.assertRaises(common_util.TimeoutCollisionError):
with common_util.TimeoutScope(seconds=ONE_YEAR, error_name=''):
self.fail()
self.assertEquals(0, signal.alarm(0))
if __name__ == '__main__':
unittest.main()