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 ObmallocExtensionApiTest = ExtensionApi;
12
13TEST_F(ObmallocExtensionApiTest, PyObjectDebugMallocStatsReturnsZeroPyro) {
14 EXPECT_EQ(_PyObject_DebugMallocStats(nullptr), 0);
15}
16
17TEST_F(ObmallocExtensionApiTest, PyMemRawStrdupDuplicatesStr) {
18 const char* str = "hello, world";
19 char* dup = _PyMem_RawStrdup(str);
20 EXPECT_NE(dup, str);
21 EXPECT_STREQ(dup, str);
22 PyMem_RawFree(dup);
23}
24
25TEST_F(ObmallocExtensionApiTest, PyMemStrdupDuplicatesStr) {
26 const char* str = "hello, world";
27 char* dup = _PyMem_Strdup(str);
28 EXPECT_NE(dup, str);
29 EXPECT_STREQ(dup, str);
30 PyMem_Free(dup);
31}
32
33TEST_F(ObmallocExtensionApiTest, PyMemMemResizeAssignsToPointer) {
34 void* ptr = nullptr;
35 PyMem_Resize(ptr, int, 128);
36 EXPECT_NE(ptr, nullptr);
37 PyMem_Free(ptr);
38}
39
40TEST_F(ObmallocExtensionApiTest, PyMemMemResizeMovesContents) {
41 char* ptr = PyMem_New(char, 1);
42 ASSERT_NE(ptr, nullptr);
43 *ptr = 98;
44
45 // Allocate the next word and resize to a much larger memory
46 void* intervening_allocation = PyMem_New(char, 1);
47 PyMem_Resize(ptr, char, 65536);
48 ASSERT_NE(ptr, nullptr);
49 EXPECT_EQ(*ptr, 98);
50 ptr[65535] = 87;
51 PyMem_FREE(intervening_allocation);
52
53 PyMem_RESIZE(ptr, char, 1048576);
54 ASSERT_NE(ptr, nullptr);
55 EXPECT_EQ(*ptr, 98);
56 EXPECT_EQ(ptr[65535], 87);
57 PyMem_FREE(ptr);
58}
59
60TEST_F(ObmallocExtensionApiTest, PyMemMallocAllocatesMemory) {
61 void* ptr = PyObject_Malloc(1);
62 EXPECT_NE(ptr, nullptr);
63 PyObject_Free(ptr);
64}
65
66TEST_F(ObmallocExtensionApiTest, PyMemCallocAllocatesMemory) {
67 void* ptr = PyObject_Calloc(1, 1);
68 EXPECT_NE(ptr, nullptr);
69 PyObject_Free(ptr);
70}
71
72TEST_F(ObmallocExtensionApiTest, PyMemReallocAllocatesMemory) {
73 auto* ptr = reinterpret_cast<char*>(PyObject_Malloc(1));
74 ASSERT_NE(ptr, nullptr);
75 *ptr = 98;
76 ptr = reinterpret_cast<char*>(PyObject_Realloc(ptr, 2));
77 ASSERT_NE(ptr, nullptr);
78 ptr[1] = 87;
79
80 EXPECT_EQ(*ptr, 98);
81 EXPECT_EQ(ptr[1], 87);
82 PyObject_Free(ptr);
83}
84
85TEST_F(ObmallocExtensionApiTest, PyMemReallocOnlyRetracksPyObjects) {
86 auto* ptr = reinterpret_cast<char*>(PyObject_Malloc(1));
87 ASSERT_NE(ptr, nullptr);
88 *ptr = 98;
89
90 collectGarbage();
91
92 ptr = reinterpret_cast<char*>(PyObject_Realloc(ptr, 2));
93 ASSERT_NE(ptr, nullptr);
94 ptr[1] = 87;
95
96 EXPECT_EQ(*ptr, 98);
97 EXPECT_EQ(ptr[1], 87);
98 PyObject_Free(ptr);
99}
100
101TEST_F(ObmallocExtensionApiTest, PyMemNewAllocatesAndPyMemDelFreesMemory) {
102 struct FooBar {
103 char x[7];
104 };
105 void* memory = PyMem_New(FooBar, 3);
106 ASSERT_NE(memory, nullptr);
107 memset(memory, 8, 3 * sizeof(FooBar));
108 PyMem_Del(memory);
109}
110
111TEST_F(ObmallocExtensionApiTest, PyMemNEWAllocatesAndPyMemDELFreesMemory) {
112 struct FooBar {
113 char x[7];
114 };
115 void* memory = PyMem_NEW(FooBar, 3);
116 ASSERT_NE(memory, nullptr);
117 memset(memory, 8, 3 * sizeof(FooBar));
118 PyMem_DEL(memory);
119}
120
121} // namespace testing
122} // namespace py