diff options
author | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 04:36:07 +0000 |
---|---|---|
committer | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 04:36:07 +0000 |
commit | 4ab445887647350e1dfb89af64865265d382e1c6 (patch) | |
tree | 70b4cb50f30a0bf31ef4a4da7259b9bef3b0d482 /chrome/common/extensions/docs/server2/future_test.py | |
parent | 7271f64d2987cb7a3fb38cb0cf1334c9f871df8e (diff) | |
download | chromium_src-4ab445887647350e1dfb89af64865265d382e1c6.zip chromium_src-4ab445887647350e1dfb89af64865265d382e1c6.tar.gz chromium_src-4ab445887647350e1dfb89af64865265d382e1c6.tar.bz2 |
Docserver: greatly improve the error logging by (a) preserving the stack traces in Futures,
(b) actually logging the stack trace, and (c) respecting DeadlineExceededErrors.
BUG=167432
Review URL: https://codereview.chromium.org/14333015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@196309 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/extensions/docs/server2/future_test.py')
-rwxr-xr-x | chrome/common/extensions/docs/server2/future_test.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/chrome/common/extensions/docs/server2/future_test.py b/chrome/common/extensions/docs/server2/future_test.py new file mode 100755 index 0000000..3b31a0c --- /dev/null +++ b/chrome/common/extensions/docs/server2/future_test.py @@ -0,0 +1,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() |