blob: 3933c2ac05d22c4b84955a6f8b26634ea5158c40 [file] [log] [blame]
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +00001/*
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
Henrik Kjellander98f53512015-10-28 18:17:40 +010011#include "webrtc/system_wrappers/include/aligned_malloc.h"
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000012
13#if _WIN32
14#include <windows.h>
15#else
16#include <stdint.h>
17#endif
18
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000019#include "testing/gtest/include/gtest/gtest.h"
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000020#include "webrtc/base/scoped_ptr.h"
pbos@webrtc.orgacaf3a12013-05-27 15:07:45 +000021#include "webrtc/typedefs.h"
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000022
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000023namespace webrtc {
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000024
25// Returns true if |size| and |alignment| are valid combinations.
26bool CorrectUsage(size_t size, size_t alignment) {
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000027 rtc::scoped_ptr<char, AlignedFreeDeleter> scoped(
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000028 static_cast<char*>(AlignedMalloc(size, alignment)));
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000029 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
36TEST(AlignedMalloc, GetRightAlign) {
37 const size_t size = 100;
38 const size_t alignment = 32;
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000039 const size_t left_misalignment = 1;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000040 rtc::scoped_ptr<char, AlignedFreeDeleter> scoped(
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000041 static_cast<char*>(AlignedMalloc(size, alignment)));
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000042 EXPECT_TRUE(scoped.get() != NULL);
43 const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000044 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);
henrike@webrtc.org46d40732012-10-03 16:50:37 +000048 EXPECT_EQ(scoped.get(), realigned_ptr);
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000049}
50
51TEST(AlignedMalloc, IncorrectSize) {
52 const size_t incorrect_size = 0;
53 const size_t alignment = 64;
54 EXPECT_FALSE(CorrectUsage(incorrect_size, alignment));
55}
56
57TEST(AlignedMalloc, IncorrectAlignment) {
58 const size_t size = 100;
59 const size_t incorrect_alignment = 63;
60 EXPECT_FALSE(CorrectUsage(size, incorrect_alignment));
61}
62
63TEST(AlignedMalloc, AlignTo2Bytes) {
64 size_t size = 100;
65 size_t alignment = 2;
66 EXPECT_TRUE(CorrectUsage(size, alignment));
67}
68
69TEST(AlignedMalloc, AlignTo32Bytes) {
70 size_t size = 100;
71 size_t alignment = 32;
72 EXPECT_TRUE(CorrectUsage(size, alignment));
73}
74
75TEST(AlignedMalloc, AlignTo128Bytes) {
76 size_t size = 100;
77 size_t alignment = 128;
78 EXPECT_TRUE(CorrectUsage(size, alignment));
79}
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000080
81} // namespace webrtc
82