blob: bbb110425218933a6522f5079bbcbeba5da62e20 [file] [log] [blame]
// 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