| // 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_observer.h" | |
| #include <lib/gtest/test_loop_fixture.h> | |
| #include <zircon/types.h> | |
| #include <array> | |
| #include <gtest/gtest.h> | |
| namespace monitor { | |
| namespace test { | |
| class PressureObserverUnitTest : public gtest::TestLoopFixture { | |
| public: | |
| PressureObserverUnitTest() : observer_(false) {} | |
| protected: | |
| void RetrieveAndVerifyEvents() { | |
| std::array<zx_koid_t, Level::kNumLevels> koids; | |
| for (size_t i = 0; i < Level::kNumLevels; i++) { | |
| // Events are valid. | |
| ASSERT_TRUE(observer_.events_[i].is_valid()); | |
| zx_info_handle_basic_t info; | |
| ASSERT_EQ(zx_object_get_info(observer_.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() { | |
| // The first wait returns immediately, signaling the current pressure level. | |
| observer_.WaitOnLevelChange(); | |
| // Memory pressure level is valid. | |
| ASSERT_LT(observer_.level_, Level::kNumLevels); | |
| } | |
| void VerifyEventsWaitedOn() { | |
| observer_.WaitOnLevelChange(); | |
| // Events we will wait on exclude the one currently asserted. | |
| for (size_t i = 0; i < Level::kNumLevels - 1; i++) { | |
| ASSERT_NE(observer_.wait_items_[i].handle, observer_.events_[observer_.level_].get()); | |
| } | |
| } | |
| private: | |
| PressureObserver observer_; | |
| }; | |
| TEST_F(PressureObserverUnitTest, Events) { RetrieveAndVerifyEvents(); } | |
| TEST_F(PressureObserverUnitTest, InitialLevel) { VerifyInitialLevel(); } | |
| TEST_F(PressureObserverUnitTest, WaitOnEvents) { VerifyEventsWaitedOn(); } | |
| } // namespace test | |
| } // namespace monitor |