blob: 259853dca02e8aeb892277dee1129e3d488cf345 [file] [log] [blame]
Christopher Ferris885f3b92013-05-21 17:48:01 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
19#include <stdlib.h>
20#include <malloc.h>
21
22TEST(malloc, malloc_std) {
23 // Simple malloc test.
24 void *ptr = malloc(100);
25 ASSERT_TRUE(ptr != NULL);
26 ASSERT_LE(100U, malloc_usable_size(ptr));
27
28 free(ptr);
29}
30
31TEST(malloc, calloc_std) {
32 // Simple calloc test.
33 size_t alloc_len = 100;
34 char *ptr = (char *)calloc(1, alloc_len);
35 ASSERT_TRUE(ptr != NULL);
36 ASSERT_LE(alloc_len, malloc_usable_size(ptr));
37 for (size_t i = 0; i < alloc_len; i++) {
38 ASSERT_EQ(0, ptr[i]);
39 }
40
41 free(ptr);
42}
43
44TEST(malloc, memalign_multiple) {
45 // Memalign test where the alignment is any value.
46 for (size_t i = 0; i <= 12; i++) {
47 for (size_t alignment = 1 << i; alignment < (1U << (i+1)); alignment++) {
48 char *ptr = (char*)memalign(alignment, 100);
49 ASSERT_TRUE(ptr != NULL);
50 ASSERT_LE(100U, malloc_usable_size(ptr));
51 ASSERT_EQ(0, (intptr_t)ptr % (1 << i));
52
53 free(ptr);
54 }
55 }
56}
57
58TEST(malloc, memalign_realloc) {
59 // Memalign and then realloc the pointer a couple of times.
60 for (size_t alignment = 1; alignment <= 4096; alignment <<= 1) {
61 char *ptr = (char*)memalign(alignment, 100);
62 ASSERT_TRUE(ptr != NULL);
63 ASSERT_LE(100U, malloc_usable_size(ptr));
64 ASSERT_EQ(0U, (intptr_t)ptr % alignment);
65 memset(ptr, 0x23, 100);
66
67 ptr = (char*)realloc(ptr, 200);
68 ASSERT_TRUE(ptr != NULL);
69 ASSERT_LE(200U, malloc_usable_size(ptr));
70 ASSERT_TRUE(ptr != NULL);
71 for (size_t i = 0; i < 100; i++) {
72 ASSERT_EQ(0x23, ptr[i]);
73 }
74 memset(ptr, 0x45, 200);
75
76 ptr = (char*)realloc(ptr, 300);
77 ASSERT_TRUE(ptr != NULL);
78 ASSERT_LE(300U, malloc_usable_size(ptr));
79 for (size_t i = 0; i < 200; i++) {
80 ASSERT_EQ(0x45, ptr[i]);
81 }
82 memset(ptr, 0x67, 300);
83
84 ptr = (char*)realloc(ptr, 250);
85 ASSERT_TRUE(ptr != NULL);
86 ASSERT_LE(250U, malloc_usable_size(ptr));
87 for (size_t i = 0; i < 250; i++) {
88 ASSERT_EQ(0x67, ptr[i]);
89 }
90
91 free(ptr);
92 }
93}
94
95TEST(malloc, malloc_realloc_larger) {
96 // Realloc to a larger size, malloc is used for the original allocation.
97 char *ptr = (char *)malloc(100);
98 ASSERT_TRUE(ptr != NULL);
99 ASSERT_LE(100U, malloc_usable_size(ptr));
100 memset(ptr, 67, 100);
101
102 ptr = (char *)realloc(ptr, 200);
103 ASSERT_TRUE(ptr != NULL);
104 ASSERT_LE(200U, malloc_usable_size(ptr));
105 for (size_t i = 0; i < 100; i++) {
106 ASSERT_EQ(67, ptr[i]);
107 }
108
109 free(ptr);
110}
111
112TEST(malloc, malloc_realloc_smaller) {
113 // Realloc to a smaller size, malloc is used for the original allocation.
114 char *ptr = (char *)malloc(200);
115 ASSERT_TRUE(ptr != NULL);
116 ASSERT_LE(200U, malloc_usable_size(ptr));
117 memset(ptr, 67, 200);
118
119 ptr = (char *)realloc(ptr, 100);
120 ASSERT_TRUE(ptr != NULL);
121 ASSERT_LE(100U, malloc_usable_size(ptr));
122 for (size_t i = 0; i < 100; i++) {
123 ASSERT_EQ(67, ptr[i]);
124 }
125
126 free(ptr);
127}
128
129TEST(malloc, malloc_multiple_realloc) {
130 // Multiple reallocs, malloc is used for the original allocation.
131 char *ptr = (char *)malloc(200);
132 ASSERT_TRUE(ptr != NULL);
133 ASSERT_LE(200U, malloc_usable_size(ptr));
134 memset(ptr, 0x23, 200);
135
136 ptr = (char *)realloc(ptr, 100);
137 ASSERT_TRUE(ptr != NULL);
138 ASSERT_LE(100U, malloc_usable_size(ptr));
139 for (size_t i = 0; i < 100; i++) {
140 ASSERT_EQ(0x23, ptr[i]);
141 }
142
143 ptr = (char*)realloc(ptr, 50);
144 ASSERT_TRUE(ptr != NULL);
145 ASSERT_LE(50U, malloc_usable_size(ptr));
146 for (size_t i = 0; i < 50; i++) {
147 ASSERT_EQ(0x23, ptr[i]);
148 }
149
150 ptr = (char*)realloc(ptr, 150);
151 ASSERT_TRUE(ptr != NULL);
152 ASSERT_LE(150U, malloc_usable_size(ptr));
153 for (size_t i = 0; i < 50; i++) {
154 ASSERT_EQ(0x23, ptr[i]);
155 }
156 memset(ptr, 0x23, 150);
157
158 ptr = (char*)realloc(ptr, 425);
159 ASSERT_TRUE(ptr != NULL);
160 ASSERT_LE(425U, malloc_usable_size(ptr));
161 for (size_t i = 0; i < 150; i++) {
162 ASSERT_EQ(0x23, ptr[i]);
163 }
164
165 free(ptr);
166}
167TEST(malloc, calloc_realloc_larger) {
168 // Realloc to a larger size, calloc is used for the original allocation.
169 char *ptr = (char *)calloc(1, 100);
170 ASSERT_TRUE(ptr != NULL);
171 ASSERT_LE(100U, malloc_usable_size(ptr));
172
173 ptr = (char *)realloc(ptr, 200);
174 ASSERT_TRUE(ptr != NULL);
175 ASSERT_LE(200U, malloc_usable_size(ptr));
176 for (size_t i = 0; i < 100; i++) {
177 ASSERT_EQ(0, ptr[i]);
178 }
179
180 free(ptr);
181}
182
183TEST(malloc, calloc_realloc_smaller) {
184 // Realloc to a smaller size, calloc is used for the original allocation.
185 char *ptr = (char *)calloc(1, 200);
186 ASSERT_TRUE(ptr != NULL);
187 ASSERT_LE(200U, malloc_usable_size(ptr));
188
189 ptr = (char *)realloc(ptr, 100);
190 ASSERT_TRUE(ptr != NULL);
191 ASSERT_LE(100U, malloc_usable_size(ptr));
192 for (size_t i = 0; i < 100; i++) {
193 ASSERT_EQ(0, ptr[i]);
194 }
195
196 free(ptr);
197}
198
199TEST(malloc, calloc_multiple_realloc) {
200 // Multiple reallocs, calloc is used for the original allocation.
201 char *ptr = (char *)calloc(1, 200);
202 ASSERT_TRUE(ptr != NULL);
203 ASSERT_LE(200U, malloc_usable_size(ptr));
204
205 ptr = (char *)realloc(ptr, 100);
206 ASSERT_TRUE(ptr != NULL);
207 ASSERT_LE(100U, malloc_usable_size(ptr));
208 for (size_t i = 0; i < 100; i++) {
209 ASSERT_EQ(0, ptr[i]);
210 }
211
212 ptr = (char*)realloc(ptr, 50);
213 ASSERT_TRUE(ptr != NULL);
214 ASSERT_LE(50U, malloc_usable_size(ptr));
215 for (size_t i = 0; i < 50; i++) {
216 ASSERT_EQ(0, ptr[i]);
217 }
218
219 ptr = (char*)realloc(ptr, 150);
220 ASSERT_TRUE(ptr != NULL);
221 ASSERT_LE(150U, malloc_usable_size(ptr));
222 for (size_t i = 0; i < 50; i++) {
223 ASSERT_EQ(0, ptr[i]);
224 }
225 memset(ptr, 0, 150);
226
227 ptr = (char*)realloc(ptr, 425);
228 ASSERT_TRUE(ptr != NULL);
229 ASSERT_LE(425U, malloc_usable_size(ptr));
230 for (size_t i = 0; i < 150; i++) {
231 ASSERT_EQ(0, ptr[i]);
232 }
233
234 free(ptr);
235}