1 /*
2 * Copyright (c) 2025 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 <charconv>
17 #include <gtest/gtest.h>
18 #include <functional>
19
20 #include "app_caller_event.h"
21 #include "file_util.h"
22 #include "trace_common.h"
23 #include "trace_db_callback.h"
24 #include "trace_flow_controller.h"
25 #include "trace_state_machine.h"
26 #include "time_util.h"
27
28 using namespace testing::ext;
29 using namespace OHOS::HiviewDFX;
30 using namespace OHOS::NativeRdb;
31 namespace {
32 const std::string TEST_DB_PATH = "/data/test/trace_storage_test/";
33 const std::vector<std::string> TAG_GROUPS = {"scene_performance"};
34 const std::string DEVELOPER_MODE_TRACE_ARGS = "tags:sched, freq, disk, sync, binder, mmc, membus, load, pagecache, \
35 workq, ipa, hdf, virse, net, dsched, graphic, multimodalinput, dinput, ark, ace, window, zaudio, daudio, zmedia, \
36 dcamera, zcamera, dhfwk, app, gresource, ability, power, samgr, ffrt clockType:boot1 bufferSize:32768 overwrite:0 \
37 fileLimit:20 fileSize:102400";
38
InnerCreateAppCallerEvent(int32_t uid,uint64_t happendTime)39 std::shared_ptr<AppCallerEvent> InnerCreateAppCallerEvent(int32_t uid, uint64_t happendTime)
40 {
41 std::shared_ptr<AppCallerEvent> appCallerEvent = std::make_shared<AppCallerEvent>("HiViewService");
42 appCallerEvent->messageType_ = Event::MessageType::PLUGIN_MAINTENANCE;
43 appCallerEvent->eventName_ = "DUMP_APP_TRACE";
44 appCallerEvent->isBusinessJank_ = false;
45 appCallerEvent->bundleName_ = "com.example.helloworld";
46 appCallerEvent->bundleVersion_ = "2.0.1";
47 appCallerEvent->uid_ = uid;
48 appCallerEvent->pid_ = 1000;
49 appCallerEvent->happenTime_ = happendTime;
50 appCallerEvent->beginTime_ = 0;
51 appCallerEvent->endTime_ = 0;
52 appCallerEvent->taskBeginTime_ = static_cast<int64_t>(TimeUtil::GetMilliseconds());
53 appCallerEvent->taskEndTime_ = appCallerEvent->taskBeginTime_;
54 appCallerEvent->resultCode_ = 0;
55 appCallerEvent->foreground_ = 1;
56 appCallerEvent->threadName_ = "mainThread";
57 return appCallerEvent;
58 }
59
60 class TestTelemetryCallback : public TelemetryCallback {
OnTelemetryStart()61 void OnTelemetryStart() override {}
OnTelemetryFinish()62 void OnTelemetryFinish() override {}
OnTelemetryTraceOn()63 void OnTelemetryTraceOn() override {}
OnTelemetryTraceOff()64 void OnTelemetryTraceOff() override {}
65 };
66 };
67
68 class TraceManagerTest : public testing::Test {
69 public:
SetUp()70 void SetUp() override
71 {
72 if (!FileUtil::FileExists(TEST_DB_PATH)) {
73 FileUtil::ForceCreateDirectory(TEST_DB_PATH);
74 }
75 };
76
TearDown()77 void TearDown() override
78 {
79 if (FileUtil::FileExists(TEST_DB_PATH)) {
80 FileUtil::ForceRemoveDirectory(TEST_DB_PATH);
81 }
82 };
83
SetUpTestCase()84 static void SetUpTestCase() {};
TearDownTestCase()85 static void TearDownTestCase() {};
86 };
87
88 /**
89 * @tc.name: TraceManagerTest001
90 * @tc.desc: used to test TraceFlowControl api: GetRemainingTraceSize
91 * @tc.type: FUNC
92 */
93 HWTEST_F(TraceManagerTest, TraceManagerTest001, TestSize.Level1)
94 {
95 auto flowController1 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
96 FlowController::DEFAULT_CONFIG_PATH);
97
98 int64_t traceSize1 = 699 * 1024 * 1024; // xpower trace Threshold is 150M
99 int64_t remainingSize = flowController1->GetRemainingTraceSize();
100 ASSERT_GT(remainingSize, 0);
101 ASSERT_GT(remainingSize, traceSize1);
102 flowController1->StoreDb(traceSize1);
103
104 sleep(1);
105 auto flowController2 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
106 FlowController::DEFAULT_CONFIG_PATH);
107 remainingSize = flowController2->GetRemainingTraceSize();
108 ASSERT_GT(remainingSize, 0);
109
110 // NeedUpload allow 10% over limits
111 int64_t traceSize2 = 70 * 1024 * 1024;
112 ASSERT_GT(remainingSize, traceSize2);
113 flowController2->StoreDb(traceSize2);
114
115 sleep(1);
116 auto flowController3 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
117 FlowController::DEFAULT_CONFIG_PATH);
118 remainingSize = flowController3->GetRemainingTraceSize();
119 ASSERT_LE(remainingSize, 0);
120 }
121
122 /**
123 * @tc.name: TraceManagerTest002
124 * @tc.desc: used to test TraceFlowControl api: GetRemainingTraceSize
125 * @tc.type: FUNC
126 */
127 HWTEST_F(TraceManagerTest, TraceManagerTest002, TestSize.Level1)
128 {
129 auto flowController1 = std::make_shared<TraceFlowController>(CallerName::HIVIEW, TEST_DB_PATH,
130 FlowController::DEFAULT_CONFIG_PATH);
131 int64_t traceSize1 = 149 * 1024 * 1024; // HIVIEW trace Threshold is 150M
132 int64_t remainingSize = flowController1->GetRemainingTraceSize();
133 ASSERT_GT(remainingSize, 0);
134 ASSERT_GT(remainingSize, traceSize1);
135 flowController1->StoreDb(traceSize1);
136 sleep(1);
137
138 auto flowController2 = std::make_shared<TraceFlowController>(CallerName::HIVIEW, TEST_DB_PATH,
139 FlowController::DEFAULT_CONFIG_PATH);
140 remainingSize = flowController2->GetRemainingTraceSize();
141 ASSERT_GT(remainingSize, 0);
142 int64_t traceSize2 = 100 * 1024 * 1024;
143 ASSERT_LE(remainingSize, traceSize2);
144 }
145
146 /**
147 * @tc.name: TraceManagerTest003
148 * @tc.desc: used to test TraceFlowControl api: HasCallOnceToday CleanOldAppTrace RecordCaller
149 * @tc.type: FUNC
150 */
151 HWTEST_F(TraceManagerTest, TraceManagerTest003, TestSize.Level1)
152 {
153 auto flowController1 = std::make_shared<TraceFlowController>(ClientName::APP, TEST_DB_PATH,
154 FlowController::DEFAULT_CONFIG_PATH);
155 int32_t appid1 = 100;
156 uint64_t happenTime1 = TimeUtil::GetMilliseconds() - 10000; // 10 seconds ago
157 auto appEvent1 = InnerCreateAppCallerEvent(appid1, happenTime1);
158 ASSERT_FALSE(flowController1->HasCallOnceToday(appid1, happenTime1));
159 flowController1->RecordCaller(appEvent1);
160 sleep(1);
161
162 auto flowController21 = std::make_shared<TraceFlowController>(ClientName::APP, TEST_DB_PATH,
163 FlowController::DEFAULT_CONFIG_PATH);
164 uint64_t happenTime2 = TimeUtil::GetMilliseconds() - 5000; // 5 seconds ago
165 auto appEvent21 = InnerCreateAppCallerEvent(appid1, happenTime2);
166 ASSERT_TRUE(flowController21->HasCallOnceToday(appid1, happenTime2));
167 flowController21->RecordCaller(appEvent21);
168 sleep(1);
169
170 auto flowController22 = std::make_shared<TraceFlowController>(ClientName::APP, TEST_DB_PATH,
171 FlowController::DEFAULT_CONFIG_PATH);
172 int32_t appid2 = 101;
173 ASSERT_FALSE(flowController22->HasCallOnceToday(appid2, happenTime2));
174 auto appEvent22 = InnerCreateAppCallerEvent(appid2, happenTime2);
175 flowController22->RecordCaller(appEvent22);
176
177 sleep(1);
178 std::string date = TimeUtil::TimestampFormatToDate(TimeUtil::GetSeconds(), "%Y%m%d");
179 int32_t dateNum = 0;
180 auto result = std::from_chars(date.c_str(), date.c_str() + date.size(), dateNum);
181 ASSERT_EQ(result.ec, std::errc());
182 flowController22->CleanOldAppTrace(dateNum + 1);
183
184 sleep(1);
185 auto flowController23 = std::make_shared<TraceFlowController>(ClientName::APP, TEST_DB_PATH,
186 FlowController::DEFAULT_CONFIG_PATH);
187 ASSERT_FALSE(flowController22->HasCallOnceToday(appid1, TimeUtil::GetMilliseconds()));
188 ASSERT_FALSE(flowController22->HasCallOnceToday(appid2, TimeUtil::GetMilliseconds()));
189 }
190
191 /**
192 * @tc.name: TraceManagerTest004
193 * @tc.desc: used to test TraceFlowControl api: UseCacheTimeQuota
194 * @tc.type: FUNC
195 */
196 HWTEST_F(TraceManagerTest, TraceManagerTest004, TestSize.Level1)
197 {
198 auto flowController = std::make_shared<TraceFlowController>("behavior", TEST_DB_PATH,
199 FlowController::DEFAULT_CONFIG_PATH);
200 ASSERT_EQ(flowController->UseCacheTimeQuota(10), CacheFlow::SUCCESS);
201 sleep(1);
202 ASSERT_EQ(flowController->UseCacheTimeQuota(10 * 60), CacheFlow::SUCCESS);
203 sleep(1);
204 ASSERT_NE(flowController->UseCacheTimeQuota(10), CacheFlow::SUCCESS);
205 }
206
207 /**
208 * @tc.name: TraceManagerTest005
209 * @tc.desc: used to test TraceFlowControl api: Telemetry interface
210 * @tc.type: FUNC
211 */
212 HWTEST_F(TraceManagerTest, TraceManagerTest005, TestSize.Level1)
213 {
214 std::map<std::string, int64_t> flowControlQuotas {
215 {CallerName::XPERF, 10000 },
216 {CallerName::XPOWER, 10000},
217 {CallerName::RELIABILITY, 10000},
218 {"Total", 25000}
219 };
220
221 std::map<std::string, int64_t> flowControlQuota2 {
222 {CallerName::XPERF, 100 },
223 {CallerName::XPOWER, 120},
224 {"Total", 180}
225 };
226
227 TraceFlowController flowController(BusinessName::TELEMETRY, TEST_DB_PATH, FlowController::DEFAULT_CONFIG_PATH);
228 int64_t runningTime = 0;
229 ASSERT_EQ(flowController.InitTelemetryData("id", runningTime, flowControlQuotas), TelemetryRet::SUCCESS);
230 sleep(1);
231 flowController.TelemetryStore(CallerName::XPERF, 9000);
232 ASSERT_EQ(flowController.NeedTelemetryDump(CallerName::XPERF), TelemetryRet::SUCCESS);
233 sleep(1);
234 flowController.TelemetryStore(CallerName::XPERF, 2000);
235 ASSERT_EQ(flowController.NeedTelemetryDump(CallerName::XPERF), TelemetryRet::OVER_FLOW);
236 sleep(1);
237 flowController.TelemetryStore(CallerName::XPOWER, 7000);
238 ASSERT_EQ(flowController.NeedTelemetryDump(CallerName::XPOWER), TelemetryRet::SUCCESS);
239 sleep(1);
240 flowController.TelemetryStore(CallerName::XPOWER, 6000);
241 ASSERT_EQ(flowController.NeedTelemetryDump(CallerName::XPOWER), TelemetryRet::OVER_FLOW);
242 sleep(1);
243
244 // Total over flow
245 flowController.TelemetryStore(CallerName::RELIABILITY, 3000);
246 ASSERT_EQ(flowController.NeedTelemetryDump(CallerName::RELIABILITY), TelemetryRet::OVER_FLOW);
247 flowController.ClearTelemetryData();
248
249 // data is cleared
250 TraceFlowController flowController2(BusinessName::TELEMETRY, TEST_DB_PATH);
251 ASSERT_EQ(flowController2.InitTelemetryData("id", runningTime, flowControlQuotas), TelemetryRet::SUCCESS);
252 flowController2.TelemetryStore(CallerName::XPOWER, 5000);
253 ASSERT_EQ(flowController2.NeedTelemetryDump(CallerName::XPOWER), TelemetryRet::SUCCESS);
254
255 // do not clear db
256 TraceFlowController flowController3(BusinessName::TELEMETRY, TEST_DB_PATH);
257
258 // Already init, old data still take effect
259 ASSERT_EQ(flowController2.InitTelemetryData("id", runningTime, flowControlQuota2), TelemetryRet::SUCCESS);
260
261 // flowControlQuota2 do not take effect
262
263 flowController2.TelemetryStore(CallerName::XPOWER, 500);
264 ASSERT_EQ(flowController2.NeedTelemetryDump(CallerName::XPOWER), TelemetryRet::SUCCESS);
265 flowController.ClearTelemetryData();
266
267 // flowControlQuota2 take effect
268 TraceFlowController flowController4(BusinessName::TELEMETRY, TEST_DB_PATH);
269 ASSERT_EQ(flowController4.InitTelemetryData("id", runningTime, flowControlQuota2), TelemetryRet::SUCCESS);
270 flowController4.TelemetryStore(CallerName::XPOWER, 500);
271 ASSERT_EQ(flowController4.NeedTelemetryDump(CallerName::XPOWER), TelemetryRet::OVER_FLOW);
272 }
273
274 /**
275 * @tc.name: TraceManagerTest005
276 * @tc.desc: used to test TraceFlowControl api: Telemetry interface
277 * @tc.type: FUNC
278 */
279 HWTEST_F(TraceManagerTest, TraceManagerTest006, TestSize.Level1)
280 {
281 std::map<std::string, int64_t> flowControlQuotas {
282 {CallerName::XPERF, 10000 },
283 {CallerName::XPOWER, 12000},
284 {"Total", 18000}
285 };
286 TraceFlowController flowController(BusinessName::TELEMETRY, TEST_DB_PATH, FlowController::DEFAULT_CONFIG_PATH);
287 int64_t runningTime1 = 0;
288 ASSERT_EQ(flowController.InitTelemetryData("id1", runningTime1, flowControlQuotas), TelemetryRet::SUCCESS);
289 ASSERT_EQ(runningTime1, 0);
290
291 // if data init, correct btime2 etime2 value
292 TraceFlowController flowController2(BusinessName::TELEMETRY, TEST_DB_PATH, FlowController::DEFAULT_CONFIG_PATH);
293 int64_t runningTime2 = 100;
294 ASSERT_EQ(flowController2.InitTelemetryData("id1", runningTime2, flowControlQuotas), TelemetryRet::SUCCESS);
295 ASSERT_EQ(runningTime2, 0);
296 flowController2.UpdateRunningTime(400);
297 flowController2.QueryRunningTime(runningTime2);
298 ASSERT_EQ(runningTime2, 400);
299 }
300
301 /**
302 * @tc.name: TraceManagerTest007
303 * @tc.desc: used to test TraceStateMachine command state
304 * @tc.type: FUNC
305 */
306 HWTEST_F(TraceManagerTest, TraceManagerTest007, TestSize.Level1)
307 {
308 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
309 ASSERT_TRUE(ret1.IsSuccess());
310
311 // trans to command state
312 TraceRetInfo info;
313 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
314 ASSERT_TRUE(ret2.IsSuccess());
315 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
316 ASSERT_EQ(ret3.stateError_, TraceStateCode::FAIL);
317 TraceRet ret40 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
318 ASSERT_EQ(ret40.stateError_, TraceStateCode::FAIL);
319 TraceRet ret4 = TraceStateMachine::GetInstance().TraceCacheOn();
320 ASSERT_EQ(ret4.stateError_, TraceStateCode::FAIL);
321 TraceRet ret5 = TraceStateMachine::GetInstance().TraceCacheOff();
322 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
323 TraceRet ret6 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
324 ASSERT_EQ(ret6.stateError_, TraceStateCode::FAIL);
325 TraceRet ret28 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
326 ASSERT_EQ(ret28.stateError_, TraceStateCode::FAIL);
327 TraceRet ret29 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
328 ASSERT_EQ(ret29.stateError_, TraceStateCode::FAIL);
329 TraceRet ret61 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
330 ASSERT_EQ(ret61.stateError_, TraceStateCode::FAIL);
331 TraceRet ret7 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
332 ASSERT_TRUE(ret7.IsSuccess());
333
334 // trans to command drop state
335 TraceRet ret8 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
336 ASSERT_EQ(ret8.stateError_, TraceStateCode::FAIL);
337 TraceRet ret9 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
338 ASSERT_EQ(ret9.stateError_, TraceStateCode::FAIL);
339 TraceRet ret10 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
340 ASSERT_EQ(ret10.stateError_, TraceStateCode::FAIL);
341 TraceRet ret41 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
342 ASSERT_EQ(ret41.stateError_, TraceStateCode::FAIL);
343 TraceRet ret20 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
344 ASSERT_EQ(ret20.stateError_, TraceStateCode::FAIL);
345 TraceRet ret21 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
346 ASSERT_EQ(ret21.stateError_, TraceStateCode::FAIL);
347 TraceRet ret50 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
348 ASSERT_EQ(ret50.stateError_, TraceStateCode::FAIL);
349 TraceRet ret22 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
350 ASSERT_TRUE(ret22.IsSuccess());
351
352 // trans to close state
353 TraceRet ret31 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
354 ASSERT_TRUE(ret31.IsSuccess());
355 TraceRet ret30 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
356 ASSERT_TRUE(ret30.IsSuccess());
357
358 // trans to command drop state
359 TraceRet ret25 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
360 ASSERT_EQ(ret25.stateError_, TraceStateCode::DENY);
361 TraceRet ret26 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
362 ASSERT_EQ(ret26.stateError_, TraceStateCode::DENY);
363 TraceRet ret27 = TraceStateMachine::GetInstance().OpenDynamicTrace(100);
364 ASSERT_EQ(ret27.stateError_, TraceStateCode::DENY);
365 TraceRet ret11 = TraceStateMachine::GetInstance().TraceCacheOn();
366 ASSERT_EQ(ret11.stateError_, TraceStateCode::FAIL);
367 TraceRet ret12 = TraceStateMachine::GetInstance().TraceCacheOff();
368 ASSERT_EQ(ret12.stateError_, TraceStateCode::FAIL);
369 TraceRet ret13 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
370 ASSERT_EQ(ret13.stateError_, TraceStateCode::FAIL);
371 TraceRet ret14 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
372 ASSERT_TRUE(ret14.IsSuccess());
373
374 // trans to command state
375 TraceRet ret24 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
376 ASSERT_EQ(ret24.stateError_, TraceStateCode::DENY);
377 TraceRet ret15 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
378 ASSERT_EQ(ret15.stateError_, TraceStateCode::DENY);
379 TraceRet ret23 = TraceStateMachine::GetInstance().OpenDynamicTrace(100);
380 ASSERT_EQ(ret23.stateError_, TraceStateCode::DENY);
381 TraceRet ret17 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
382 ASSERT_EQ(ret17.stateError_, TraceStateCode::FAIL);
383 TraceRet ret51 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
384 ASSERT_EQ(ret51.stateError_, TraceStateCode::FAIL);
385 TraceRet ret18 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
386 ASSERT_EQ(ret18.stateError_, TraceStateCode::FAIL);
387 TraceRet ret19 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
388 ASSERT_TRUE(ret19.IsSuccess());
389 }
390
391 /**
392 * @tc.name: TraceManagerTest008
393 * @tc.desc: used to test TraceStateMachine common state
394 * @tc.type: FUNC
395 */
396 HWTEST_F(TraceManagerTest, TraceManagerTest008, TestSize.Level1)
397 {
398 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
399 ASSERT_TRUE(ret1.IsSuccess());
400
401 // trans to common state
402 TraceRetInfo info;
403 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
404 ASSERT_TRUE(ret2.IsSuccess());
405 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
406 ASSERT_TRUE(ret3.IsSuccess());
407 TraceRet ret4 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
408 ASSERT_EQ(ret4.stateError_, TraceStateCode::FAIL);
409 TraceRet ret41 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
410 ASSERT_EQ(ret41.stateError_, TraceStateCode::FAIL);
411 TraceRet ret5 = TraceStateMachine::GetInstance().TraceCacheOn();
412 ASSERT_TRUE(ret5.IsSuccess());
413 TraceRet ret6 = TraceStateMachine::GetInstance().TraceCacheOff();
414 ASSERT_TRUE(ret6.IsSuccess());
415 TraceRet ret61 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
416 ASSERT_EQ(ret61.stateError_, TraceStateCode::FAIL);
417 TraceRet ret71 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
418 ASSERT_EQ(ret71.stateError_, TraceStateCode::FAIL);
419 TraceRet ret7 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
420 ASSERT_EQ(ret7.stateError_, TraceStateCode::FAIL);
421 TraceRet ret8 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
422 ASSERT_TRUE(ret8.IsSuccess());
423
424 // trans to common drop state
425 TraceRet ret9 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
426 ASSERT_EQ(ret9.stateError_, TraceStateCode::FAIL);
427 TraceRet ret10 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
428 ASSERT_EQ(ret10.stateError_, TraceStateCode::FAIL);
429 TraceRet ret11 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
430 ASSERT_EQ(ret11.stateError_, TraceStateCode::FAIL);
431 TraceRet ret42 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
432 ASSERT_EQ(ret42.stateError_, TraceStateCode::FAIL);
433 TraceRet ret12 = TraceStateMachine::GetInstance().TraceCacheOn();
434 ASSERT_EQ(ret12.stateError_, TraceStateCode::FAIL);
435 TraceRet ret13 = TraceStateMachine::GetInstance().TraceCacheOff();
436 ASSERT_EQ(ret13.stateError_, TraceStateCode::FAIL);
437 TraceRet ret14 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
438 ASSERT_EQ(ret14.stateError_, TraceStateCode::FAIL);
439 TraceRet ret15 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
440 ASSERT_EQ(ret15.stateError_, TraceStateCode::FAIL);
441 TraceRet ret23 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
442 ASSERT_EQ(ret23.stateError_, TraceStateCode::DENY);
443 TraceRet ret24 = TraceStateMachine::GetInstance().OpenDynamicTrace(100);
444 ASSERT_EQ(ret24.stateError_, TraceStateCode::DENY);
445 TraceRet ret25 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
446 ASSERT_TRUE(ret25.IsSuccess());
447
448 // trans to command state
449 TraceStateMachine::GetInstance().SetTraceSwitchUcOn();
450 TraceRet ret21 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
451 ASSERT_TRUE(ret21.IsSuccess());
452 TraceRet ret22 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
453 ASSERT_TRUE(ret22.IsSuccess());
454
455 // trans to common state
456 TraceRet ret34 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
457 ASSERT_TRUE(ret34.IsSuccess());
458
459 // trans to common drop state
460 TraceRet ret26 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
461 ASSERT_EQ(ret26.stateError_, TraceStateCode::FAIL);
462 TraceRet ret51 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
463 ASSERT_EQ(ret51.stateError_, TraceStateCode::FAIL);
464 TraceRet ret27 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
465 ASSERT_EQ(ret27.stateError_, TraceStateCode::FAIL);
466 TraceRet ret28 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
467 ASSERT_EQ(ret28.stateError_, TraceStateCode::FAIL);
468 TraceRet ret16 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
469 ASSERT_EQ(ret16.stateError_, TraceStateCode::FAIL);
470 TraceRet ret17 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
471 ASSERT_TRUE(ret17.IsSuccess());
472
473 // trans to common state
474 TraceRet ret18 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
475 ASSERT_EQ(ret18.stateError_, TraceStateCode::DENY);
476 TraceRet ret19 = TraceStateMachine::GetInstance().OpenDynamicTrace(100);
477 ASSERT_EQ(ret19.stateError_, TraceStateCode::DENY);
478 TraceRet ret20 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
479 ASSERT_TRUE(ret20.IsSuccess());
480
481 // trans to command state
482 TraceRet ret32 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
483 ASSERT_TRUE(ret32.IsSuccess());
484 TraceRet ret33 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
485 ASSERT_TRUE(ret33.IsSuccess());
486
487 // trans to common state again
488 TraceRet ret30 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
489 ASSERT_EQ(ret30.stateError_, TraceStateCode::FAIL);
490 TraceRet ret29 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
491 ASSERT_TRUE(ret29.IsSuccess());
492
493 // still recover to common state
494 TraceRet ret31 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
495 ASSERT_TRUE(ret31.IsSuccess());
496
497 // close version beta and trans to close state
498 TraceStateMachine::GetInstance().SetTraceSwitchFreezeOn();
499
500 // trans to common state
501 TraceRet ret35 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
502 ASSERT_TRUE(ret35.IsSuccess());
503
504 // still recover to common state
505 TraceRet ret36 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
506 ASSERT_TRUE(ret36.IsSuccess());
507 TraceStateMachine::GetInstance().SetTraceSwitchFreezeOff();
508 TraceStateMachine::GetInstance().SetTraceSwitchUcOff();
509 }
510
TestFunction()511 void TestFunction()
512 {}
513
514 /**
515 * @tc.name: TraceManagerTest009
516 * @tc.desc: used to test TraceStateMachine telemetry state
517 * @tc.type: FUNC
518 */
519 HWTEST_F(TraceManagerTest, TraceManagerTest009, TestSize.Level1)
520 {
521 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
522 ASSERT_TRUE(ret1.IsSuccess());
523
524 // Trans to telemetry state
525 ASSERT_FALSE(TraceStateMachine::GetInstance().RegisterTelemetryCallback(nullptr));
526 TraceRetInfo info;
527 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
528 ASSERT_EQ(ret2.stateError_, TraceStateCode::FAIL);
529 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
530 ASSERT_EQ(ret3.stateError_, TraceStateCode::FAIL);
531 TraceRet ret4 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
532 ASSERT_EQ(ret4.stateError_, TraceStateCode::FAIL);
533 TraceRet ret11 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
534 ASSERT_TRUE(ret11.IsSuccess());
535 TraceRet ret5 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
536 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
537 TraceRet ret6 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
538 ASSERT_EQ(ret6.stateError_, TraceStateCode::FAIL);
539 TraceRet ret7 = TraceStateMachine::GetInstance().TraceCacheOn();
540 ASSERT_EQ(ret7.stateError_, TraceStateCode::FAIL);
541 TraceRet ret8 = TraceStateMachine::GetInstance().TraceCacheOff();
542 ASSERT_EQ(ret8.stateError_, TraceStateCode::FAIL);
543 TraceRet ret9 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
544 ASSERT_EQ(ret9.stateError_, TraceStateCode::FAIL);
545 TraceRet ret10 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
546 ASSERT_EQ(ret10.stateError_, TraceStateCode::FAIL);
547 TraceRet ret26 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
548 ASSERT_EQ(ret26.stateError_, TraceStateCode::FAIL);
549 TraceRet ret27 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
550 ASSERT_EQ(ret27.stateError_, TraceStateCode::FAIL);
551 TraceRet ret28 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
552 ASSERT_EQ(ret28.stateError_, TraceStateCode::FAIL);
553 TraceRet ret51 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
554 ASSERT_TRUE(ret51.IsSuccess());
555
556 // Trans to close state
557 ASSERT_FALSE(TraceStateMachine::GetInstance().RegisterTelemetryCallback(nullptr));
558 TraceRet ret15 = TraceStateMachine::GetInstance().OpenDynamicTrace(101);
559 ASSERT_TRUE(ret15.IsSuccess());
560
561 // APP state to telemetry state success
562 TraceRet ret16 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
563 ASSERT_TRUE(ret16.IsSuccess());
564
565 // Trans to telemetry state
566 TraceRet ret17 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
567 ASSERT_TRUE(ret17.IsSuccess());
568
569 // Common state to telemetry deny
570 TraceRet ret18 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
571 ASSERT_EQ(ret18.GetStateError(), TraceStateCode::DENY);
572 TraceRet ret19 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
573 ASSERT_TRUE(ret19.IsSuccess());
574
575 // Trans to close state
576 TraceRet ret20 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
577 ASSERT_TRUE(ret20.IsSuccess());
578
579 // Command state to telemetry deny
580 TraceRet ret21 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
581 ASSERT_EQ(ret21.GetStateError(), TraceStateCode::DENY);
582
583 TraceRet ret22 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
584 ASSERT_TRUE(ret22.IsSuccess());
585 }
586
587 /**
588 * @tc.name: TraceManagerTest010
589 * @tc.desc: used to test TraceStateMachine app state
590 * @tc.type: FUNC
591 */
592 HWTEST_F(TraceManagerTest, TraceManagerTest010, TestSize.Level1)
593 {
594 TraceRet ret1 = TraceStateMachine::GetInstance().OpenDynamicTrace(100);
595 ASSERT_TRUE(ret1.IsSuccess());
596
597 // Trans to app state
598 ASSERT_EQ(TraceStateMachine::GetInstance().GetCurrentAppPid(), 100);
599 ASSERT_GT(TraceStateMachine::GetInstance().GetTaskBeginTime(), 0);
600 TraceRetInfo info;
601 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
602 ASSERT_EQ(ret2.stateError_, TraceStateCode::FAIL);
603 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
604 ASSERT_EQ(ret3.stateError_, TraceStateCode::FAIL);
605 TraceRet ret4 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
606 ASSERT_EQ(ret4.GetStateError(), TraceStateCode::SUCCESS);
607 TraceRet ret42 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
608 ASSERT_EQ(ret42.stateError_, TraceStateCode::FAIL);
609 TraceRet ret5 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
610 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
611 TraceRet ret6 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
612 ASSERT_EQ(ret6.stateError_, TraceStateCode::FAIL);
613 TraceRet ret7 = TraceStateMachine::GetInstance().TraceCacheOn();
614 ASSERT_EQ(ret7.stateError_, TraceStateCode::FAIL);
615 TraceRet ret8 = TraceStateMachine::GetInstance().TraceCacheOff();
616 ASSERT_EQ(ret8.stateError_, TraceStateCode::FAIL);
617 TraceRet ret9 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
618 ASSERT_EQ(ret9.stateError_, TraceStateCode::FAIL);
619 TraceRet ret10 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
620 ASSERT_EQ(ret10.stateError_, TraceStateCode::FAIL);
621 TraceRet ret11 = TraceStateMachine::GetInstance().OpenDynamicTrace(101);
622 ASSERT_EQ(ret11.stateError_, TraceStateCode::DENY);
623 TraceRet ret12 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, TAG_GROUPS);
624 ASSERT_TRUE(ret12.IsSuccess());
625
626 // Trans to command state
627 TraceRet ret13 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
628 ASSERT_TRUE(ret13.IsSuccess());
629 TraceRet ret14 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
630 ASSERT_TRUE(ret14.IsSuccess());
631
632 // Trans to close state
633 TraceRet ret15 = TraceStateMachine::GetInstance().OpenDynamicTrace(101);
634 ASSERT_TRUE(ret15.IsSuccess());
635
636 // Trans to app state again
637 ASSERT_EQ(TraceStateMachine::GetInstance().GetCurrentAppPid(), 101);
638 TraceRet ret16 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, TAG_GROUPS);
639 ASSERT_TRUE(ret16.IsSuccess());
640
641 // Trans to common state
642 TraceRet ret17 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
643 ASSERT_TRUE(ret17.IsSuccess());
644 TraceRet ret18 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
645 ASSERT_TRUE(ret18.IsSuccess());
646 }
647
648 /**
649 * @tc.name: TraceManagerTest011
650 * @tc.desc: used to test TraceStateMachine close state
651 * @tc.type: FUNC
652 */
653 HWTEST_F(TraceManagerTest, TraceManagerTest011, TestSize.Level1)
654 {
655 TraceRetInfo info;
656 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMAND, 0, 0, info);
657 ASSERT_EQ(ret2.stateError_, TraceStateCode::FAIL);
658 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_COMMON, 0, 0, info);
659 ASSERT_EQ(ret3.stateError_, TraceStateCode::FAIL);
660 TraceRet ret4 = TraceStateMachine::GetInstance().DumpTrace(TraceScenario::TRACE_DYNAMIC, 0, 0, info);
661 ASSERT_EQ(ret4.stateError_, TraceStateCode::FAIL);
662 TraceRet ret42 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
663 ASSERT_EQ(ret42.stateError_, TraceStateCode::FAIL);
664 TraceRet ret5 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
665 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
666 TraceRet ret6 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
667 ASSERT_EQ(ret6.stateError_, TraceStateCode::FAIL);
668 TraceRet ret7 = TraceStateMachine::GetInstance().TraceCacheOn();
669 ASSERT_EQ(ret7.stateError_, TraceStateCode::FAIL);
670 TraceRet ret8 = TraceStateMachine::GetInstance().TraceCacheOff();
671 ASSERT_EQ(ret8.stateError_, TraceStateCode::FAIL);
672 TraceRet ret9 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMAND, info);
673 ASSERT_EQ(ret9.stateError_, TraceStateCode::FAIL);
674 TraceRet ret10 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
675 ASSERT_EQ(ret10.stateError_, TraceStateCode::FAIL);
676 ASSERT_TRUE(TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND).IsSuccess());
677 ASSERT_TRUE(TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON).IsSuccess());
678 ASSERT_TRUE(TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC).IsSuccess());
679 }
680
681 /**
682 * @tc.name: TraceManagerTest011
683 * @tc.desc: used to test TraceStateMachine close state
684 * @tc.type: FUNC
685 */
686 HWTEST_F(TraceManagerTest, TraceManagerTest012, TestSize.Level1)
687 {
688 // TraceStateMachine init close state
689 TraceStateMachine::GetInstance().SetTraceSwitchDevOn();
690 auto ret = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, DEVELOPER_MODE_TRACE_ARGS);
691 ASSERT_TRUE(ret.IsSuccess());
692
693 // TranToCommandState
694 auto ret1 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, DEVELOPER_MODE_TRACE_ARGS);
695 ASSERT_EQ(ret1.stateError_, TraceStateCode::DENY);
696 auto ret2 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMAND);
697 ASSERT_TRUE(ret2.IsSuccess());
698
699 // TranToCommandDropState
700 auto ret6 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMAND, DEVELOPER_MODE_TRACE_ARGS);
701 ASSERT_EQ(ret6.stateError_, TraceStateCode::DENY);
702
703 auto ret3 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, DEVELOPER_MODE_TRACE_ARGS);
704 ASSERT_EQ(ret3.stateError_, TraceStateCode::DENY);
705 auto ret4 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMAND);
706 ASSERT_TRUE(ret4.IsSuccess());
707
708 // TransToCLoseState
709 TraceStateMachine::GetInstance().SetTraceSwitchDevOff();
710 auto ret5 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, DEVELOPER_MODE_TRACE_ARGS);
711 ASSERT_TRUE(ret5.IsSuccess());
712 auto ret7 = TraceStateMachine::GetInstance().TraceDropOn(TraceScenario::TRACE_COMMON);
713 ASSERT_TRUE(ret7.IsSuccess());
714
715 // TransToCommonDropStats
716 auto ret8 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, DEVELOPER_MODE_TRACE_ARGS);
717 ASSERT_EQ(ret8.stateError_, TraceStateCode::DENY);
718 TraceRetInfo info;
719 auto ret9 = TraceStateMachine::GetInstance().TraceDropOff(TraceScenario::TRACE_COMMON, info);
720 ASSERT_TRUE(ret9.IsSuccess());
721 auto ret10 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
722 ASSERT_TRUE(ret10.IsSuccess());
723
724 // TransToDynamicState
725 auto ret11 = TraceStateMachine::GetInstance().OpenDynamicTrace(101);
726 ASSERT_TRUE(ret11.IsSuccess());
727 auto ret12 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_DYNAMIC);
728 ASSERT_TRUE(ret12.IsSuccess());
729 auto ret15 = TraceStateMachine::GetInstance().OpenDynamicTrace(102);
730 ASSERT_TRUE(ret15.IsSuccess());
731 auto ret16 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, DEVELOPER_MODE_TRACE_ARGS);
732 ASSERT_TRUE(ret16.IsSuccess());
733 auto ret17 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
734 ASSERT_TRUE(ret17.IsSuccess());
735
736 auto ret13 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
737 ASSERT_TRUE(ret13.IsSuccess());
738 auto ret14 = TraceStateMachine::GetInstance().OpenTrace(TraceScenario::TRACE_COMMON, DEVELOPER_MODE_TRACE_ARGS);
739 ASSERT_TRUE(ret14.IsSuccess());
740 auto ret18 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_COMMON);
741 ASSERT_TRUE(ret18.IsSuccess());
742 }
743
744 /**
745 * @tc.name: TraceManagerTest013
746 * @tc.desc: used to test power trace on/off
747 * @tc.type: FUNC
748 */
749 HWTEST_F(TraceManagerTest, TraceManagerTest013, TestSize.Level1)
750 {
751 TraceRetInfo info;
752 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::POWER);
753 ASSERT_TRUE(ret1.IsSuccess());
754 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
755 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
756 TraceRet ret2 = TraceStateMachine::GetInstance().PowerTelemetryOn();
757 ASSERT_TRUE(ret2.IsSuccess());
758 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
759 ASSERT_TRUE(ret3.IsSuccess());
760 TraceRet ret4 =TraceStateMachine::GetInstance().PowerTelemetryOff();
761 ASSERT_TRUE(ret4.IsSuccess());
762 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
763 ASSERT_TRUE(ret5.IsSuccess());
764 }
765
766 /**
767 * @tc.name: TraceManagerTest014
768 * @tc.desc: used to test power trace on/off
769 * @tc.type: FUNC
770 */
771 HWTEST_F(TraceManagerTest, TraceManagerTest014, TestSize.Level1)
772 {
773 TraceRetInfo info;
774 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::DEFAULT);
775 ASSERT_TRUE(ret1.IsSuccess());
776 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
777 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
778 TraceRet ret2 = TraceStateMachine::GetInstance().PowerTelemetryOn();
779 ASSERT_EQ(ret2.stateError_, TraceStateCode::POLICY_ERROR);
780 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
781 ASSERT_TRUE(ret5.IsSuccess());
782 }
783
784 /**
785 * @tc.name: TraceManagerTest015
786 * @tc.desc: used to test power trace on/off
787 * @tc.type: FUNC
788 */
789 HWTEST_F(TraceManagerTest, TraceManagerTest015, TestSize.Level1)
790 {
791 TraceRetInfo info;
792 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::POWER);
793 ASSERT_TRUE(ret1.IsSuccess());
794 TraceRet ret2 = TraceStateMachine::GetInstance().PowerTelemetryOn();
795 ASSERT_EQ(ret2.stateError_, TraceStateCode::POLICY_ERROR);
796 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
797 ASSERT_TRUE(ret5.IsSuccess());
798 }
799
800 /**
801 * @tc.name: TraceManagerTest016
802 * @tc.desc: used to test power trace on/off
803 * @tc.type: FUNC
804 */
805 HWTEST_F(TraceManagerTest, TraceManagerTest016, TestSize.Level1)
806 {
807 TraceRetInfo info;
808 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::POWER);
809 ASSERT_TRUE(ret1.IsSuccess());
810 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
811 TraceRet ret2 = TraceStateMachine::GetInstance().PowerTelemetryOn();
812 ASSERT_TRUE(ret2.IsSuccess());
813 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
814 ASSERT_TRUE(ret5.IsSuccess());
815 }
816
817 /**
818 * @tc.name: TraceManagerTest017
819 * @tc.desc: used to test power trace on/off
820 * @tc.type: FUNC
821 */
822 HWTEST_F(TraceManagerTest, TraceManagerTest017, TestSize.Level1)
823 {
824 TraceRetInfo info;
825 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
826 ASSERT_TRUE(ret1.IsSuccess());
827 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
828 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
829 TraceRet ret2 = TraceStateMachine::GetInstance().PowerTelemetryOn();
830 ASSERT_EQ(ret2.stateError_, TraceStateCode::POLICY_ERROR);
831 TraceRet ret3 = TraceStateMachine::GetInstance().PowerTelemetryOff();
832 ASSERT_EQ(ret3.stateError_, TraceStateCode::POLICY_ERROR);
833 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
834 ASSERT_TRUE(ret5.IsSuccess());
835 }
836
837 /**
838 * @tc.name: TraceManagerTest018
839 * @tc.desc: used to test power trace on/off
840 * @tc.type: FUNC
841 */
842 HWTEST_F(TraceManagerTest, TraceManagerTest018, TestSize.Level1)
843 {
844 TraceRetInfo info;
845 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::POWER);
846 ASSERT_TRUE(ret1.IsSuccess());
847 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
848 TraceStateMachine::GetInstance().InitTelemetryStatus(true);
849 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
850 ASSERT_TRUE(ret3.IsSuccess());
851 TraceRet ret4 =TraceStateMachine::GetInstance().PowerTelemetryOff();
852 ASSERT_TRUE(ret4.IsSuccess());
853 TraceRet ret5 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
854 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
855 auto ret6 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
856 ASSERT_TRUE(ret6.IsSuccess());
857 }
858
859 /**
860 * @tc.name: TraceManagerTest019
861 * @tc.desc: used to test power trace on/off
862 * @tc.type: FUNC
863 */
864 HWTEST_F(TraceManagerTest, TraceManagerTest019, TestSize.Level1)
865 {
866 TraceRetInfo info;
867 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
868 ASSERT_TRUE(ret1.IsSuccess());
869 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
870 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
871 TraceRet ret2 = TraceStateMachine::GetInstance().TraceTelemetryOn();
872 ASSERT_TRUE(ret2.IsSuccess());
873 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
874 ASSERT_TRUE(ret3.IsSuccess());
875 TraceRet ret4 =TraceStateMachine::GetInstance().TraceTelemetryOff();
876 ASSERT_TRUE(ret4.IsSuccess());
877 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
878 ASSERT_TRUE(ret5.IsSuccess());
879 }
880
881 /**
882 * @tc.name: TraceManagerTest020
883 * @tc.desc: used to test power trace on/off
884 * @tc.type: FUNC
885 */
886 HWTEST_F(TraceManagerTest, TraceManagerTest020, TestSize.Level1)
887 {
888 TraceRetInfo info;
889 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
890 ASSERT_TRUE(ret1.IsSuccess());
891 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
892 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
893 TraceRet ret2 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
894 ASSERT_EQ(ret2.stateError_, TraceStateCode::FAIL);
895 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
896 ASSERT_TRUE(ret5.IsSuccess());
897 }
898
899 /**
900 * @tc.name: TraceManagerTest021
901 * @tc.desc: used to test power trace on/off
902 * @tc.type: FUNC
903 */
904 HWTEST_F(TraceManagerTest, TraceManagerTest021, TestSize.Level1)
905 {
906 TraceRetInfo info;
907 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::POWER);
908 ASSERT_TRUE(ret1.IsSuccess());
909 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
910 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
911 TraceRet ret2 = TraceStateMachine::GetInstance().TraceTelemetryOn();
912 ASSERT_EQ(ret2.stateError_, TraceStateCode::POLICY_ERROR);
913 TraceRet ret3 = TraceStateMachine::GetInstance().TraceTelemetryOff();
914 ASSERT_EQ(ret3.stateError_, TraceStateCode::POLICY_ERROR);
915 auto ret5 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
916 ASSERT_TRUE(ret5.IsSuccess());
917 }
918
919 /**
920 * @tc.name: TraceManagerTest022
921 * @tc.desc: used to test manual trace on/off
922 * @tc.type: FUNC
923 */
924 HWTEST_F(TraceManagerTest, TraceManagerTest022, TestSize.Level1)
925 {
926 TraceRetInfo info;
927 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
928 ASSERT_TRUE(ret1.IsSuccess());
929 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
930 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
931 TraceRet ret2 = TraceStateMachine::GetInstance().TraceTelemetryOn();
932 ASSERT_TRUE(ret2.IsSuccess());
933 TraceRet ret21 = TraceStateMachine::GetInstance().TraceTelemetryOn();
934 ASSERT_TRUE(ret21.IsSuccess());
935 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
936 ASSERT_TRUE(ret3.IsSuccess());
937 TraceRet ret4 = TraceStateMachine::GetInstance().TraceTelemetryOff();
938 ASSERT_EQ(ret4.stateError_, TraceStateCode::NO_TRIGGER);
939 TraceRet ret5 = TraceStateMachine::GetInstance().TraceTelemetryOff();
940 ASSERT_TRUE(ret5.IsSuccess());
941 auto ret6 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
942 ASSERT_TRUE(ret6.IsSuccess());
943 }
944
945 /**
946 * @tc.name: TraceManagerTest023
947 * @tc.desc: used to test manual trace on/off
948 * @tc.type: FUNC
949 */
950 HWTEST_F(TraceManagerTest, TraceManagerTest023, TestSize.Level1)
951 {
952 TraceRetInfo info;
953 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
954 ASSERT_TRUE(ret1.IsSuccess());
955 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
956 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
957 TraceRet ret2 = TraceStateMachine::GetInstance().PostTelemetryOn(2);
958 ASSERT_TRUE(ret2.IsSuccess());
959 TraceRet ret3 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
960 ASSERT_TRUE(ret3.IsSuccess());
961 sleep(2);
962 TraceRet ret4 = TraceStateMachine::GetInstance().PostTelemetryTimeOut();
963 ASSERT_TRUE(ret4.IsSuccess());
964 TraceRet ret5 = TraceStateMachine::GetInstance().DumpTraceWithFilter(0, 0, info);
965 ASSERT_EQ(ret5.stateError_, TraceStateCode::FAIL);
966 auto ret6 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
967 ASSERT_TRUE(ret6.IsSuccess());
968 }
969
970 /**
971 * @tc.name: TraceManagerTest024
972 * @tc.desc: used to test manual trace on/off
973 * @tc.type: FUNC
974 */
975 HWTEST_F(TraceManagerTest, TraceManagerTest024, TestSize.Level1)
976 {
977 TraceRetInfo info;
978 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
979 ASSERT_TRUE(ret1.IsSuccess());
980 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
981 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
982 TraceRet ret2 = TraceStateMachine::GetInstance().PostTelemetryOn(5);
983 ASSERT_TRUE(ret2.IsSuccess());
984 sleep(1);
985 TraceRet ret3 = TraceStateMachine::GetInstance().PostTelemetryOn(10);
986 ASSERT_EQ(ret3.stateError_, TraceStateCode::UPDATE_TIME);
987 auto ret4 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
988 ASSERT_TRUE(ret4.IsSuccess());
989 }
990
991 /**
992 * @tc.name: TraceManagerTest025
993 * @tc.desc: used to test manual trace on/off
994 * @tc.type: FUNC
995 */
996 HWTEST_F(TraceManagerTest, TraceManagerTest025, TestSize.Level1)
997 {
998 TraceRetInfo info;
999 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
1000 ASSERT_TRUE(ret1.IsSuccess());
1001 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
1002 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
1003 TraceRet ret2 = TraceStateMachine::GetInstance().TraceTelemetryOn();
1004 TraceStateMachine::GetInstance().PostTelemetryOn(5);
1005 ASSERT_TRUE(ret2.IsSuccess());
1006 TraceRet ret3 = TraceStateMachine::GetInstance().TraceTelemetryOff();
1007 ASSERT_EQ(ret3.stateError_, TraceStateCode::NO_TRIGGER);
1008 auto ret4 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
1009 ASSERT_TRUE(ret4.IsSuccess());
1010 }
1011
1012 /**
1013 * @tc.name: TraceManagerTest026
1014 * @tc.desc: used to test manual trace on/off
1015 * @tc.type: FUNC
1016 */
1017 HWTEST_F(TraceManagerTest, TraceManagerTest026, TestSize.Level1)
1018 {
1019 TraceRetInfo info;
1020 TraceRet ret1 = TraceStateMachine::GetInstance().OpenTelemetryTrace("", TelemetryPolicy::MANUAL);
1021 ASSERT_TRUE(ret1.IsSuccess());
1022 TraceStateMachine::GetInstance().RegisterTelemetryCallback(std::make_shared<TestTelemetryCallback>());
1023 TraceStateMachine::GetInstance().InitTelemetryStatus(false);
1024 TraceRet ret2 = TraceStateMachine::GetInstance().TraceTelemetryOn();
1025 TraceStateMachine::GetInstance().PostTelemetryOn(5);
1026 ASSERT_TRUE(ret2.IsSuccess());
1027 TraceRet ret3 = TraceStateMachine::GetInstance().PostTelemetryTimeOut();
1028 ASSERT_EQ(ret3.stateError_, TraceStateCode::NO_TRIGGER);
1029 auto ret4 = TraceStateMachine::GetInstance().CloseTrace(TraceScenario::TRACE_TELEMETRY);
1030 ASSERT_TRUE(ret4.IsSuccess());
1031 }
1032
1033 /**
1034 * @tc.name: TraceManagerTest027
1035 * @tc.desc: used to test TraceDbStoreCallback
1036 * @tc.type: FUNC
1037 */
1038 HWTEST_F(TraceManagerTest, TraceManagerTest027, TestSize.Level1)
1039 {
1040 FileUtil::ForceRemoveDirectory(TEST_DB_PATH);
1041 FileUtil::ForceCreateDirectory(TEST_DB_PATH);
1042 std::string dbFile = std::string(TEST_DB_PATH) + "trace_flow_control.db";
1043 RdbStoreConfig config(dbFile);
1044 config.SetSecurityLevel(SecurityLevel::S1);
1045 auto ret = E_OK;
1046 TraceDbStoreCallback callback;
1047 auto dbStore = RdbHelper::GetRdbStore(config, 1, callback, ret);
1048 ASSERT_EQ(ret, E_OK);
1049 ret = callback.OnCreate(*dbStore);
1050 ASSERT_EQ(ret, E_OK);
1051 ret = callback.OnUpgrade(*dbStore, 1, 2); // test db upgrade from version 1 to version 2
1052 ASSERT_EQ(ret, E_OK);
1053 }
1054
1055 /**
1056 * @tc.name: TraceManagerTest028
1057 * @tc.desc: used to test TraceDbStoreCallback
1058 * @tc.type: FUNC
1059 */
1060 HWTEST_F(TraceManagerTest, TraceManagerTest028, TestSize.Level1)
1061 {
1062 auto flowController1 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1063 FlowController::DEFAULT_CONFIG_PATH);
1064 int64_t traceSize1 = 601 * 1024 * 1024; // xpower trace Threshold is 700M
1065 ASSERT_GT(flowController1->GetRemainingTraceSize(), 0);
1066 flowController1->StoreDb(traceSize1);
1067
1068 auto flowController2 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1069 FlowController::DEFAULT_CONFIG_PATH);
1070 ASSERT_FALSE(flowController2->IsOverLimit());
1071 ASSERT_GT(flowController2->GetRemainingTraceSize(), 0);
1072 flowController2->DecreaseDynamicThreshold(); // dynamic_threashold 650M
1073
1074 auto flowController3 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1075 FlowController::DEFAULT_CONFIG_PATH);
1076 ASSERT_FALSE(flowController3->IsOverLimit());
1077 ASSERT_GT(flowController2->GetRemainingTraceSize(), 0);
1078 flowController3->DecreaseDynamicThreshold(); // dynamic_threashold 600M
1079
1080 auto flowController4 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1081 FlowController::DEFAULT_CONFIG_PATH);
1082 ASSERT_TRUE(flowController4->IsOverLimit());
1083 }
1084
1085 /**
1086 * @tc.name: TraceManagerTest028
1087 * @tc.desc: used to test TraceDbStoreCallback
1088 * @tc.type: FUNC
1089 */
1090 HWTEST_F(TraceManagerTest, TraceManagerTest029, TestSize.Level1)
1091 {
1092 auto flowController1 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1093 FlowController::DEFAULT_CONFIG_PATH);
1094 int64_t traceSize1 = 600 * 1024 * 1024; // xpower trace Threshold is 700M
1095 ASSERT_GT(flowController1->GetRemainingTraceSize(), 0);
1096 flowController1->StoreDb(traceSize1);
1097
1098 auto flowController2 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1099 FlowController::DEFAULT_CONFIG_PATH);
1100 ASSERT_FALSE(flowController2->IsOverLimit());
1101 ASSERT_EQ(flowController2->GetRemainingTraceSize(), 170 * 1024 * 1024); // remaining size 170M
1102 flowController2->DecreaseDynamicThreshold(); // dynamic_threashold 650M
1103
1104 auto flowController3 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1105 FlowController::DEFAULT_CONFIG_PATH);
1106 ASSERT_EQ(flowController2->GetRemainingTraceSize(), 170 * 1024 * 1024); // remaining size still 170M
1107 }
1108
1109 /**
1110 * @tc.name: TraceManagerTest028
1111 * @tc.desc: used to test TraceDbStoreCallback
1112 * @tc.type: FUNC
1113 */
1114 HWTEST_F(TraceManagerTest, TraceManagerTest030, TestSize.Level1)
1115 {
1116 auto flowController1 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1117 FlowController::DEFAULT_CONFIG_PATH);
1118 flowController1->SetTestDate("2025-07-30");
1119 int64_t traceSize1 = 750 * 1024 * 1024; // xpower trace Threshold is 700M
1120 ASSERT_EQ(flowController1->GetRemainingTraceSize(), 770 * 1024 * 1024);
1121 flowController1->StoreDb(traceSize1); // greater than threshold but less than 10% deadline
1122 ASSERT_TRUE(flowController1->IsOverLimit());
1123
1124 auto flowController2 = std::make_shared<TraceFlowController>(CallerName::XPOWER, TEST_DB_PATH,
1125 FlowController::DEFAULT_CONFIG_PATH);
1126 flowController1->SetTestDate("2025-07-31");
1127 ASSERT_FALSE(flowController1->IsOverLimit());
1128 ASSERT_EQ(flowController1->GetRemainingTraceSize(), 770 * 1024 * 1024);
1129 }
1130