blob: 572af5a8bb6ef8a310fff076d545dd386967e59e [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
Karl Wiberg29e7bee2018-03-22 14:11:52 +010011#include "rtc_base/memory/aligned_malloc.h"
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000012
kwibergbfefb032016-05-01 14:53:46 -070013#include <memory>
14
kwiberg77eab702016-09-28 17:42:01 -070015#ifdef _WIN32
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000016#include <windows.h>
17#else
18#include <stdint.h>
19#endif
20
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "test/gtest.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) {
kwibergbfefb032016-05-01 14:53:46 -070027 std::unique_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 }
Karl Wiberg79eb1d92017-11-08 12:26:07 +010032 const uintptr_t scoped_address = reinterpret_cast<uintptr_t>(scoped.get());
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000033 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;
kwibergbfefb032016-05-01 14:53:46 -070040 std::unique_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);
Karl Wiberg79eb1d92017-11-08 12:26:07 +010043 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;
Karl Wiberg79eb1d92017-11-08 12:26:07 +010045 const char* misaligned_ptr =
46 reinterpret_cast<const char*>(misaligned_address);
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000047 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