1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/system_wrappers/include/aligned_malloc.h" 12 13 #if _WIN32 14 #include <windows.h> 15 #else 16 #include <stdint.h> 17 #endif 18 19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "webrtc/base/scoped_ptr.h" 21 #include "webrtc/typedefs.h" 22 23 namespace webrtc { 24 25 // Returns true if |size| and |alignment| are valid combinations. 26 bool CorrectUsage(size_t size, size_t alignment) { 27 rtc::scoped_ptr<char, AlignedFreeDeleter> scoped( 28 static_cast<char*>(AlignedMalloc(size, alignment))); 29 if (scoped.get() == NULL) { 30 return false; 31 } 32 const uintptr_t scoped_address = reinterpret_cast<uintptr_t> (scoped.get()); 33 return 0u == scoped_address % alignment; 34 } 35 36 TEST(AlignedMalloc, GetRightAlign) { 37 const size_t size = 100; 38 const size_t alignment = 32; 39 const size_t left_misalignment = 1; 40 rtc::scoped_ptr<char, AlignedFreeDeleter> scoped( 41 static_cast<char*>(AlignedMalloc(size, alignment))); 42 EXPECT_TRUE(scoped.get() != NULL); 43 const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get()); 44 const uintptr_t misaligned_address = aligned_address - left_misalignment; 45 const char* misaligned_ptr = reinterpret_cast<const char*>( 46 misaligned_address); 47 const char* realigned_ptr = GetRightAlign(misaligned_ptr, alignment); 48 EXPECT_EQ(scoped.get(), realigned_ptr); 49 } 50 51 TEST(AlignedMalloc, IncorrectSize) { 52 const size_t incorrect_size = 0; 53 const size_t alignment = 64; 54 EXPECT_FALSE(CorrectUsage(incorrect_size, alignment)); 55 } 56 57 TEST(AlignedMalloc, IncorrectAlignment) { 58 const size_t size = 100; 59 const size_t incorrect_alignment = 63; 60 EXPECT_FALSE(CorrectUsage(size, incorrect_alignment)); 61 } 62 63 TEST(AlignedMalloc, AlignTo2Bytes) { 64 size_t size = 100; 65 size_t alignment = 2; 66 EXPECT_TRUE(CorrectUsage(size, alignment)); 67 } 68 69 TEST(AlignedMalloc, AlignTo32Bytes) { 70 size_t size = 100; 71 size_t alignment = 32; 72 EXPECT_TRUE(CorrectUsage(size, alignment)); 73 } 74 75 TEST(AlignedMalloc, AlignTo128Bytes) { 76 size_t size = 100; 77 size_t alignment = 128; 78 EXPECT_TRUE(CorrectUsage(size, alignment)); 79 } 80 81 } // namespace webrtc 82 83