this repo has no description
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