future_test.py revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import traceback
7import unittest
8
9from future import Future
10
11class FutureTest(unittest.TestCase):
12  def testNoValueOrDelegate(self):
13    self.assertRaises(ValueError, Future)
14
15  def testValue(self):
16    future = Future(value=42)
17    self.assertEqual(42, future.Get())
18    self.assertEqual(42, future.Get())
19
20  def testDelegateValue(self):
21    assertFalse = self.assertFalse
22    class delegate(object):
23      def __init__(self):
24        self._get_called = False
25      def Get(self):
26        assertFalse(self._get_called)
27        self._get_called = True
28        return 42
29
30    future = Future(delegate=delegate())
31    self.assertEqual(42, future.Get())
32    self.assertEqual(42, future.Get())
33
34  def testErrorThrowingDelegate(self):
35    class FunkyException(Exception):
36      pass
37
38    # Set up a chain of functions to test the stack trace.
39    def qux():
40      raise FunkyException()
41    def baz():
42      return qux()
43    def bar():
44      return baz()
45    def foo():
46      return bar()
47    chain = [foo, bar, baz, qux]
48
49    assertFalse = self.assertFalse
50    class delegate(object):
51      def __init__(self):
52        self._get_called = False
53      def Get(self):
54        assertFalse(self._get_called)
55        self._get_called = True
56        return foo()
57
58    fail = self.fail
59    assertTrue = self.assertTrue
60    def assert_raises_full_stack(future, err):
61      try:
62        future.Get()
63        fail('Did not raise %s' % err)
64      except Exception as e:
65        assertTrue(isinstance(e, err))
66        stack = traceback.format_exc()
67        assertTrue(all(stack.find(fn.__name__) != -1 for fn in chain))
68
69    future = Future(delegate=delegate())
70    assert_raises_full_stack(future, FunkyException)
71    assert_raises_full_stack(future, FunkyException)
72
73if __name__ == '__main__':
74  unittest.main()
75