blob: 7afbf6d1bba89deddcfd724648394da8f837eb09 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "test/gtest.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020022#include "typedefs.h" // NOLINT(build/include)
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 }
Karl Wiberg79eb1d92017-11-08 12:26:07 +010033 const uintptr_t scoped_address = reinterpret_cast<uintptr_t>(scoped.get());
henrike@webrtc.orgcd9adf72012-09-29 03:49:36 +000034 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);
Karl Wiberg79eb1d92017-11-08 12:26:07 +010044 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;
Karl Wiberg79eb1d92017-11-08 12:26:07 +010046 const char* misaligned_ptr =
47 reinterpret_cast<const char*>(misaligned_address);
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000048 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