1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specic language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <algorithm> 18 #include <thread> 19 20 #include <gtest/gtest.h> 21 22 #include "perfmgr/RequestGroup.h" 23 24 namespace android { 25 namespace perfmgr { 26 27 using namespace std::chrono_literals; 28 29 constexpr double kTIMING_TOLERANCE_MS = std::chrono::milliseconds(25).count(); 30 31 // Test GetRequestValue() 32 TEST(RequestGroupTest, GetRequestValueTest) { 33 std::string test_str = "TESTREQ_1"; 34 RequestGroup req(test_str); 35 EXPECT_EQ(test_str, req.GetRequestValue()); 36 } 37 38 // Test AddRequest() 39 TEST(RequestGroupTest, AddRequestTest) { 40 RequestGroup req(""); 41 auto start = std::chrono::steady_clock::now(); 42 auto duration = 500ms; 43 bool ret = req.AddRequest("INTERACTION", start + duration); 44 EXPECT_EQ(true, ret); 45 auto sleep_time = 200ms; 46 std::this_thread::sleep_for(sleep_time); 47 std::chrono::milliseconds expire_time; 48 bool active = req.GetExpireTime(&expire_time); 49 EXPECT_NEAR((duration - sleep_time).count(), expire_time.count(), 50 kTIMING_TOLERANCE_MS); 51 EXPECT_EQ(true, active); 52 } 53 54 // Test AddRequest() with a huge expire time which could be done in some long 55 // persist power hint such as VR_MODE 56 TEST(RequestGroupTest, AddRequestNoExpireTest) { 57 RequestGroup req(""); 58 bool ret = req.AddRequest("INTERACTION", ReqTime::max()); 59 EXPECT_EQ(true, ret); 60 std::chrono::milliseconds expire_time; 61 bool active = req.GetExpireTime(&expire_time); 62 auto expect = std::chrono::duration_cast<std::chrono::milliseconds>( 63 ReqTime::max() - std::chrono::steady_clock::now()); 64 EXPECT_NEAR(expect.count(), expire_time.count(), kTIMING_TOLERANCE_MS); 65 // expire time is greater than 1 year 66 EXPECT_LE(365 * 24 * 60 * 60 * 1000, expire_time.count()); 67 EXPECT_EQ(true, active); 68 } 69 70 // Test AddRequest() and expires 71 TEST(RequestGroupTest, AddRequestTestExpire) { 72 RequestGroup req(""); 73 auto start = std::chrono::steady_clock::now(); 74 auto duration = 5ms; 75 bool ret = req.AddRequest("INTERACTION", start + duration); 76 EXPECT_EQ(true, ret); 77 ret = req.AddRequest("INTERACTION", start + duration + 1ms); 78 EXPECT_EQ(false, ret); 79 std::this_thread::sleep_for(duration + 10ms); 80 std::chrono::milliseconds expire_time; 81 bool active = req.GetExpireTime(&expire_time); 82 EXPECT_EQ(std::chrono::milliseconds::max(), expire_time); 83 EXPECT_EQ(false, active); 84 } 85 86 // Test AddRequest() with new value 87 TEST(RequestGroupTest, AddRequestNewValue) { 88 RequestGroup req(""); 89 auto start = std::chrono::steady_clock::now(); 90 auto duration = 5000ms; 91 bool ret = req.AddRequest("INTERACTION", start + duration); 92 EXPECT_EQ(true, ret); 93 std::chrono::milliseconds expire_time; 94 bool active = req.GetExpireTime(&expire_time); 95 EXPECT_NEAR(duration.count(), expire_time.count(), kTIMING_TOLERANCE_MS); 96 EXPECT_EQ(true, active); 97 // Add a request shorter than the current outstanding one, expiration time 98 // not changed 99 auto shorter_duration = 100ms; 100 ret = req.AddRequest("INTERACTION", start + shorter_duration); 101 EXPECT_EQ(false, ret); 102 active = req.GetExpireTime(&expire_time); 103 EXPECT_NEAR(duration.count(), expire_time.count(), kTIMING_TOLERANCE_MS); 104 EXPECT_EQ(true, active); 105 // Add a request longer than the current outstanding one, expiration time 106 // changed 107 duration = 10000ms; 108 ret = req.AddRequest("INTERACTION", start + duration); 109 EXPECT_EQ(false, ret); 110 active = req.GetExpireTime(&expire_time); 111 EXPECT_NEAR(duration.count(), expire_time.count(), kTIMING_TOLERANCE_MS); 112 EXPECT_EQ(true, active); 113 } 114 115 // Test multiple AddRequest() with different hint_type 116 TEST(RequestGroupTest, AddRequestTestMutiple) { 117 RequestGroup req(""); 118 auto start = std::chrono::steady_clock::now(); 119 auto duration_interact = 500ms; 120 req.AddRequest("INTERACTION", start + duration_interact); 121 auto duration_launch = 5000ms; 122 req.AddRequest("LAUNCH", start + duration_launch); 123 std::chrono::milliseconds expire_time; 124 bool active = req.GetExpireTime(&expire_time); 125 EXPECT_NEAR(std::min(duration_interact, duration_launch).count(), 126 expire_time.count(), kTIMING_TOLERANCE_MS); 127 EXPECT_EQ(true, active); 128 } 129 130 // Test RemoveRequest() 131 TEST(RequestGroupTest, RemoveRequestTest) { 132 RequestGroup req(""); 133 auto start = std::chrono::steady_clock::now(); 134 auto duration_interact = 500ms; 135 req.AddRequest("INTERACTION", start + duration_interact); 136 bool ret = req.RemoveRequest("INTERACTION"); 137 EXPECT_EQ(true, ret); 138 std::chrono::milliseconds expire_time; 139 bool active = req.GetExpireTime(&expire_time); 140 EXPECT_EQ(std::chrono::milliseconds::max(), expire_time); 141 EXPECT_EQ(false, active); 142 // Test removing an already-removed request 143 ret = req.RemoveRequest("INTERACTION"); 144 EXPECT_EQ(false, ret); 145 } 146 147 // Test multiple RemoveRequest() with different hint_type 148 TEST(RequestGroupTest, RemoveRequestTestMutiple) { 149 RequestGroup req(""); 150 auto start = std::chrono::steady_clock::now(); 151 auto duration_interact = 500ms; 152 req.AddRequest("INTERACTION", start + duration_interact); 153 auto duration_launch = 50000ms; 154 req.AddRequest("LAUNCH", start + duration_launch); 155 req.RemoveRequest("INTERACTION"); 156 std::chrono::milliseconds expire_time; 157 bool active = req.GetExpireTime(&expire_time); 158 EXPECT_NEAR(duration_launch.count(), expire_time.count(), 159 kTIMING_TOLERANCE_MS); 160 EXPECT_EQ(true, active); 161 } 162 163 } // namespace perfmgr 164 } // namespace android 165