1 // Copyright (C) 2018 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include <gmock/gmock.h> 16 #include <gtest/gtest.h> 17 #include <stdio.h> 18 #include <chrono> 19 #include <thread> 20 #include <vector> 21 #include "../metrics/metrics_test_helper.h" 22 #include "src/stats_log_util.h" 23 #include "tests/statsd_test_util.h" 24 25 #ifdef __ANDROID__ 26 27 namespace android { 28 namespace os { 29 namespace statsd { 30 31 using namespace testing; 32 using std::make_shared; 33 using std::shared_ptr; 34 using std::vector; 35 using std::this_thread::sleep_for; 36 using testing::Contains; 37 38 // cooldown time 1sec. 39 int pullTagId = 10014; 40 41 bool pullSuccess; 42 vector<std::shared_ptr<LogEvent>> pullData; 43 long pullDelayNs; 44 45 class FakePuller : public StatsPuller { 46 public: 47 FakePuller() : StatsPuller(pullTagId){}; 48 49 private: 50 bool PullInternal(vector<std::shared_ptr<LogEvent>>* data) override { 51 (*data) = pullData; 52 sleep_for(std::chrono::nanoseconds(pullDelayNs)); 53 return pullSuccess; 54 } 55 }; 56 57 FakePuller puller; 58 59 shared_ptr<LogEvent> createSimpleEvent(int64_t eventTimeNs, int64_t value) { 60 shared_ptr<LogEvent> event = make_shared<LogEvent>(pullTagId, eventTimeNs); 61 event->write(value); 62 event->init(); 63 return event; 64 } 65 66 class StatsPullerTest : public ::testing::Test { 67 public: 68 StatsPullerTest() { 69 } 70 71 void SetUp() override { 72 puller.ForceClearCache(); 73 pullSuccess = false; 74 pullDelayNs = 0; 75 pullData.clear(); 76 } 77 }; 78 79 TEST_F(StatsPullerTest, PullSucces) { 80 pullData.push_back(createSimpleEvent(1111L, 33)); 81 82 pullSuccess = true; 83 84 vector<std::shared_ptr<LogEvent>> dataHolder; 85 EXPECT_TRUE(puller.Pull(&dataHolder)); 86 EXPECT_EQ(1, dataHolder.size()); 87 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId()); 88 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs()); 89 EXPECT_EQ(1, dataHolder[0]->size()); 90 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value); 91 92 sleep_for(std::chrono::seconds(1)); 93 94 pullData.clear(); 95 pullData.push_back(createSimpleEvent(2222L, 44)); 96 97 pullSuccess = true; 98 99 EXPECT_TRUE(puller.Pull(&dataHolder)); 100 EXPECT_EQ(1, dataHolder.size()); 101 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId()); 102 EXPECT_EQ(2222L, dataHolder[0]->GetElapsedTimestampNs()); 103 EXPECT_EQ(1, dataHolder[0]->size()); 104 EXPECT_EQ(44, dataHolder[0]->getValues()[0].mValue.int_value); 105 } 106 107 TEST_F(StatsPullerTest, PullFailAfterSuccess) { 108 pullData.push_back(createSimpleEvent(1111L, 33)); 109 110 pullSuccess = true; 111 112 vector<std::shared_ptr<LogEvent>> dataHolder; 113 EXPECT_TRUE(puller.Pull(&dataHolder)); 114 EXPECT_EQ(1, dataHolder.size()); 115 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId()); 116 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs()); 117 EXPECT_EQ(1, dataHolder[0]->size()); 118 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value); 119 120 sleep_for(std::chrono::seconds(1)); 121 122 pullData.clear(); 123 pullData.push_back(createSimpleEvent(2222L, 44)); 124 125 pullSuccess = false; 126 dataHolder.clear(); 127 EXPECT_FALSE(puller.Pull(&dataHolder)); 128 EXPECT_EQ(0, dataHolder.size()); 129 130 pullSuccess = true; 131 dataHolder.clear(); 132 EXPECT_FALSE(puller.Pull(&dataHolder)); 133 EXPECT_EQ(0, dataHolder.size()); 134 } 135 136 // Test pull takes longer than timeout, 2nd pull happens shorter than cooldown 137 TEST_F(StatsPullerTest, PullTakeTooLongAndPullFast) { 138 pullData.push_back(createSimpleEvent(1111L, 33)); 139 pullSuccess = true; 140 // timeout is 0.5 141 pullDelayNs = (long)(0.8 * NS_PER_SEC); 142 143 vector<std::shared_ptr<LogEvent>> dataHolder; 144 EXPECT_FALSE(puller.Pull(&dataHolder)); 145 EXPECT_EQ(0, dataHolder.size()); 146 147 pullData.clear(); 148 pullData.push_back(createSimpleEvent(2222L, 44)); 149 150 pullSuccess = true; 151 dataHolder.clear(); 152 EXPECT_FALSE(puller.Pull(&dataHolder)); 153 EXPECT_EQ(0, dataHolder.size()); 154 } 155 156 TEST_F(StatsPullerTest, PullFail) { 157 pullData.push_back(createSimpleEvent(1111L, 33)); 158 159 pullSuccess = false; 160 161 vector<std::shared_ptr<LogEvent>> dataHolder; 162 EXPECT_FALSE(puller.Pull(&dataHolder)); 163 EXPECT_EQ(0, dataHolder.size()); 164 } 165 166 TEST_F(StatsPullerTest, PullTakeTooLong) { 167 pullData.push_back(createSimpleEvent(1111L, 33)); 168 169 pullSuccess = true; 170 pullDelayNs = NS_PER_SEC; 171 172 vector<std::shared_ptr<LogEvent>> dataHolder; 173 EXPECT_FALSE(puller.Pull(&dataHolder)); 174 EXPECT_EQ(0, dataHolder.size()); 175 } 176 177 TEST_F(StatsPullerTest, PullTooFast) { 178 pullData.push_back(createSimpleEvent(1111L, 33)); 179 180 pullSuccess = true; 181 182 vector<std::shared_ptr<LogEvent>> dataHolder; 183 EXPECT_TRUE(puller.Pull(&dataHolder)); 184 EXPECT_EQ(1, dataHolder.size()); 185 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId()); 186 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs()); 187 EXPECT_EQ(1, dataHolder[0]->size()); 188 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value); 189 190 pullData.clear(); 191 pullData.push_back(createSimpleEvent(2222L, 44)); 192 193 pullSuccess = true; 194 195 dataHolder.clear(); 196 EXPECT_TRUE(puller.Pull(&dataHolder)); 197 EXPECT_EQ(1, dataHolder.size()); 198 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId()); 199 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs()); 200 EXPECT_EQ(1, dataHolder[0]->size()); 201 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value); 202 } 203 204 TEST_F(StatsPullerTest, PullFailsAndTooFast) { 205 pullData.push_back(createSimpleEvent(1111L, 33)); 206 207 pullSuccess = false; 208 209 vector<std::shared_ptr<LogEvent>> dataHolder; 210 EXPECT_FALSE(puller.Pull(&dataHolder)); 211 EXPECT_EQ(0, dataHolder.size()); 212 213 pullData.clear(); 214 pullData.push_back(createSimpleEvent(2222L, 44)); 215 216 pullSuccess = true; 217 218 EXPECT_FALSE(puller.Pull(&dataHolder)); 219 EXPECT_EQ(0, dataHolder.size()); 220 } 221 222 } // namespace statsd 223 } // namespace os 224 } // namespace android 225 #else 226 GTEST_LOG_(INFO) << "This test does nothing.\n"; 227 #endif 228