this repo has no description
at trunk 152 lines 4.6 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 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