diff options
author | Zachary Turner <zturner@google.com> | 2015-11-13 01:24:52 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2015-11-13 01:24:52 +0000 |
commit | 3946247caf2c4e6c4d24439b62611d5c15771467 (patch) | |
tree | a18fc92091ef4bb5d4afe89306cb846db6ed88c7 /lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp | |
parent | c946d46283b2578055c47de9b7ef7d182cd9a2ac (diff) | |
download | bcm5719-llvm-3946247caf2c4e6c4d24439b62611d5c15771467.tar.gz bcm5719-llvm-3946247caf2c4e6c4d24439b62611d5c15771467.zip |
Introduce a `PythonExceptionState` class.
This is a helper class which supports a number of
features including exception to string formatting with
backtrace handling and auto-restore of exception state
upon scope exit.
Additionally, unit tests are included to verify the
feature set of the class.
llvm-svn: 252994
Diffstat (limited to 'lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp')
-rw-r--r-- | lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp new file mode 100644 index 00000000000..3d7941e83a0 --- /dev/null +++ b/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp @@ -0,0 +1,121 @@ +//===-- PythonExceptionStateTest.cpp ------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "Plugins/ScriptInterpreter/Python/lldb-python.h" +#include "Plugins/ScriptInterpreter/Python/PythonDataObjects.h" +#include "Plugins/ScriptInterpreter/Python/PythonExceptionState.h" +#include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" + +#include "PythonTestSuite.h" + +using namespace lldb_private; + +class PythonExceptionStateTest : public PythonTestSuite +{ + public: + protected: + void + RaiseException() + { + PyErr_SetString(PyExc_RuntimeError, "PythonExceptionStateTest test error"); + } +}; + +TEST_F(PythonExceptionStateTest, TestExceptionStateChecking) +{ + PyErr_Clear(); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + RaiseException(); + EXPECT_TRUE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} + +TEST_F(PythonExceptionStateTest, TestAcquisitionSemantics) +{ + PyErr_Clear(); + PythonExceptionState no_error(false); + EXPECT_FALSE(no_error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); + RaiseException(); + PythonExceptionState error(false); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + error.Discard(); + + PyErr_Clear(); + RaiseException(); + error.Acquire(false); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} + +TEST_F(PythonExceptionStateTest, TestDiscardSemantics) +{ + PyErr_Clear(); + + // Test that discarding an exception does not restore the exception + // state even when auto-restore==true is set + RaiseException(); + PythonExceptionState error(true); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + error.Discard(); + EXPECT_FALSE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); +} + +TEST_F(PythonExceptionStateTest, TestManualRestoreSemantics) +{ + PyErr_Clear(); + RaiseException(); + PythonExceptionState error(false); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + error.Restore(); + EXPECT_FALSE(error.IsError()); + EXPECT_TRUE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} + +TEST_F(PythonExceptionStateTest, TestAutoRestoreSemantics) +{ + PyErr_Clear(); + // Test that using the auto-restore flag correctly restores the exception + // state on destruction, and not using the auto-restore flag correctly + // does NOT restore the state on destruction. + { + RaiseException(); + PythonExceptionState error(false); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + } + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); + { + RaiseException(); + PythonExceptionState error(true); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + } + EXPECT_TRUE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} |