blob: 3b31a0c7d89ec9d46be5680c9b0048338ad4512d [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2013 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 traceback
import unittest
from future import Future
class FutureTest(unittest.TestCase):
def testNoValueOrDelegate(self):
self.assertRaises(ValueError, Future)
def testValue(self):
future = Future(value=42)
self.assertEqual(42, future.Get())
self.assertEqual(42, future.Get())
def testDelegateValue(self):
assertFalse = self.assertFalse
class delegate(object):
def __init__(self):
self._get_called = False
def Get(self):
assertFalse(self._get_called)
self._get_called = True
return 42
future = Future(delegate=delegate())
self.assertEqual(42, future.Get())
self.assertEqual(42, future.Get())
def testErrorThrowingDelegate(self):
class FunkyException(Exception):
pass
# Set up a chain of functions to test the stack trace.
def qux():
raise FunkyException()
def baz():
return qux()
def bar():
return baz()
def foo():
return bar()
chain = [foo, bar, baz, qux]
assertFalse = self.assertFalse
class delegate(object):
def __init__(self):
self._get_called = False
def Get(self):
assertFalse(self._get_called)
self._get_called = True
return foo()
fail = self.fail
assertTrue = self.assertTrue
def assert_raises_full_stack(future, err):
try:
future.Get()
fail('Did not raise %s' % err)
except Exception as e:
assertTrue(isinstance(e, err))
stack = traceback.format_exc()
assertTrue(all(stack.find(fn.__name__) != -1 for fn in chain))
future = Future(delegate=delegate())
assert_raises_full_stack(future, FunkyException)
assert_raises_full_stack(future, FunkyException)
if __name__ == '__main__':
unittest.main()