blob: fbd5d6e1f65f9b288cea4923a409859a123eca31 [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
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
kwiberg77eab702016-09-28 17:42:01 -070021#include "webrtc/test/gtest.h"
pbos@webrtc.orgacaf3a12013-05-27 15:07:45 +000022#include "webrtc/typedefs.h"
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000023
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000024namespace webrtc {
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000025
26// Returns true if |size| and |alignment| are valid combinations.
27bool CorrectUsage(size_t size, size_t alignment) {
kwibergbfefb032016-05-01 14:53:46 -070028 std::unique_ptr<char, AlignedFreeDeleter> scoped(
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000029 static_cast<char*>(AlignedMalloc(size, alignment)));
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000030 if (scoped.get() == NULL) {
31 return false;
32 }
33 const uintptr_t scoped_address = reinterpret_cast<uintptr_t> (scoped.get());
34 return 0u == scoped_address % alignment;
35}
36
37TEST(AlignedMalloc, GetRightAlign) {
38 const size_t size = 100;
39 const size_t alignment = 32;
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000040 const size_t left_misalignment = 1;
kwibergbfefb032016-05-01 14:53:46 -070041 std::unique_ptr<char, AlignedFreeDeleter> scoped(
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000042 static_cast<char*>(AlignedMalloc(size, alignment)));
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000043 EXPECT_TRUE(scoped.get() != NULL);
44 const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000045 const uintptr_t misaligned_address = aligned_address - left_misalignment;
46 const char* misaligned_ptr = reinterpret_cast<const char*>(
47 misaligned_address);
48 const char* realigned_ptr = GetRightAlign(misaligned_ptr, alignment);
henrike@webrtc.org46d40732012-10-03 16:50:37 +000049 EXPECT_EQ(scoped.get(), realigned_ptr);
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000050}
51
52TEST(AlignedMalloc, IncorrectSize) {
53 const size_t incorrect_size = 0;
54 const size_t alignment = 64;
55 EXPECT_FALSE(CorrectUsage(incorrect_size, alignment));
56}
57
58TEST(AlignedMalloc, IncorrectAlignment) {
59 const size_t size = 100;
60 const size_t incorrect_alignment = 63;
61 EXPECT_FALSE(CorrectUsage(size, incorrect_alignment));
62}
63
64TEST(AlignedMalloc, AlignTo2Bytes) {
65 size_t size = 100;
66 size_t alignment = 2;
67 EXPECT_TRUE(CorrectUsage(size, alignment));
68}
69
70TEST(AlignedMalloc, AlignTo32Bytes) {
71 size_t size = 100;
72 size_t alignment = 32;
73 EXPECT_TRUE(CorrectUsage(size, alignment));
74}
75
76TEST(AlignedMalloc, AlignTo128Bytes) {
77 size_t size = 100;
78 size_t alignment = 128;
79 EXPECT_TRUE(CorrectUsage(size, alignment));
80}
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000081
82} // namespace webrtc
83