blob: b60aa6139959103d82e3dcef9ad40e3744fda051 [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 "src/developer/memory/monitor/pressure.h"
#include <lib/gtest/test_loop_fixture.h>
#include <zircon/types.h>
#include <array>
#include <gtest/gtest.h>
namespace monitor {
namespace test {
class PressureUnitTest : public gtest::TestLoopFixture {
public:
PressureUnitTest() : pressure_(false) {}
protected:
void RetrieveAndVerifyEvents() {
ASSERT_EQ(pressure_.InitMemPressureEvents(), ZX_OK);
std::array<zx_koid_t, Level::kNumLevels> koids;
for (size_t i = 0; i < Level::kNumLevels; i++) {
// Events are valid.
ASSERT_TRUE(pressure_.events_[i].is_valid());
zx_info_handle_basic_t info;
ASSERT_EQ(zx_object_get_info(pressure_.events_[i].get(), ZX_INFO_HANDLE_BASIC, &info,
sizeof(info), nullptr, nullptr),
ZX_OK);
koids[i] = info.koid;
EXPECT_EQ(info.type, ZX_OBJ_TYPE_EVENT);
EXPECT_EQ(info.rights, ZX_DEFAULT_SYSTEM_EVENT_LOW_MEMORY_RIGHTS);
}
// Events are distinct.
for (size_t i = 0; i < Level::kNumLevels; i++) {
for (size_t j = 0; j < i; j++) {
ASSERT_NE(koids[i], koids[j]);
}
}
}
void VerifyInitialLevel() {
ASSERT_EQ(pressure_.InitMemPressureEvents(), ZX_OK);
// The first wait returns immediately, signaling the current pressure level.
pressure_.WaitOnLevelChange();
// Memory pressure level is valid.
ASSERT_LT(pressure_.level_, Level::kNumLevels);
}
void VerifyEventsWaitedOn() {
ASSERT_EQ(pressure_.InitMemPressureEvents(), ZX_OK);
pressure_.WaitOnLevelChange();
// Events we will wait on exclude the one currently asserted.
for (size_t i = 0; i < Level::kNumLevels - 1; i++) {
ASSERT_NE(pressure_.wait_items_[i].handle, pressure_.events_[pressure_.level_].get());
}
}
private:
Pressure pressure_;
};
TEST_F(PressureUnitTest, Events) { RetrieveAndVerifyEvents(); }
TEST_F(PressureUnitTest, InitialLevel) { VerifyInitialLevel(); }
TEST_F(PressureUnitTest, WaitOnEvents) { VerifyEventsWaitedOn(); }
} // namespace test
} // namespace monitor