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 "htrace_hisysevent_parser.h" 20 #include "string_to_numerical.h" 21 #include "trace_streamer_selector.h" 22 23 using namespace testing::ext; 24 using namespace SysTuning::TraceStreamer; 25 namespace SysTuning { 26 namespace TraceStreamer { 27 class HtraceHisysEventParserTest : public ::testing::Test { 28 public: SetUp()29 void SetUp() 30 { 31 stream_.InitFilter(); 32 } 33 TearDown()34 void TearDown() {} 35 36 public: 37 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; 38 }; 39 namespace base { 40 auto num0 = SysTuning::base::number(15, SysTuning::base::INTEGER_RADIX_TYPE_DEC); 41 auto num1 = SysTuning::base::number(15, SysTuning::base::INTEGER_RADIX_TYPE_HEX); 42 } // namespace base 43 /** 44 * @tc.name: ParseNoArray 45 * @tc.desc: Parse a piece of data without array 46 * @tc.type: FUNC 47 */ 48 HWTEST_F(HtraceHisysEventParserTest, ParseNoArray, TestSize.Level1) 49 { 50 TS_LOGI("test9-1"); 51 std::string jsMessage = 52 "{\"domain_\":\"POWERTHERMAL\",\"name_\":\"POWER_IDE_BATTERY\",\"type_\":1,\"time_\":22611696002,\"tz_\":\"+" 53 "0000\",\"pid_\":722,\"tid_\":3462,\"uid_\":1201,\"START_TIME\":22611696002,\"END_TIME\":23617705010,\"GAS_" 54 "GAUGE\":124,\"LEVEL\":33,\"SCREEN\":11,\"CHARGE\":21,\"CURRENT\":-404,\"CAPACITY\":9898,\"level_\":\"MINOR\"," 55 "\"id_\":\"16494176919818340149\",\"info_\":\"\"}"; 56 HtraceHisyseventParser::json jMessage; 57 HtraceHisyseventParser::JsonData jData; 58 size_t maxArraySize = 0; 59 uint64_t serial = 1; 60 std::vector<size_t> noArrayIndex; 61 std::vector<size_t> arrayIndex; 62 std::stringstream ss; 63 ss << jsMessage; 64 ss >> jMessage; 65 HtraceHisyseventParser HisysEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 66 (void)HisysEvent.JGetData(jMessage, jData, maxArraySize, noArrayIndex, arrayIndex); 67 EXPECT_TRUE(jData.eventSource == "POWER_IDE_BATTERY"); 68 EXPECT_EQ(jData.timeStamp, 22611696002); 69 EXPECT_EQ(maxArraySize, 0); 70 EXPECT_EQ(noArrayIndex.size(), 17); 71 EXPECT_EQ(arrayIndex.size(), 0); 72 DataIndex eventSourceIndex = stream_.traceDataCache_->GetDataIndex(jData.eventSource); 73 HisysEvent.CommonDataParser(jData, eventSourceIndex, serial); 74 auto size = stream_.traceDataCache_->GetConstSyseventMeasureData().Size(); 75 EXPECT_EQ(size, 17); 76 auto anticipate = stream_.traceDataCache_->GetConstSyseventMeasureData().Serial()[0]; 77 EXPECT_EQ(anticipate, serial); 78 EXPECT_TRUE(base::num0 == "15"); 79 EXPECT_TRUE(base::num1 == "f"); 80 } 81 /** 82 * @tc.name: ParseHaveArrayData 83 * @tc.desc: Parse a piece of data with array 84 * @tc.type: FUNC 85 */ 86 HWTEST_F(HtraceHisysEventParserTest, ParseHaveArrayData, TestSize.Level1) 87 { 88 TS_LOGI("test9-2"); 89 std::string jsMessage = 90 "{\"domain_\":\"POWERTHERMAL\",\"name_\":\"POWER_IDE_WIFISCAN\",\"type_\":2,\"time_\":16611696002,\"tz_\":\"+" 91 "0000\",\"pid_\":722,\"tid_\":17827,\"uid_\":1201,\"START_TIME\":1661783047454,\"END_TIME\":1661783050455," 92 "\"COUNT\":1,\"APPNAME\":[\"com.ohos.settings\",\"com.ohos.settings_js\",\"com.ohos.settings_app\"]," 93 "\"FOREGROUND_COUNT\":[43,41,65],\"FOREGROUND_ENERGY\":[120,134,532],\"BACKGROUND_COUNT\":[27,856,378]," 94 "\"BACKGROUND_ENERGY\":[638,65,12],\"SCREEN_ON_COUNT\":[23,558,75],\"SCREEN_ON_ENERGY\":[552,142,120],\"SCREEN_" 95 "OFF_COUNT\":[78,354,21],\"SCREEN_OFF_ENERGY\":[352,65,436],\"level_\":\"MINOR\",\"id_\":" 96 "\"17560016619580787102\",\"info_\":\"\"}"; 97 HtraceHisyseventParser::json jMessage; 98 HtraceHisyseventParser::JsonData jData; 99 size_t maxArraySize = 0; 100 uint64_t serial = 1; 101 std::vector<size_t> noArrayIndex; 102 std::vector<size_t> arrayIndex; 103 std::stringstream ss; 104 ss << jsMessage; 105 ss >> jMessage; 106 HtraceHisyseventParser HisysEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 107 (void)HisysEvent.JGetData(jMessage, jData, maxArraySize, noArrayIndex, arrayIndex); 108 EXPECT_TRUE(jData.eventSource == "POWER_IDE_WIFISCAN"); 109 EXPECT_EQ(jData.timeStamp, 16611696002); 110 EXPECT_EQ(maxArraySize, 3); 111 EXPECT_EQ(noArrayIndex.size(), 12); 112 EXPECT_EQ(arrayIndex.size(), 9); 113 DataIndex eventSourceIndex = stream_.traceDataCache_->GetDataIndex(jData.eventSource); 114 HisysEvent.NoArrayDataParse(jData, noArrayIndex, eventSourceIndex, serial); 115 HisysEvent.ArrayDataParse(jData, arrayIndex, eventSourceIndex, maxArraySize, serial); 116 auto size = stream_.traceDataCache_->GetConstSyseventMeasureData().Size(); 117 EXPECT_EQ(size, (9 * 3 + 12)); 118 auto anticipate = stream_.traceDataCache_->GetConstSyseventMeasureData().Serial()[0]; 119 EXPECT_EQ(anticipate, serial); 120 } 121 /** 122 * @tc.name: MixedDataAnalysis 123 * @tc.desc: Mixed data analysis 124 * @tc.type: FUNC 125 */ 126 HWTEST_F(HtraceHisysEventParserTest, MixedDataAnalysis, TestSize.Level1) 127 { 128 TS_LOGI("test9-3"); 129 std::string jsMessage1 = 130 "{\"domain_\":\"POWERTHERMAL\",\"name_\":\"POWER_IDE_BATTERY\",\"type_\":1,\"time_\":22611696002,\"tz_\":\"+" 131 "0000\",\"pid_\":722,\"tid_\":3462,\"uid_\":1201,\"START_TIME\":22611696002,\"END_TIME\":23617705010,\"GAS_" 132 "GAUGE\":124,\"LEVEL\":33,\"SCREEN\":11,\"CHARGE\":21,\"CURRENT\":-404,\"CAPACITY\":9898,\"level_\":\"MINOR\"," 133 "\"id_\":\"16494176919818340149\",\"info_\":\"\"}"; 134 std::string jsMessage2 = 135 "{\"domain_\":\"POWERTHERMAL\",\"name_\":\"POWER_IDE_WIFISCAN\",\"type_\":2,\"time_\":16611696002,\"tz_\":\"+" 136 "0000\",\"pid_\":722,\"tid_\":17827,\"uid_\":1201,\"START_TIME\":1661783047454,\"END_TIME\":1661783050455," 137 "\"COUNT\":1,\"APPNAME\":[\"com.ohos.settings\",\"com.ohos.settings_js\",\"com.ohos.settings_app\"]," 138 "\"FOREGROUND_COUNT\":[43,41,65],\"FOREGROUND_ENERGY\":[120,134,532],\"BACKGROUND_COUNT\":[27,856,378]," 139 "\"BACKGROUND_ENERGY\":[638,65,12],\"SCREEN_ON_COUNT\":[23,558,75],\"SCREEN_ON_ENERGY\":[552,142,120],\"SCREEN_" 140 "OFF_COUNT\":[78,354,21],\"SCREEN_OFF_ENERGY\":[352,65,436],\"level_\":\"MINOR\",\"id_\":" 141 "\"17560016619580787102\",\"info_\":\"\"}"; 142 std::vector<std::string> jsMessage; 143 jsMessage.push_back(jsMessage1); 144 jsMessage.push_back(jsMessage2); 145 uint64_t serial = 1; 146 for (auto i = jsMessage.begin(); i != jsMessage.end(); i++) { 147 HtraceHisyseventParser::json jMessage; 148 HtraceHisyseventParser::JsonData jData; 149 size_t maxArraySize = 0; 150 std::vector<size_t> noArrayIndex; 151 std::vector<size_t> arrayIndex; 152 std::stringstream ss; 153 ss << *i; 154 ss >> jMessage; 155 HtraceHisyseventParser HisysEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 156 (void)HisysEvent.JGetData(jMessage, jData, maxArraySize, noArrayIndex, arrayIndex); 157 if (jData.eventSource == "POWER_IDE_WIFISCAN") { 158 EXPECT_TRUE(jData.eventSource == "POWER_IDE_WIFISCAN"); 159 EXPECT_EQ(jData.timeStamp, 16611696002); 160 EXPECT_EQ(maxArraySize, 3); 161 EXPECT_EQ(noArrayIndex.size(), 12); 162 EXPECT_EQ(arrayIndex.size(), 9); 163 } else { 164 EXPECT_TRUE(jData.eventSource == "POWER_IDE_BATTERY"); 165 EXPECT_EQ(jData.timeStamp, 22611696002); 166 EXPECT_EQ(maxArraySize, 0); 167 EXPECT_EQ(noArrayIndex.size(), 17); 168 EXPECT_EQ(arrayIndex.size(), 0); 169 } 170 DataIndex eventSourceIndex = stream_.traceDataCache_->GetDataIndex(jData.eventSource); 171 if (maxArraySize) { 172 HisysEvent.NoArrayDataParse(jData, noArrayIndex, eventSourceIndex, serial); 173 HisysEvent.ArrayDataParse(jData, arrayIndex, eventSourceIndex, maxArraySize, serial); 174 } else { 175 HisysEvent.CommonDataParser(jData, eventSourceIndex, serial); 176 } 177 } 178 auto size = stream_.traceDataCache_->GetConstSyseventMeasureData().Size(); 179 EXPECT_EQ(size, 17 + (9 * 3 + 12)); 180 auto anticipate = stream_.traceDataCache_->GetConstSyseventMeasureData().Serial()[0]; 181 EXPECT_EQ(anticipate, serial); 182 } 183 } // namespace TraceStreamer 184 } // namespace SysTuning 185