1 /* 2 * Copyright (C) 2015 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 <limits.h> 18 19 #include <memory> 20 #include <string> 21 22 #include <gtest/gtest.h> 23 24 #include "Config.h" 25 26 #include "log_fake.h" 27 28 extern "C" int property_set(const char*, const char*); 29 30 class MallocDebugConfigTest : public ::testing::Test { 31 protected: 32 void SetUp() override { 33 resetLogs(); 34 } 35 36 void TearDown() override { 37 } 38 39 std::unique_ptr<Config> config; 40 41 bool InitConfig(const char* property_value) { 42 config.reset(new Config); 43 property_set("libc.debug.malloc.options", property_value); 44 return config->SetFromProperties(); 45 } 46 }; 47 48 std::string usage_string( 49 "6 malloc_debug malloc debug options usage:\n" 50 "6 malloc_debug \n" 51 "6 malloc_debug front_guard[=XX]\n" 52 "6 malloc_debug Enables a front guard on all allocations. If XX is set\n" 53 "6 malloc_debug it sets the number of bytes in the guard. The default is\n" 54 "6 malloc_debug 32 bytes, the max bytes is 16384.\n" 55 "6 malloc_debug \n" 56 "6 malloc_debug rear_guard[=XX]\n" 57 "6 malloc_debug Enables a rear guard on all allocations. If XX is set\n" 58 "6 malloc_debug it sets the number of bytes in the guard. The default is\n" 59 "6 malloc_debug 32 bytes, the max bytes is 16384.\n" 60 "6 malloc_debug \n" 61 "6 malloc_debug guard[=XX]\n" 62 "6 malloc_debug Enables both a front guard and a rear guard on all allocations.\n" 63 "6 malloc_debug If XX is set it sets the number of bytes in both guards.\n" 64 "6 malloc_debug The default is 32 bytes, the max bytes is 16384.\n" 65 "6 malloc_debug \n" 66 "6 malloc_debug backtrace[=XX]\n" 67 "6 malloc_debug Enable capturing the backtrace at the point of allocation.\n" 68 "6 malloc_debug If XX is set it sets the number of backtrace frames.\n" 69 "6 malloc_debug The default is 16 frames, the max number of frames is 256.\n" 70 "6 malloc_debug \n" 71 "6 malloc_debug backtrace_enable_on_signal[=XX]\n" 72 "6 malloc_debug Enable capturing the backtrace at the point of allocation.\n" 73 "6 malloc_debug The backtrace capture is not enabled until the process\n" 74 "6 malloc_debug receives a signal. If XX is set it sets the number of backtrace\n" 75 "6 malloc_debug frames. The default is 16 frames, the max number of frames is 256.\n" 76 "6 malloc_debug \n" 77 "6 malloc_debug fill_on_alloc[=XX]\n" 78 "6 malloc_debug On first allocation, fill with the value 0xeb.\n" 79 "6 malloc_debug If XX is set it will only fill up to XX bytes of the\n" 80 "6 malloc_debug allocation. The default is to fill the entire allocation.\n" 81 "6 malloc_debug \n" 82 "6 malloc_debug fill_on_free[=XX]\n" 83 "6 malloc_debug On free, fill with the value 0xef. If XX is set it will\n" 84 "6 malloc_debug only fill up to XX bytes of the allocation. The default is to\n" 85 "6 malloc_debug fill the entire allocation.\n" 86 "6 malloc_debug \n" 87 "6 malloc_debug fill[=XX]\n" 88 "6 malloc_debug On both first allocation free, fill with the value 0xeb on\n" 89 "6 malloc_debug first allocation and the value 0xef. If XX is set, only fill\n" 90 "6 malloc_debug up to XX bytes. The default is to fill the entire allocation.\n" 91 "6 malloc_debug \n" 92 "6 malloc_debug expand_alloc[=XX]\n" 93 "6 malloc_debug Allocate an extra number of bytes for every allocation call.\n" 94 "6 malloc_debug If XX is set, that is the number of bytes to expand the\n" 95 "6 malloc_debug allocation by. The default is 16 bytes, the max bytes is 16384.\n" 96 "6 malloc_debug \n" 97 "6 malloc_debug free_track[=XX]\n" 98 "6 malloc_debug When a pointer is freed, do not free the memory right away.\n" 99 "6 malloc_debug Instead, keep XX of these allocations around and then verify\n" 100 "6 malloc_debug that they have not been modified when the total number of freed\n" 101 "6 malloc_debug allocations exceeds the XX amount. When the program terminates,\n" 102 "6 malloc_debug the rest of these allocations are verified. When this option is\n" 103 "6 malloc_debug enabled, it automatically records the backtrace at the time of the free.\n" 104 "6 malloc_debug The default is to record 100 allocations, the max allocations\n" 105 "6 malloc_debug to record is 16384.\n" 106 "6 malloc_debug \n" 107 "6 malloc_debug free_track_backtrace_num_frames[=XX]\n" 108 "6 malloc_debug This option only has meaning if free_track is set. This indicates\n" 109 "6 malloc_debug how many backtrace frames to capture when an allocation is freed.\n" 110 "6 malloc_debug If XX is set, that is the number of frames to capture. If XX\n" 111 "6 malloc_debug is set to zero, then no backtrace will be captured.\n" 112 "6 malloc_debug The default is to record 16 frames, the max number of frames is 256.\n" 113 "6 malloc_debug \n" 114 "6 malloc_debug leak_track\n" 115 "6 malloc_debug Enable the leak tracking of memory allocations.\n" 116 ); 117 118 TEST_F(MallocDebugConfigTest, unknown_option) { 119 120 ASSERT_FALSE(InitConfig("unknown_option")); 121 122 ASSERT_STREQ("", getFakeLogBuf().c_str()); 123 std::string log_msg("6 malloc_debug malloc_testing: unknown option unknown_option\n"); 124 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 125 } 126 127 TEST_F(MallocDebugConfigTest, good_option_and_bad_option) { 128 ASSERT_FALSE(InitConfig("backtrace unknown_option")); 129 130 ASSERT_STREQ("", getFakeLogBuf().c_str()); 131 std::string log_msg("6 malloc_debug malloc_testing: unknown option unknown_option\n"); 132 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 133 } 134 135 TEST_F(MallocDebugConfigTest, unparseable_number) { 136 ASSERT_FALSE(InitConfig("backtrace=XXX")); 137 138 ASSERT_STREQ("", getFakeLogBuf().c_str()); 139 std::string log_msg("6 malloc_debug malloc_testing: bad value for option 'backtrace'\n"); 140 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 141 } 142 143 TEST_F(MallocDebugConfigTest, illegal_value_zero) { 144 ASSERT_FALSE(InitConfig("backtrace=0")); 145 146 ASSERT_STREQ("", getFakeLogBuf().c_str()); 147 std::string log_msg( 148 "6 malloc_debug malloc_testing: bad value for option 'backtrace', value must be >= 1: 0\n"); 149 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 150 } 151 152 TEST_F(MallocDebugConfigTest, no_space) { 153 ASSERT_FALSE(InitConfig("backtrace=10front_guard")); 154 155 ASSERT_STREQ("", getFakeLogBuf().c_str()); 156 std::string log_msg( 157 "6 malloc_debug malloc_testing: bad value for option 'backtrace', " 158 "non space found after option: front_guard\n"); 159 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 160 } 161 162 TEST_F(MallocDebugConfigTest, illegal_value_negative) { 163 ASSERT_FALSE(InitConfig("backtrace=-1")); 164 165 ASSERT_STREQ("", getFakeLogBuf().c_str()); 166 std::string log_msg( 167 "6 malloc_debug malloc_testing: bad value for option 'backtrace', " 168 "value cannot be negative: -1\n"); 169 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 170 } 171 172 TEST_F(MallocDebugConfigTest, overflow) { 173 ASSERT_FALSE(InitConfig("backtrace=99999999999999999999")); 174 175 ASSERT_STREQ("", getFakeLogBuf().c_str()); 176 std::string log_msg( 177 "6 malloc_debug malloc_testing: bad value for option 'backtrace': " 178 "Math result not representable\n"); 179 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 180 } 181 182 TEST_F(MallocDebugConfigTest, set_value_error) { 183 ASSERT_FALSE(InitConfig("leak_track=12")); 184 185 ASSERT_STREQ("", getFakeLogBuf().c_str()); 186 std::string log_msg( 187 "6 malloc_debug malloc_testing: value set for option 'leak_track' " 188 "which does not take a value\n"); 189 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 190 } 191 192 TEST_F(MallocDebugConfigTest, space_before_equal) { 193 ASSERT_TRUE(InitConfig("backtrace =10")); 194 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 195 ASSERT_EQ(10U, config->backtrace_frames); 196 197 ASSERT_STREQ("", getFakeLogBuf().c_str()); 198 ASSERT_STREQ("", getFakeLogPrint().c_str()); 199 } 200 201 TEST_F(MallocDebugConfigTest, space_after_equal) { 202 ASSERT_TRUE(InitConfig("backtrace= 10")); 203 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 204 ASSERT_EQ(10U, config->backtrace_frames); 205 206 ASSERT_STREQ("", getFakeLogBuf().c_str()); 207 ASSERT_STREQ("", getFakeLogPrint().c_str()); 208 } 209 210 TEST_F(MallocDebugConfigTest, extra_space) { 211 ASSERT_TRUE(InitConfig(" backtrace=64 ")); 212 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 213 ASSERT_EQ(64U, config->backtrace_frames); 214 215 ASSERT_STREQ("", getFakeLogBuf().c_str()); 216 ASSERT_STREQ("", getFakeLogPrint().c_str()); 217 } 218 219 TEST_F(MallocDebugConfigTest, multiple_options) { 220 ASSERT_TRUE(InitConfig(" backtrace=64 front_guard=48")); 221 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS | FRONT_GUARD, config->options); 222 ASSERT_EQ(64U, config->backtrace_frames); 223 ASSERT_EQ(48U, config->front_guard_bytes); 224 225 ASSERT_STREQ("", getFakeLogBuf().c_str()); 226 ASSERT_STREQ("", getFakeLogPrint().c_str()); 227 } 228 229 TEST_F(MallocDebugConfigTest, front_guard) { 230 ASSERT_TRUE(InitConfig("front_guard=48")); 231 ASSERT_EQ(FRONT_GUARD, config->options); 232 ASSERT_EQ(48U, config->front_guard_bytes); 233 234 ASSERT_TRUE(InitConfig("front_guard")); 235 ASSERT_EQ(FRONT_GUARD, config->options); 236 ASSERT_EQ(32U, config->front_guard_bytes); 237 238 ASSERT_TRUE(InitConfig("front_guard=39")); 239 ASSERT_EQ(FRONT_GUARD, config->options); 240 #if defined(__LP64__) 241 ASSERT_EQ(48U, config->front_guard_bytes); 242 #else 243 ASSERT_EQ(40U, config->front_guard_bytes); 244 #endif 245 246 ASSERT_TRUE(InitConfig("front_guard=41")); 247 ASSERT_EQ(FRONT_GUARD, config->options); 248 ASSERT_EQ(48U, config->front_guard_bytes); 249 250 ASSERT_STREQ("", getFakeLogBuf().c_str()); 251 ASSERT_STREQ("", getFakeLogPrint().c_str()); 252 } 253 254 TEST_F(MallocDebugConfigTest, rear_guard) { 255 ASSERT_TRUE(InitConfig("rear_guard=50")); 256 ASSERT_EQ(REAR_GUARD, config->options); 257 ASSERT_EQ(50U, config->rear_guard_bytes); 258 259 ASSERT_TRUE(InitConfig("rear_guard")); 260 ASSERT_EQ(REAR_GUARD, config->options); 261 ASSERT_EQ(32U, config->rear_guard_bytes); 262 263 ASSERT_STREQ("", getFakeLogBuf().c_str()); 264 ASSERT_STREQ("", getFakeLogPrint().c_str()); 265 } 266 267 TEST_F(MallocDebugConfigTest, guard) { 268 ASSERT_TRUE(InitConfig("guard=32")); 269 ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options); 270 ASSERT_EQ(32U, config->front_guard_bytes); 271 ASSERT_EQ(32U, config->rear_guard_bytes); 272 273 ASSERT_TRUE(InitConfig("guard")); 274 ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options); 275 ASSERT_EQ(32U, config->front_guard_bytes); 276 ASSERT_EQ(32U, config->rear_guard_bytes); 277 278 ASSERT_STREQ("", getFakeLogBuf().c_str()); 279 ASSERT_STREQ("", getFakeLogPrint().c_str()); 280 } 281 282 TEST_F(MallocDebugConfigTest, backtrace) { 283 ASSERT_TRUE(InitConfig("backtrace=64")); 284 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 285 ASSERT_EQ(64U, config->backtrace_frames); 286 287 ASSERT_TRUE(InitConfig("backtrace")); 288 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 289 ASSERT_EQ(16U, config->backtrace_frames); 290 291 ASSERT_STREQ("", getFakeLogBuf().c_str()); 292 ASSERT_STREQ("", getFakeLogPrint().c_str()); 293 } 294 295 TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal) { 296 ASSERT_TRUE(InitConfig("backtrace_enable_on_signal=64")); 297 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 298 ASSERT_EQ(64U, config->backtrace_frames); 299 300 ASSERT_TRUE(InitConfig("backtrace_enable_on_signal")); 301 ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options); 302 ASSERT_EQ(16U, config->backtrace_frames); 303 304 ASSERT_STREQ("", getFakeLogBuf().c_str()); 305 ASSERT_STREQ("", getFakeLogPrint().c_str()); 306 } 307 308 TEST_F(MallocDebugConfigTest, fill_on_alloc) { 309 ASSERT_TRUE(InitConfig("fill_on_alloc=64")); 310 ASSERT_EQ(FILL_ON_ALLOC, config->options); 311 ASSERT_EQ(64U, config->fill_on_alloc_bytes); 312 313 ASSERT_TRUE(InitConfig("fill_on_alloc")); 314 ASSERT_EQ(FILL_ON_ALLOC, config->options); 315 ASSERT_EQ(SIZE_MAX, config->fill_on_alloc_bytes); 316 317 ASSERT_STREQ("", getFakeLogBuf().c_str()); 318 ASSERT_STREQ("", getFakeLogPrint().c_str()); 319 } 320 321 TEST_F(MallocDebugConfigTest, fill_on_free) { 322 ASSERT_TRUE(InitConfig("fill_on_free=64")); 323 ASSERT_EQ(FILL_ON_FREE, config->options); 324 ASSERT_EQ(64U, config->fill_on_free_bytes); 325 326 ASSERT_TRUE(InitConfig("fill_on_free")); 327 ASSERT_EQ(FILL_ON_FREE, config->options); 328 ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes); 329 330 ASSERT_STREQ("", getFakeLogBuf().c_str()); 331 ASSERT_STREQ("", getFakeLogPrint().c_str()); 332 } 333 334 TEST_F(MallocDebugConfigTest, fill) { 335 ASSERT_TRUE(InitConfig("fill=64")); 336 ASSERT_EQ(FILL_ON_ALLOC | FILL_ON_FREE, config->options); 337 ASSERT_EQ(64U, config->fill_on_alloc_bytes); 338 ASSERT_EQ(64U, config->fill_on_free_bytes); 339 340 ASSERT_TRUE(InitConfig("fill")); 341 ASSERT_EQ(FILL_ON_ALLOC | FILL_ON_FREE, config->options); 342 ASSERT_EQ(SIZE_MAX, config->fill_on_alloc_bytes); 343 ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes); 344 345 ASSERT_STREQ("", getFakeLogBuf().c_str()); 346 ASSERT_STREQ("", getFakeLogPrint().c_str()); 347 } 348 349 TEST_F(MallocDebugConfigTest, expand_alloc) { 350 ASSERT_TRUE(InitConfig("expand_alloc=1234")); 351 ASSERT_EQ(EXPAND_ALLOC, config->options); 352 ASSERT_EQ(1234U, config->expand_alloc_bytes); 353 354 ASSERT_TRUE(InitConfig("expand_alloc")); 355 ASSERT_EQ(EXPAND_ALLOC, config->options); 356 ASSERT_EQ(16U, config->expand_alloc_bytes); 357 358 ASSERT_STREQ("", getFakeLogBuf().c_str()); 359 ASSERT_STREQ("", getFakeLogPrint().c_str()); 360 } 361 362 TEST_F(MallocDebugConfigTest, free_track) { 363 ASSERT_TRUE(InitConfig("free_track=1234")); 364 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 365 ASSERT_EQ(1234U, config->free_track_allocations); 366 ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes); 367 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 368 369 ASSERT_TRUE(InitConfig("free_track")); 370 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 371 ASSERT_EQ(100U, config->free_track_allocations); 372 ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes); 373 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 374 375 ASSERT_STREQ("", getFakeLogBuf().c_str()); 376 ASSERT_STREQ("", getFakeLogPrint().c_str()); 377 } 378 379 TEST_F(MallocDebugConfigTest, free_track_and_fill_on_free) { 380 ASSERT_TRUE(InitConfig("free_track=1234 fill_on_free=32")); 381 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 382 ASSERT_EQ(1234U, config->free_track_allocations); 383 ASSERT_EQ(32U, config->fill_on_free_bytes); 384 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 385 386 ASSERT_TRUE(InitConfig("free_track fill_on_free=60")); 387 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 388 ASSERT_EQ(100U, config->free_track_allocations); 389 ASSERT_EQ(60U, config->fill_on_free_bytes); 390 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 391 392 ASSERT_STREQ("", getFakeLogBuf().c_str()); 393 ASSERT_STREQ("", getFakeLogPrint().c_str()); 394 } 395 396 TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames) { 397 ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames=123")); 398 399 ASSERT_EQ(0U, config->options); 400 ASSERT_EQ(123U, config->free_track_backtrace_num_frames); 401 402 ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames")); 403 ASSERT_EQ(0U, config->options); 404 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 405 406 ASSERT_STREQ("", getFakeLogBuf().c_str()); 407 ASSERT_STREQ("", getFakeLogPrint().c_str()); 408 } 409 410 TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_zero) { 411 ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames=0")); 412 413 ASSERT_EQ(0U, config->options); 414 ASSERT_EQ(0U, config->free_track_backtrace_num_frames); 415 416 ASSERT_STREQ("", getFakeLogBuf().c_str()); 417 ASSERT_STREQ("", getFakeLogPrint().c_str()); 418 } 419 420 TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_and_free_track) { 421 ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames=123")); 422 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 423 ASSERT_EQ(123U, config->free_track_backtrace_num_frames); 424 425 ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames")); 426 ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options); 427 ASSERT_EQ(16U, config->free_track_backtrace_num_frames); 428 429 ASSERT_STREQ("", getFakeLogBuf().c_str()); 430 ASSERT_STREQ("", getFakeLogPrint().c_str()); 431 } 432 433 TEST_F(MallocDebugConfigTest, leak_track) { 434 ASSERT_TRUE(InitConfig("leak_track")); 435 ASSERT_EQ(LEAK_TRACK | TRACK_ALLOCS, config->options); 436 437 ASSERT_STREQ("", getFakeLogBuf().c_str()); 438 ASSERT_STREQ("", getFakeLogPrint().c_str()); 439 } 440 441 TEST_F(MallocDebugConfigTest, leak_track_fail) { 442 ASSERT_FALSE(InitConfig("leak_track=100")); 443 444 ASSERT_STREQ("", getFakeLogBuf().c_str()); 445 std::string log_msg( 446 "6 malloc_debug malloc_testing: value set for option 'leak_track' " 447 "which does not take a value\n"); 448 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 449 } 450 451 TEST_F(MallocDebugConfigTest, guard_min_error) { 452 ASSERT_FALSE(InitConfig("guard=0")); 453 454 ASSERT_STREQ("", getFakeLogBuf().c_str()); 455 std::string log_msg( 456 "6 malloc_debug malloc_testing: bad value for option 'guard', value must be >= 1: 0\n"); 457 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 458 } 459 460 TEST_F(MallocDebugConfigTest, guard_max_error) { 461 ASSERT_FALSE(InitConfig("guard=20000")); 462 463 ASSERT_STREQ("", getFakeLogBuf().c_str()); 464 std::string log_msg( 465 "6 malloc_debug malloc_testing: bad value for option 'guard', " 466 "value must be <= 16384: 20000\n"); 467 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 468 } 469 470 TEST_F(MallocDebugConfigTest, front_guard_min_error) { 471 ASSERT_FALSE(InitConfig("front_guard=0")); 472 473 ASSERT_STREQ("", getFakeLogBuf().c_str()); 474 std::string log_msg( 475 "6 malloc_debug malloc_testing: bad value for option 'front_guard', " 476 "value must be >= 1: 0\n"); 477 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 478 } 479 480 TEST_F(MallocDebugConfigTest, front_guard_max_error) { 481 ASSERT_FALSE(InitConfig("front_guard=20000")); 482 483 ASSERT_STREQ("", getFakeLogBuf().c_str()); 484 std::string log_msg( 485 "6 malloc_debug malloc_testing: bad value for option 'front_guard', " 486 "value must be <= 16384: 20000\n"); 487 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 488 } 489 490 TEST_F(MallocDebugConfigTest, rear_guard_min_error) { 491 ASSERT_FALSE(InitConfig("rear_guard=0")); 492 493 ASSERT_STREQ("", getFakeLogBuf().c_str()); 494 std::string log_msg( 495 "6 malloc_debug malloc_testing: bad value for option 'rear_guard', " 496 "value must be >= 1: 0\n"); 497 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 498 } 499 500 TEST_F(MallocDebugConfigTest, rear_guard_max_error) { 501 ASSERT_FALSE(InitConfig("rear_guard=20000")); 502 503 ASSERT_STREQ("", getFakeLogBuf().c_str()); 504 std::string log_msg( 505 "6 malloc_debug malloc_testing: bad value for option 'rear_guard', " 506 "value must be <= 16384: 20000\n"); 507 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 508 } 509 510 TEST_F(MallocDebugConfigTest, fill_min_error) { 511 ASSERT_FALSE(InitConfig("fill=0")); 512 513 ASSERT_STREQ("", getFakeLogBuf().c_str()); 514 std::string log_msg( 515 "6 malloc_debug malloc_testing: bad value for option 'fill', " 516 "value must be >= 1: 0\n"); 517 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 518 } 519 520 TEST_F(MallocDebugConfigTest, fill_on_alloc_min_error) { 521 ASSERT_FALSE(InitConfig("fill_on_alloc=0")); 522 523 ASSERT_STREQ("", getFakeLogBuf().c_str()); 524 std::string log_msg( 525 "6 malloc_debug malloc_testing: bad value for option 'fill_on_alloc', " 526 "value must be >= 1: 0\n"); 527 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 528 } 529 530 TEST_F(MallocDebugConfigTest, fill_on_free_min_error) { 531 ASSERT_FALSE(InitConfig("fill_on_free=0")); 532 533 ASSERT_STREQ("", getFakeLogBuf().c_str()); 534 std::string log_msg( 535 "6 malloc_debug malloc_testing: bad value for option 'fill_on_free', " 536 "value must be >= 1: 0\n"); 537 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 538 } 539 540 TEST_F(MallocDebugConfigTest, backtrace_min_error) { 541 ASSERT_FALSE(InitConfig("backtrace=0")); 542 543 ASSERT_STREQ("", getFakeLogBuf().c_str()); 544 std::string log_msg( 545 "6 malloc_debug malloc_testing: bad value for option 'backtrace', " 546 "value must be >= 1: 0\n"); 547 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 548 } 549 550 TEST_F(MallocDebugConfigTest, backtrace_max_error) { 551 ASSERT_FALSE(InitConfig("backtrace=300")); 552 553 ASSERT_STREQ("", getFakeLogBuf().c_str()); 554 std::string log_msg( 555 "6 malloc_debug malloc_testing: bad value for option 'backtrace', " 556 "value must be <= 256: 300\n"); 557 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 558 } 559 560 TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal_min_error) { 561 ASSERT_FALSE(InitConfig("backtrace_enable_on_signal=0")); 562 563 ASSERT_STREQ("", getFakeLogBuf().c_str()); 564 std::string log_msg( 565 "6 malloc_debug malloc_testing: bad value for option 'backtrace_enable_on_signal', " 566 "value must be >= 1: 0\n"); 567 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 568 } 569 570 TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal_max_error) { 571 ASSERT_FALSE(InitConfig("backtrace_enable_on_signal=300")); 572 573 ASSERT_STREQ("", getFakeLogBuf().c_str()); 574 std::string log_msg( 575 "6 malloc_debug malloc_testing: bad value for option 'backtrace_enable_on_signal', " 576 "value must be <= 256: 300\n"); 577 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 578 } 579 580 TEST_F(MallocDebugConfigTest, expand_alloc_min_error) { 581 ASSERT_FALSE(InitConfig("expand_alloc=0")); 582 583 ASSERT_STREQ("", getFakeLogBuf().c_str()); 584 std::string log_msg( 585 "6 malloc_debug malloc_testing: bad value for option 'expand_alloc', " 586 "value must be >= 1: 0\n"); 587 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 588 } 589 590 TEST_F(MallocDebugConfigTest, expand_alloc_max_error) { 591 ASSERT_FALSE(InitConfig("expand_alloc=21000")); 592 593 ASSERT_STREQ("", getFakeLogBuf().c_str()); 594 std::string log_msg( 595 "6 malloc_debug malloc_testing: bad value for option 'expand_alloc', " 596 "value must be <= 16384: 21000\n"); 597 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 598 } 599 600 TEST_F(MallocDebugConfigTest, free_track_min_error) { 601 ASSERT_FALSE(InitConfig("free_track=0")); 602 603 ASSERT_STREQ("", getFakeLogBuf().c_str()); 604 std::string log_msg( 605 "6 malloc_debug malloc_testing: bad value for option 'free_track', " 606 "value must be >= 1: 0\n"); 607 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 608 } 609 610 TEST_F(MallocDebugConfigTest, free_track_max_error) { 611 ASSERT_FALSE(InitConfig("free_track=21000")); 612 613 ASSERT_STREQ("", getFakeLogBuf().c_str()); 614 std::string log_msg( 615 "6 malloc_debug malloc_testing: bad value for option 'free_track', " 616 "value must be <= 16384: 21000\n"); 617 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 618 } 619 620 TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_max_error) { 621 ASSERT_FALSE(InitConfig("free_track_backtrace_num_frames=400")); 622 623 ASSERT_STREQ("", getFakeLogBuf().c_str()); 624 std::string log_msg( 625 "6 malloc_debug malloc_testing: bad value for option 'free_track_backtrace_num_frames', " 626 "value must be <= 256: 400\n"); 627 ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str()); 628 } 629