|  | // 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 |