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 FileObjectExtensionApiTest = ExtensionApi;
12
13TEST_F(FileObjectExtensionApiTest, AsFileDescriptorWithSmallIntReturnsInt) {
14 PyObjectPtr obj(PyLong_FromLong(5));
15 EXPECT_EQ(PyObject_AsFileDescriptor(obj), 5);
16 EXPECT_EQ(PyErr_Occurred(), nullptr);
17}
18
19TEST_F(FileObjectExtensionApiTest, AsFileDescriptorWithIntSubclassReturnsInt) {
20 PyRun_SimpleString(R"(
21class Subclass(int): pass
22obj = Subclass(5)
23)");
24 PyObjectPtr obj(mainModuleGet("obj"));
25 EXPECT_EQ(PyObject_AsFileDescriptor(obj), 5);
26 EXPECT_EQ(PyErr_Occurred(), nullptr);
27}
28
29TEST_F(FileObjectExtensionApiTest,
30 AsFileDescriptorWithLargeIntRaisesOverflowError) {
31 PyRun_SimpleString(R"(
32big = 1 << 70
33)");
34 PyObjectPtr big(mainModuleGet("big"));
35 EXPECT_EQ(PyObject_AsFileDescriptor(big), -1);
36 ASSERT_NE(PyErr_Occurred(), nullptr);
37 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_OverflowError));
38}
39
40TEST_F(FileObjectExtensionApiTest, AsFileDescriptorCallsFilenoMethod) {
41 PyRun_SimpleString(R"(
42class C:
43 def fileno(self):
44 return 7
45c = C()
46)");
47 PyObjectPtr c(mainModuleGet("c"));
48 EXPECT_EQ(PyObject_AsFileDescriptor(c), 7);
49 EXPECT_EQ(PyErr_Occurred(), nullptr);
50}
51
52TEST_F(FileObjectExtensionApiTest,
53 AsFileDescriptorWithNegativeSmallIntRaisesValueError) {
54 PyObjectPtr obj(PyLong_FromLong(-7));
55 EXPECT_EQ(PyObject_AsFileDescriptor(obj), -1);
56 ASSERT_NE(PyErr_Occurred(), nullptr);
57 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_ValueError));
58}
59
60TEST_F(FileObjectExtensionApiTest,
61 AsFileDescriptorWithNegativeFilenoRaisesValueError) {
62 PyRun_SimpleString(R"(
63class C:
64 def fileno(self):
65 return -7
66c = C()
67)");
68 PyObjectPtr c(mainModuleGet("c"));
69 EXPECT_EQ(PyObject_AsFileDescriptor(c), -1);
70 ASSERT_NE(PyErr_Occurred(), nullptr);
71 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_ValueError));
72}
73
74TEST_F(FileObjectExtensionApiTest, AsFileDescriptorWithNonIntRaisesTypeError) {
75 PyRun_SimpleString(R"(
76class C:
77 def fileno(self):
78 return "foobar"
79c = C()
80)");
81 PyObjectPtr c(mainModuleGet("c"));
82 EXPECT_EQ(PyObject_AsFileDescriptor(c), -1);
83 ASSERT_NE(PyErr_Occurred(), nullptr);
84 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_TypeError));
85}
86
87TEST_F(FileObjectExtensionApiTest,
88 AsFileDescriptorWithIntSubclassFilenoReturnsInt) {
89 PyRun_SimpleString(R"(
90class Subclass(int): pass
91class C:
92 def fileno(self):
93 return Subclass(5)
94c = C()
95)");
96 PyObjectPtr c(mainModuleGet("c"));
97 EXPECT_EQ(PyObject_AsFileDescriptor(c), 5);
98 EXPECT_EQ(PyErr_Occurred(), nullptr);
99}
100
101TEST_F(FileObjectExtensionApiTest, WriteObjectWritesRepr) {
102 PyObjectPtr file(moduleGet("sys", "stdout"));
103 PyObjectPtr obj(PyUnicode_FromString("hello there"));
104 CaptureStdStreams streams;
105 ASSERT_EQ(PyFile_WriteObject(obj, file, 0), 0);
106 EXPECT_EQ(streams.out(), "'hello there'");
107}
108
109TEST_F(FileObjectExtensionApiTest, WriteObjectWithFlagWritesStr) {
110 PyObjectPtr file(moduleGet("sys", "stdout"));
111 PyObjectPtr obj(PyUnicode_FromString("hello there"));
112 PyObjectPtr obj2(PyLong_FromLong(12345));
113 CaptureStdStreams streams;
114 ASSERT_EQ(PyFile_WriteObject(obj, file, Py_PRINT_RAW), 0);
115 ASSERT_EQ(PyFile_WriteObject(obj2, file, Py_PRINT_RAW), 0);
116 EXPECT_EQ(streams.out(), "hello there12345");
117}
118
119TEST_F(FileObjectExtensionApiTest, WriteObjectWithNullObjectWritesNull) {
120 PyObjectPtr file(moduleGet("sys", "stderr"));
121 CaptureStdStreams streams;
122 ASSERT_EQ(PyFile_WriteObject(nullptr, file, 0), 0);
123 EXPECT_EQ(streams.err(), "<NULL>");
124}
125
126TEST_F(FileObjectExtensionApiTest, WriteObjectWithNullFileRaisesTypeError) {
127 ASSERT_EQ(PyFile_WriteObject(nullptr, nullptr, 0), -1);
128 EXPECT_EQ(PyErr_ExceptionMatches(PyExc_TypeError), 1);
129}
130
131TEST_F(FileObjectExtensionApiTest, WriteStringWritesString) {
132 PyObjectPtr file(moduleGet("sys", "stdout"));
133 CaptureStdStreams streams;
134 ASSERT_EQ(
135 PyFile_WriteString("The quick brown fox jumps over the lazy dog.", file),
136 0);
137 EXPECT_EQ(streams.out(), "The quick brown fox jumps over the lazy dog.");
138}
139
140TEST_F(FileObjectExtensionApiTest, WriteStringWithSetExceptionFails) {
141 PyObjectPtr file(moduleGet("sys", "stdout"));
142 PyErr_SetObject(PyExc_TypeError, Py_None);
143 CaptureStdStreams streams;
144 ASSERT_EQ(PyFile_WriteString("hello there", file), -1);
145 ASSERT_EQ(streams.err(), "");
146 ASSERT_EQ(streams.out(), "");
147 EXPECT_NE(PyErr_Occurred(), nullptr);
148 EXPECT_EQ(PyErr_ExceptionMatches(PyExc_TypeError), 1);
149}
150
151} // namespace testing
152} // namespace py