1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 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 16 #include <hwext/gtest-ext.h> 17 #include <hwext/gtest-tag.h> 18 19 #include "cpu_filter.h" 20 #include "process_filter.h" 21 #include "ts_common.h" 22 23 using namespace testing::ext; 24 using namespace SysTuning::TraceStreamer; 25 namespace SysTuning { 26 namespace TraceStreamer { 27 class CpuFilterTest : public ::testing::Test { 28 public: SetUp()29 void SetUp() 30 { 31 streamFilters_.cpuFilter_ = std::make_unique<CpuFilter>(&traceDataCache_, &streamFilters_); 32 streamFilters_.processFilter_ = std::make_unique<ProcessFilter>(&traceDataCache_, &streamFilters_); 33 } 34 TearDown()35 void TearDown() {} 36 37 public: 38 TraceStreamerFilters streamFilters_; 39 TraceDataCache traceDataCache_; 40 }; 41 42 /** 43 * @tc.name: CpufilterInsertWakeupTest 44 * @tc.desc: Test CpuFilter insert WakeupEvent 45 * @tc.type: FUNC 46 */ 47 HWTEST_F(CpuFilterTest, CpufilterInsertWakeupTest, TestSize.Level1) 48 { 49 TS_LOGI("test4-1"); 50 /* InsertWakeupEvent ts, internalTid */ 51 uint64_t ts1 = 168758662877000; 52 uint64_t itid = 1; 53 streamFilters_.cpuFilter_->InsertWakeupEvent(ts1, itid); // 1st waking 54 55 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itid) == 0); 56 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itid) == TASK_RUNNABLE); 57 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 1); // 0 thread state only 58 } 59 60 /** 61 * @tc.name: CpufilterInsertSwitchTest 62 * @tc.desc: Test CpuFilter insert SwitchEvent 63 * @tc.type: FUNC 64 */ 65 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchTest, TestSize.Level1) 66 { 67 TS_LOGI("test4-2"); 68 uint64_t ts1 = 168758662919000; 69 uint64_t itidPre = 2; 70 uint64_t prePior = 120; 71 uint64_t cpu = 0; 72 uint64_t itidNext = 3; 73 uint64_t nextPior = 124; 74 75 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 76 nextPior); // 1st switch 77 printf("state of pre itid: %llu\n", streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre)); 78 79 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INTERRUPTIBLE); 80 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 81 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 0); 82 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 2); // 2 thread state 83 } 84 85 /** 86 * @tc.name: CpufilterInsertSwitchFromZeroThread 87 * @tc.desc: Test CpuFilter insert SwitchEvent switch from zero thread 88 * @tc.type: FUNC 89 */ 90 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchFromZeroThread, TestSize.Level1) 91 { 92 TS_LOGI("test4-3"); 93 uint64_t ts1 = 168758662919000; 94 uint64_t itidPre = 0; 95 uint64_t prePior = 120; 96 uint64_t cpu = 0; 97 uint64_t itidNext = 3; 98 uint64_t nextPior = 124; 99 100 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 101 nextPior); // 1st switch 102 printf("state of pre itid: %llu\n", streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre)); 103 104 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INVALID); 105 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 106 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 0); 107 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 1); // 1 thread state 108 } 109 110 /** 111 * @tc.name: CpufilterInsertSwitchToZeroThread 112 * @tc.desc: Test CpuFilter insert SwitchEvent switch to zero thread 113 * @tc.type: FUNC 114 */ 115 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchToZeroThread, TestSize.Level1) 116 { 117 TS_LOGI("test4-4"); 118 uint64_t ts1 = 168758662919000; 119 uint64_t itidPre = 2; 120 uint64_t prePior = 120; 121 uint64_t cpu = 0; 122 uint64_t itidNext = 0; 123 uint64_t nextPior = 124; 124 125 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 126 nextPior); // 1st switch 127 printf("state of pre itid: %llu\n", streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre)); 128 129 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INTERRUPTIBLE); 130 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_INVALID); 131 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == INVALID_UINT64); 132 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 1); // 1 thread state 133 } 134 135 /** 136 * @tc.name: CpufilterInsertSwitchDoubleThread 137 * @tc.desc: Test CpuFilter insert SwitchEvent, A switch to B and B switch to A 138 * @tc.type: FUNC 139 */ 140 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchDoubleThread, TestSize.Level1) 141 { 142 TS_LOGI("test4-5"); 143 uint64_t ts1 = 168758662919000; 144 uint64_t itidPre = 2; 145 uint64_t prePior = 120; 146 uint64_t cpu = 0; 147 uint64_t itidNext = 3; 148 uint64_t nextPior = 124; 149 150 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 151 nextPior); // 1st switch 152 153 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INTERRUPTIBLE); 154 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 155 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 0); 156 157 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 2); // 2 thread state 158 159 ts1 = 168758663017000; 160 itidPre = 3; 161 prePior = 120; 162 cpu = 0; 163 itidNext = 4; 164 nextPior = 120; 165 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 166 nextPior); // 2nd switch 167 168 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 169 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 2); 170 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidPre) == 3); 171 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 4); // 4 thread state 172 } 173 174 /** 175 * @tc.name: CpufilterInsertSwitchThreeThread 176 * @tc.desc: Test CpuFilter insert SwitchEvent, A switch to B and B switch to C 177 * @tc.type: FUNC 178 */ 179 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchThreeThread, TestSize.Level1) 180 { 181 TS_LOGI("test4-6"); 182 uint64_t ts1 = 168758662919000; 183 uint64_t itidPre = 2; 184 uint64_t prePior = 120; 185 uint64_t cpu = 0; 186 uint64_t itidNext = 3; 187 uint64_t nextPior = 124; 188 189 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 190 nextPior); // 1st switch 191 192 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INTERRUPTIBLE); 193 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 194 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 0); 195 196 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 2); // 2 thread state 197 198 ts1 = 168758663017000; 199 itidPre = 3; 200 prePior = 120; 201 cpu = 0; 202 itidNext = 2; 203 nextPior = 120; 204 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_RUNNABLE, itidNext, 205 nextPior); // 2nd switch 206 207 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 208 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 2); 209 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidPre) == 3); 210 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 4); // 4 thread state 211 } 212 213 /** 214 * @tc.name: CpufilterInsertSwitchTestZero 215 * @tc.desc: Test CpuFilter insert SwitchEvent, A switch to B and B switch to zero thread 216 * @tc.type: FUNC 217 */ 218 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchTestZero, TestSize.Level1) 219 { 220 TS_LOGI("test4-7"); 221 uint64_t ts1 = 168758662919000; 222 uint64_t itidPre = 2; 223 uint64_t prePior = 120; 224 uint64_t cpu = 0; 225 uint64_t itidNext = 3; 226 uint64_t nextPior = 124; 227 228 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_INTERRUPTIBLE, itidNext, 229 nextPior); // 1st switch 230 231 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidPre) == TASK_INTERRUPTIBLE); 232 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 233 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 0); 234 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 2); // 2 thread state 235 236 ts1 = 168758663017000; 237 itidPre = 0; 238 prePior = 120; 239 cpu = 0; 240 itidNext = 4; 241 nextPior = 120; 242 streamFilters_.cpuFilter_->InsertSwitchEvent(ts1, cpu, itidPre, prePior, TASK_RUNNABLE, itidNext, 243 nextPior); // 2nd switch 244 245 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itidNext) == TASK_RUNNING); 246 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itidNext) == 2); 247 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 3); // 4 thread state 248 } 249 250 /** 251 * @tc.name: CpufiltertWakeingTest 252 * @tc.desc: Test CpuFilter insert Waking Event 253 * @tc.type: FUNC 254 */ 255 HWTEST_F(CpuFilterTest, CpufiltertWakeingTest, TestSize.Level1) 256 { 257 TS_LOGI("test4-8"); 258 uint64_t ts1 = 168758662919000; 259 uint64_t itid = 2; 260 261 streamFilters_.cpuFilter_->InsertWakeupEvent(ts1, itid); 262 263 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itid) == TASK_RUNNABLE); 264 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itid) == 0); 265 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 1); // 0 thread state 266 } 267 268 /** 269 * @tc.name: CpufiltertWakingTwice 270 * @tc.desc: Test CpuFilter insert Waking Event, one thread waking twice 271 * @tc.type: FUNC 272 */ 273 HWTEST_F(CpuFilterTest, CpufiltertWakingTwice, TestSize.Level1) 274 { 275 TS_LOGI("test4-9"); 276 uint64_t ts1 = 168758662919000; 277 uint64_t itid = 2; 278 279 streamFilters_.cpuFilter_->InsertWakeupEvent(ts1, itid); 280 ts1 = 168758662929000; 281 itid = 4; 282 streamFilters_.cpuFilter_->InsertWakeupEvent(ts1, itid); 283 284 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(itid) == TASK_RUNNABLE); 285 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(itid) == 1); 286 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 2); // 0 thread state 287 } 288 289 /** 290 * @tc.name: CpufilterInsertSwitchTestFull 291 * @tc.desc: Parsing multiple switch and wakeup alternates 292 * @tc.type: FUNC 293 */ 294 HWTEST_F(CpuFilterTest, CpufilterInsertSwitchTestFull, TestSize.Level1) 295 { 296 TS_LOGI("test4-10"); 297 /* InsertWakeupEvent ts, internalTid */ 298 /* InsertSwitchEvent ts, cpu, prevPid, prevPior, prevState, nextPid, nextPior */ 299 streamFilters_.cpuFilter_->InsertWakeupEvent(168758662877000, 1); // 1st waking 300 301 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(1) == 0); 302 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(1) == TASK_RUNNABLE); 303 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 1); // 0 thread state only 304 305 streamFilters_.cpuFilter_->InsertSwitchEvent(168758662919000, 0, 1, 120, TASK_INTERRUPTIBLE, 2, 124); // 1st switch 306 307 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(1) == TASK_INTERRUPTIBLE); 308 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(2) == TASK_RUNNING); 309 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(2) == 1); 310 // 2 thread state, the waking event add a runnable state 311 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 3); 312 streamFilters_.cpuFilter_->InsertSwitchEvent(168758663017000, 0, 0, 120, TASK_RUNNABLE, 4, 120); // 2nd switch 313 314 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(4) == TASK_RUNNING); 315 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(4) == 3); 316 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 4); // 4 thread state 317 318 streamFilters_.cpuFilter_->InsertWakeupEvent(168758663078000, 0); // 2nd waking 319 320 streamFilters_.cpuFilter_->InsertWakeupEvent(168758663092000, 0); // 3rd waking 321 322 streamFilters_.cpuFilter_->InsertSwitchEvent(168758663107000, 0, 2, 124, TASK_RUNNABLE, 5, 98); // 3rd switch 323 324 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(5) == TASK_RUNNING); 325 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(2) == TASK_RUNNABLE); 326 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(5) == 6); 327 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(2) == 7); 328 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 8); // 6 thread state 329 330 streamFilters_.cpuFilter_->InsertSwitchEvent(168758663126000, 0, 5, 98, TASK_INTERRUPTIBLE, 2, 124); // 4th switch 331 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(2) == TASK_RUNNING); 332 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(5) == TASK_INTERRUPTIBLE); 333 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(2) == 8); 334 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(5) == 9); 335 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 10); // 8 thread state 336 337 streamFilters_.cpuFilter_->InsertSwitchEvent(168758663136000, 3, 5, 120, TASK_RUNNABLE, 6, 120); // 5th switch 338 339 EXPECT_TRUE(streamFilters_.cpuFilter_->StateOfInternalTidInStateTable(6) == TASK_RUNNING); 340 EXPECT_TRUE(streamFilters_.cpuFilter_->RowOfInternalTidInStateTable(6) == 10); 341 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->Size() == 12); // 10 thread state 342 343 // after 3rd switch 344 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->DursData()[1] == 168758663107000 - 168758662919000); 345 // after 4th switch 346 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->DursData()[6] == 168758663126000 - 168758663107000); 347 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->DursData()[7] == 168758663126000 - 168758663107000); 348 // after 5th switch 349 EXPECT_TRUE(traceDataCache_.GetThreadStateData()->DursData()[9] == 168758663136000 - 168758663126000); 350 } 351 } // namespace TraceStreamer 352 } // namespace SysTuning 353