summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/docs/server2/future_test.py
blob: 3b31a0c7d89ec9d46be5680c9b0048338ad4512d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/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()