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