1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker *
5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker */
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard Worker #include <cinttypes>
12*523fa7a6SAndroid Build Coastguard Worker
13*523fa7a6SAndroid Build Coastguard Worker #include <gmock/gmock.h> // For MATCHER_P
14*523fa7a6SAndroid Build Coastguard Worker
15*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
16*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
17*523fa7a6SAndroid Build Coastguard Worker namespace testing {
18*523fa7a6SAndroid Build Coastguard Worker
19*523fa7a6SAndroid Build Coastguard Worker /**
20*523fa7a6SAndroid Build Coastguard Worker * Returns true if the address of `ptr` is a whole multiple of `alignment`.
21*523fa7a6SAndroid Build Coastguard Worker */
is_aligned(const void * ptr,size_t alignment)22*523fa7a6SAndroid Build Coastguard Worker inline bool is_aligned(const void* ptr, size_t alignment) {
23*523fa7a6SAndroid Build Coastguard Worker auto addr = reinterpret_cast<uintptr_t>(ptr);
24*523fa7a6SAndroid Build Coastguard Worker return addr % alignment == 0;
25*523fa7a6SAndroid Build Coastguard Worker }
26*523fa7a6SAndroid Build Coastguard Worker
27*523fa7a6SAndroid Build Coastguard Worker /**
28*523fa7a6SAndroid Build Coastguard Worker * Lets gtest users write `EXPECT_THAT(ptr, IsAlignedTo(alignment))` or
29*523fa7a6SAndroid Build Coastguard Worker * `EXPECT_THAT(ptr, Not(IsAlignedTo(alignment)))`.
30*523fa7a6SAndroid Build Coastguard Worker *
31*523fa7a6SAndroid Build Coastguard Worker * See also `EXPECT_ALIGNED()`.
32*523fa7a6SAndroid Build Coastguard Worker */
33*523fa7a6SAndroid Build Coastguard Worker MATCHER_P(IsAlignedTo, other, "") {
34*523fa7a6SAndroid Build Coastguard Worker return is_aligned(arg, other);
35*523fa7a6SAndroid Build Coastguard Worker }
36*523fa7a6SAndroid Build Coastguard Worker
37*523fa7a6SAndroid Build Coastguard Worker /*
38*523fa7a6SAndroid Build Coastguard Worker * Helpers for checking the alignment of a pointer.
39*523fa7a6SAndroid Build Coastguard Worker */
40*523fa7a6SAndroid Build Coastguard Worker
41*523fa7a6SAndroid Build Coastguard Worker #define EXPECT_ALIGNED(ptr, alignment) \
42*523fa7a6SAndroid Build Coastguard Worker EXPECT_THAT((ptr), executorch::runtime::testing::IsAlignedTo((alignment)))
43*523fa7a6SAndroid Build Coastguard Worker #define ASSERT_ALIGNED(ptr, alignment) \
44*523fa7a6SAndroid Build Coastguard Worker ASSERT_THAT((ptr), executorch::runtime::testing::IsAlignedTo((alignment)))
45*523fa7a6SAndroid Build Coastguard Worker
46*523fa7a6SAndroid Build Coastguard Worker } // namespace testing
47*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
48*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
49