| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "arc/setup/art_container.h" |
| |
| #include <unistd.h> |
| |
| #include <limits> |
| |
| #include <gtest/gtest.h> |
| |
| namespace arc { |
| namespace { |
| |
| // Tests that ChooseRelocationOffsetDelta() returns a reasonable value when |
| // seed is non-zero. |
| TEST(ArtContainer, TestChooseRelocationOffsetDelta) { |
| const int32_t page_size = getpagesize(); |
| const int32_t min = page_size; |
| const int32_t max = min * 3; |
| const int32_t test_range = max * 2; |
| |
| for (uint64_t seed = 0; seed < test_range; ++seed) { |
| const int32_t offset = |
| ArtContainer::ChooseRelocationOffsetDeltaForTesting(min, max, seed); |
| EXPECT_LE(min, offset) << seed; |
| EXPECT_GE(max, offset) << seed; |
| EXPECT_EQ(0, offset % page_size) << seed; |
| } |
| |
| constexpr uint64_t kUint64Max = std::numeric_limits<uint64_t>::max(); |
| for (uint64_t seed = kUint64Max; seed >= kUint64Max - test_range; --seed) { |
| const int32_t offset = |
| ArtContainer::ChooseRelocationOffsetDeltaForTesting(min, max, seed); |
| EXPECT_LE(min, offset) << seed; |
| EXPECT_GE(max, offset) << seed; |
| EXPECT_EQ(0, offset % page_size) << seed; |
| } |
| } |
| |
| // Does the same without a seed. |
| TEST(ArtContainer, TestChooseRelocationOffsetDelta_Random) { |
| const int32_t page_size = getpagesize(); |
| const int32_t min = page_size; |
| const int32_t max = min * 3; |
| |
| constexpr int32_t kNumLoop = 1024; |
| for (uint64_t count = 0; count < kNumLoop; ++count) { |
| const int32_t offset = |
| ArtContainer::ChooseRelocationOffsetDeltaForTesting(min, max, 0); |
| EXPECT_LE(min, offset) << offset; |
| EXPECT_GE(max, offset) << offset; |
| EXPECT_EQ(0, offset % page_size) << offset; |
| } |
| } |
| |
| } // namespace |
| } // namespace arc |