this repo has no description
at trunk 69 lines 1.9 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "Python.h" 3#include "gtest/gtest.h" 4 5#include "capi-fixture.h" 6#include "capi-testing.h" 7 8namespace py { 9namespace testing { 10 11using TracebackExtensionApiTest = ExtensionApi; 12 13TEST_F(TracebackExtensionApiTest, TraceBackPrintWithNullptrIsNoop) { 14 CaptureStdStreams streams; 15 ASSERT_EQ(PyTraceBack_Print(nullptr, nullptr), 0); 16 17 ASSERT_EQ(PyErr_Occurred(), nullptr); 18 EXPECT_EQ(streams.out(), ""); 19 EXPECT_EQ(streams.err(), ""); 20} 21 22TEST_F(TracebackExtensionApiTest, 23 TraceBackPrintWithNonTracebackRaisesSystemError) { 24 PyObjectPtr tb(PyLong_FromLong(42)); 25 ASSERT_EQ(PyTraceBack_Print(tb, nullptr), -1); 26 27 ASSERT_NE(PyErr_Occurred(), nullptr); 28 EXPECT_EQ(PyErr_ExceptionMatches(PyExc_SystemError), 1); 29} 30 31TEST_F(TracebackExtensionApiTest, TraceBackPrintWithTracebackWritesToFile) { 32 CaptureStdStreams streams; 33 EXPECT_EQ(0, PyRun_SimpleString(R"( 34try: 35 raise RuntimeError("inner") 36except Exception as e: 37 tb = e.__traceback__ 38)")); 39 40 PyObjectPtr tb(mainModuleGet("tb")); 41 PyObject* file = PySys_GetObject("stderr"); 42 ASSERT_EQ(PyTraceBack_Print(tb, file), 0); 43 44 ASSERT_EQ(PyErr_Occurred(), nullptr); 45 EXPECT_EQ(streams.out(), ""); 46 EXPECT_EQ(streams.err(), R"(Traceback (most recent call last): 47 File "<string>", line 3, in <module> 48)"); 49} 50 51TEST_F(TracebackExtensionApiTest, TracebackAddSetsTraceback) { 52 CaptureStdStreams streams; 53 _PyTraceback_Add("foo", "bar", 42); 54 ASSERT_EQ(PyErr_Occurred(), nullptr); 55 56 PyObject *exc, *val, *tb; 57 PyErr_Fetch(&exc, &val, &tb); 58 PyObject* file = PySys_GetObject("stderr"); 59 ASSERT_EQ(PyTraceBack_Print(tb, file), 0); 60 ASSERT_EQ(PyErr_Occurred(), nullptr); 61 62 EXPECT_EQ(streams.out(), ""); 63 EXPECT_EQ(streams.err(), R"(Traceback (most recent call last): 64 File "bar", line 42, in foo 65)"); 66} 67 68} // namespace testing 69} // namespace py