1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#include "agent/heapprofiler_impl.h" 17e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 18e509ee18Sopenharmony_ci 19e509ee18Sopenharmony_ciusing namespace panda::ecmascript; 20e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling; 21e509ee18Sopenharmony_ci 22e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling { 23e509ee18Sopenharmony_ciclass HeapProfilerImplFriendTest { 24e509ee18Sopenharmony_cipublic: 25e509ee18Sopenharmony_ci explicit HeapProfilerImplFriendTest(std::unique_ptr<HeapProfilerImpl> &heapprofilerImpl) 26e509ee18Sopenharmony_ci { 27e509ee18Sopenharmony_ci heapprofilerImpl_ = std::move(heapprofilerImpl); 28e509ee18Sopenharmony_ci } 29e509ee18Sopenharmony_ci 30e509ee18Sopenharmony_ci void ResetProfiles() 31e509ee18Sopenharmony_ci { 32e509ee18Sopenharmony_ci heapprofilerImpl_->frontend_.ResetProfiles(); 33e509ee18Sopenharmony_ci } 34e509ee18Sopenharmony_ci 35e509ee18Sopenharmony_ci void LastSeenObjectId(int32_t lastSeenObjectId, int64_t timeStampUs) 36e509ee18Sopenharmony_ci { 37e509ee18Sopenharmony_ci heapprofilerImpl_->frontend_.LastSeenObjectId(lastSeenObjectId, timeStampUs); 38e509ee18Sopenharmony_ci } 39e509ee18Sopenharmony_ci 40e509ee18Sopenharmony_ci void HeapStatsUpdate(HeapStat* updateData, int32_t count) 41e509ee18Sopenharmony_ci { 42e509ee18Sopenharmony_ci heapprofilerImpl_->frontend_.HeapStatsUpdate(updateData, count); 43e509ee18Sopenharmony_ci } 44e509ee18Sopenharmony_ci 45e509ee18Sopenharmony_ci void AddHeapSnapshotChunk(char *data, int32_t size) 46e509ee18Sopenharmony_ci { 47e509ee18Sopenharmony_ci heapprofilerImpl_->frontend_.AddHeapSnapshotChunk(data, size); 48e509ee18Sopenharmony_ci } 49e509ee18Sopenharmony_ci 50e509ee18Sopenharmony_ci void ReportHeapSnapshotProgress(int32_t done, int32_t total) 51e509ee18Sopenharmony_ci { 52e509ee18Sopenharmony_ci heapprofilerImpl_->frontend_.ReportHeapSnapshotProgress(done, total); 53e509ee18Sopenharmony_ci } 54e509ee18Sopenharmony_ciprivate: 55e509ee18Sopenharmony_ci std::unique_ptr<HeapProfilerImpl> heapprofilerImpl_; 56e509ee18Sopenharmony_ci}; 57e509ee18Sopenharmony_ci} 58e509ee18Sopenharmony_ci 59e509ee18Sopenharmony_cinamespace panda::test { 60e509ee18Sopenharmony_ciclass HeapProfilerImplTest : public testing::Test { 61e509ee18Sopenharmony_cipublic: 62e509ee18Sopenharmony_ci static void SetUpTestCase() 63e509ee18Sopenharmony_ci { 64e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 65e509ee18Sopenharmony_ci } 66e509ee18Sopenharmony_ci 67e509ee18Sopenharmony_ci static void TearDownTestCase() 68e509ee18Sopenharmony_ci { 69e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "TearDownCase"; 70e509ee18Sopenharmony_ci } 71e509ee18Sopenharmony_ci 72e509ee18Sopenharmony_ci void SetUp() override 73e509ee18Sopenharmony_ci { 74e509ee18Sopenharmony_ci TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope); 75e509ee18Sopenharmony_ci } 76e509ee18Sopenharmony_ci 77e509ee18Sopenharmony_ci void TearDown() override 78e509ee18Sopenharmony_ci { 79e509ee18Sopenharmony_ci TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope); 80e509ee18Sopenharmony_ci } 81e509ee18Sopenharmony_ci 82e509ee18Sopenharmony_ciprotected: 83e509ee18Sopenharmony_ci EcmaVM *ecmaVm {nullptr}; 84e509ee18Sopenharmony_ci EcmaHandleScope *scope {nullptr}; 85e509ee18Sopenharmony_ci JSThread *thread {nullptr}; 86e509ee18Sopenharmony_ci}; 87e509ee18Sopenharmony_ci 88e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, AddInspectedHeapObject) 89e509ee18Sopenharmony_ci{ 90e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 91e509ee18Sopenharmony_ci AddInspectedHeapObjectParams param; 92e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 93e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->AddInspectedHeapObject(param); 94e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == "AddInspectedHeapObject not support now"); 95e509ee18Sopenharmony_ci ASSERT_TRUE(!response.IsOk()); 96e509ee18Sopenharmony_ci} 97e509ee18Sopenharmony_ci 98e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, CollectGarbage) 99e509ee18Sopenharmony_ci{ 100e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 101e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 102e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->CollectGarbage(); 103e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == ""); 104e509ee18Sopenharmony_ci ASSERT_TRUE(response.IsOk()); 105e509ee18Sopenharmony_ci} 106e509ee18Sopenharmony_ci 107e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, Enable) 108e509ee18Sopenharmony_ci{ 109e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 110e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 111e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->Enable(); 112e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == ""); 113e509ee18Sopenharmony_ci ASSERT_TRUE(response.IsOk()); 114e509ee18Sopenharmony_ci} 115e509ee18Sopenharmony_ci 116e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, Disable) 117e509ee18Sopenharmony_ci{ 118e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 119e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 120e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->Disable(); 121e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == ""); 122e509ee18Sopenharmony_ci ASSERT_TRUE(response.IsOk()); 123e509ee18Sopenharmony_ci} 124e509ee18Sopenharmony_ci 125e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, GetHeapObjectId) 126e509ee18Sopenharmony_ci{ 127e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 128e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 129e509ee18Sopenharmony_ci GetHeapObjectIdParams params; 130e509ee18Sopenharmony_ci HeapSnapshotObjectId objectId; 131e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->GetHeapObjectId(params, &objectId); 132e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == "GetHeapObjectId not support now"); 133e509ee18Sopenharmony_ci ASSERT_TRUE(!response.IsOk()); 134e509ee18Sopenharmony_ci} 135e509ee18Sopenharmony_ci 136e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, GetObjectByHeapObjectId) 137e509ee18Sopenharmony_ci{ 138e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 139e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 140e509ee18Sopenharmony_ci std::unique_ptr<GetObjectByHeapObjectIdParams> params; 141e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> remoteObjectResult; 142e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->GetObjectByHeapObjectId(*params, &remoteObjectResult); 143e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == "GetObjectByHeapObjectId not support now"); 144e509ee18Sopenharmony_ci ASSERT_TRUE(!response.IsOk()); 145e509ee18Sopenharmony_ci} 146e509ee18Sopenharmony_ci 147e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, GetSamplingProfile) 148e509ee18Sopenharmony_ci{ 149e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 150e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 151e509ee18Sopenharmony_ci std::unique_ptr<SamplingHeapProfile> profile; 152e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->GetSamplingProfile(&profile); 153e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == "GetSamplingProfile fail"); 154e509ee18Sopenharmony_ci ASSERT_TRUE(!response.IsOk()); 155e509ee18Sopenharmony_ci} 156e509ee18Sopenharmony_ci 157e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StartSampling) 158e509ee18Sopenharmony_ci{ 159e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 160e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 161e509ee18Sopenharmony_ci StartSamplingParams params; 162e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->StartSampling(params); 163e509ee18Sopenharmony_ci ASSERT_TRUE(response.IsOk()); 164e509ee18Sopenharmony_ci} 165e509ee18Sopenharmony_ci 166e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StopSampling) 167e509ee18Sopenharmony_ci{ 168e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 169e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 170e509ee18Sopenharmony_ci std::unique_ptr<SamplingHeapProfile> profile; 171e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->StopSampling(&profile); 172e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == "StopSampling fail"); 173e509ee18Sopenharmony_ci ASSERT_TRUE(!response.IsOk()); 174e509ee18Sopenharmony_ci} 175e509ee18Sopenharmony_ci 176e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, TakeHeapSnapshot) 177e509ee18Sopenharmony_ci{ 178e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 179e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 180e509ee18Sopenharmony_ci StopTrackingHeapObjectsParams params; 181e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->TakeHeapSnapshot(params); 182e509ee18Sopenharmony_ci ASSERT_TRUE(response.GetMessage() == ""); 183e509ee18Sopenharmony_ci ASSERT_TRUE(response.IsOk()); 184e509ee18Sopenharmony_ci} 185e509ee18Sopenharmony_ci 186e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplDispatch) 187e509ee18Sopenharmony_ci{ 188e509ee18Sopenharmony_ci std::string result = ""; 189e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 190e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 191e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 192e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 193e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 194e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Debugger.Test","params":{}})"; 195e509ee18Sopenharmony_ci DispatchRequest request(msg); 196e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 197e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("Unknown method: Test") != std::string::npos); 198e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"Debugger.disable","params":{}})"; 199e509ee18Sopenharmony_ci DispatchRequest request1 = DispatchRequest(msg); 200e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request1); 201e509ee18Sopenharmony_ci if (channel) { 202e509ee18Sopenharmony_ci delete channel; 203e509ee18Sopenharmony_ci channel = nullptr; 204e509ee18Sopenharmony_ci } 205e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 206e509ee18Sopenharmony_ci} 207e509ee18Sopenharmony_ci 208e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplAddInspectedHeapObject) 209e509ee18Sopenharmony_ci{ 210e509ee18Sopenharmony_ci std::string result = ""; 211e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 212e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 213e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 214e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 215e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 216e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.addInspectedHeapObject","params":{}})"; 217e509ee18Sopenharmony_ci DispatchRequest request(msg); 218e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 219e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 220e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"HeapProfiler.addInspectedHeapObject","params":{"heapObjectId":"0"}})"; 221e509ee18Sopenharmony_ci DispatchRequest request1 = DispatchRequest(msg); 222e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request1); 223e509ee18Sopenharmony_ci if (channel) { 224e509ee18Sopenharmony_ci delete channel; 225e509ee18Sopenharmony_ci channel = nullptr; 226e509ee18Sopenharmony_ci } 227e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("AddInspectedHeapObject not support now") != std::string::npos); 228e509ee18Sopenharmony_ci} 229e509ee18Sopenharmony_ci 230e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplCollectGarbage) 231e509ee18Sopenharmony_ci{ 232e509ee18Sopenharmony_ci std::string result = ""; 233e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 234e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 235e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 236e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 237e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 238e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.collectGarbage","params":{}})"; 239e509ee18Sopenharmony_ci DispatchRequest request(msg); 240e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 241e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 242e509ee18Sopenharmony_ci if (channel) { 243e509ee18Sopenharmony_ci delete channel; 244e509ee18Sopenharmony_ci channel = nullptr; 245e509ee18Sopenharmony_ci } 246e509ee18Sopenharmony_ci} 247e509ee18Sopenharmony_ci 248e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplEnable) 249e509ee18Sopenharmony_ci{ 250e509ee18Sopenharmony_ci std::string result = ""; 251e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 252e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 253e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 254e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 255e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 256e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.enable","params":{}})"; 257e509ee18Sopenharmony_ci DispatchRequest request(msg); 258e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 259e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("protocols") != std::string::npos); 260e509ee18Sopenharmony_ci if (channel) { 261e509ee18Sopenharmony_ci delete channel; 262e509ee18Sopenharmony_ci channel = nullptr; 263e509ee18Sopenharmony_ci } 264e509ee18Sopenharmony_ci} 265e509ee18Sopenharmony_ci 266e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplDisable) 267e509ee18Sopenharmony_ci{ 268e509ee18Sopenharmony_ci std::string result = ""; 269e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 270e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 271e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 272e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 273e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 274e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.disable","params":{}})"; 275e509ee18Sopenharmony_ci DispatchRequest request(msg); 276e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 277e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 278e509ee18Sopenharmony_ci if (channel) { 279e509ee18Sopenharmony_ci delete channel; 280e509ee18Sopenharmony_ci channel = nullptr; 281e509ee18Sopenharmony_ci } 282e509ee18Sopenharmony_ci} 283e509ee18Sopenharmony_ci 284e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplGetHeapObjectId) 285e509ee18Sopenharmony_ci{ 286e509ee18Sopenharmony_ci std::string result = ""; 287e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 288e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 289e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 290e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 291e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 292e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.getHeapObjectId","params":{"objectId":true}})"; 293e509ee18Sopenharmony_ci DispatchRequest request(msg); 294e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 295e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 296e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"HeapProfiler.getHeapObjectId","params":{"objectId":"0"}})"; 297e509ee18Sopenharmony_ci DispatchRequest request1(msg); 298e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request1); 299e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("GetHeapObjectId not support now") != std::string::npos); 300e509ee18Sopenharmony_ci if (channel) { 301e509ee18Sopenharmony_ci delete channel; 302e509ee18Sopenharmony_ci channel = nullptr; 303e509ee18Sopenharmony_ci } 304e509ee18Sopenharmony_ci} 305e509ee18Sopenharmony_ci 306e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplGetObjectByHeapObjectId) 307e509ee18Sopenharmony_ci{ 308e509ee18Sopenharmony_ci std::string result = ""; 309e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 310e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 311e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 312e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 313e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 314e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.getObjectByHeapObjectId","params":{ 315e509ee18Sopenharmony_ci "objectId":001}})"; 316e509ee18Sopenharmony_ci DispatchRequest request(msg); 317e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 318e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 319e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"HeapProfiler.getObjectByHeapObjectId","params":{"objectId":"001", 320e509ee18Sopenharmony_ci "objectGroup":"000"}})"; 321e509ee18Sopenharmony_ci DispatchRequest request1(msg); 322e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request1); 323e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("GetObjectByHeapObjectId not support now") != std::string::npos); 324e509ee18Sopenharmony_ci if (channel) { 325e509ee18Sopenharmony_ci delete channel; 326e509ee18Sopenharmony_ci channel = nullptr; 327e509ee18Sopenharmony_ci } 328e509ee18Sopenharmony_ci} 329e509ee18Sopenharmony_ci 330e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplGetSamplingProfile) 331e509ee18Sopenharmony_ci{ 332e509ee18Sopenharmony_ci std::string result = ""; 333e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 334e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 335e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 336e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 337e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 338e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.getSamplingProfile","params":{}})"; 339e509ee18Sopenharmony_ci DispatchRequest request(msg); 340e509ee18Sopenharmony_ci dispatcherImpl->GetSamplingProfile(request); 341e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("GetSamplingProfile fail") != std::string::npos); 342e509ee18Sopenharmony_ci if (channel) { 343e509ee18Sopenharmony_ci delete channel; 344e509ee18Sopenharmony_ci channel = nullptr; 345e509ee18Sopenharmony_ci } 346e509ee18Sopenharmony_ci} 347e509ee18Sopenharmony_ci 348e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplStartSampling) 349e509ee18Sopenharmony_ci{ 350e509ee18Sopenharmony_ci std::string result = ""; 351e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 352e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 353e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 354e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 355e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 356e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.startSampling","params":{ 357e509ee18Sopenharmony_ci "samplingInterval":"Test"}})"; 358e509ee18Sopenharmony_ci DispatchRequest request(msg); 359e509ee18Sopenharmony_ci dispatcherImpl->StartSampling(request); 360e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 361e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"HeapProfiler.startSampling","params":{"samplingInterval":1000}})"; 362e509ee18Sopenharmony_ci DispatchRequest request1(msg); 363e509ee18Sopenharmony_ci dispatcherImpl->StartSampling(request1); 364e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 365e509ee18Sopenharmony_ci if (channel) { 366e509ee18Sopenharmony_ci delete channel; 367e509ee18Sopenharmony_ci channel = nullptr; 368e509ee18Sopenharmony_ci } 369e509ee18Sopenharmony_ci} 370e509ee18Sopenharmony_ci 371e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplStopSampling) 372e509ee18Sopenharmony_ci{ 373e509ee18Sopenharmony_ci std::string result = ""; 374e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 375e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 376e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 377e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 378e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 379e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.stopSampling","params":{}})"; 380e509ee18Sopenharmony_ci DispatchRequest request(msg); 381e509ee18Sopenharmony_ci dispatcherImpl->StopSampling(request); 382e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("StopSampling fail") != std::string::npos); 383e509ee18Sopenharmony_ci if (channel) { 384e509ee18Sopenharmony_ci delete channel; 385e509ee18Sopenharmony_ci channel = nullptr; 386e509ee18Sopenharmony_ci } 387e509ee18Sopenharmony_ci} 388e509ee18Sopenharmony_ci 389e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, DispatcherImplTakeHeapSnapshot) 390e509ee18Sopenharmony_ci{ 391e509ee18Sopenharmony_ci std::string result = ""; 392e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 393e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 394e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 395e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 396e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 397e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"HeapProfiler.takeHeapSnapshot","params":{ 398e509ee18Sopenharmony_ci "reportProgress":10, 399e509ee18Sopenharmony_ci "treatGlobalObjectsAsRoots":10, 400e509ee18Sopenharmony_ci "captureNumericValue":10}})"; 401e509ee18Sopenharmony_ci DispatchRequest request(msg); 402e509ee18Sopenharmony_ci dispatcherImpl->TakeHeapSnapshot(request); 403e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 404e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"HeapProfiler.takeHeapSnapshot","params":{ 405e509ee18Sopenharmony_ci "reportProgress":true, 406e509ee18Sopenharmony_ci "treatGlobalObjectsAsRoots":true, 407e509ee18Sopenharmony_ci "captureNumericValue":true}})"; 408e509ee18Sopenharmony_ci DispatchRequest request1(msg); 409e509ee18Sopenharmony_ci dispatcherImpl->TakeHeapSnapshot(request1); 410e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 411e509ee18Sopenharmony_ci if (channel) { 412e509ee18Sopenharmony_ci delete channel; 413e509ee18Sopenharmony_ci channel = nullptr; 414e509ee18Sopenharmony_ci } 415e509ee18Sopenharmony_ci} 416e509ee18Sopenharmony_ci 417e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, GetSamplingProfileSuccessful) 418e509ee18Sopenharmony_ci{ 419e509ee18Sopenharmony_ci StartSamplingParams params; 420e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 421e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 422e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->StartSampling(params); 423e509ee18Sopenharmony_ci std::unique_ptr<SamplingHeapProfile> samplingHeapProfile = std::make_unique<SamplingHeapProfile>(); 424e509ee18Sopenharmony_ci DispatchResponse result = heapProfiler->GetSamplingProfile(&samplingHeapProfile); 425e509ee18Sopenharmony_ci ASSERT_TRUE(result.IsOk()); 426e509ee18Sopenharmony_ci} 427e509ee18Sopenharmony_ci 428e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StartSamplingFail) 429e509ee18Sopenharmony_ci{ 430e509ee18Sopenharmony_ci StartSamplingParams params; 431e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 432e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 433e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->StartSampling(params); 434e509ee18Sopenharmony_ci DispatchResponse result = heapProfiler->StartSampling(params); 435e509ee18Sopenharmony_ci ASSERT_TRUE(!result.IsOk()); 436e509ee18Sopenharmony_ci} 437e509ee18Sopenharmony_ci 438e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StopSamplingSuccessful) 439e509ee18Sopenharmony_ci{ 440e509ee18Sopenharmony_ci StartSamplingParams params; 441e509ee18Sopenharmony_ci ProtocolChannel *channel = nullptr; 442e509ee18Sopenharmony_ci std::unique_ptr<SamplingHeapProfile> samplingHeapProfile = std::make_unique<SamplingHeapProfile>(); 443e509ee18Sopenharmony_ci auto heapProfiler = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 444e509ee18Sopenharmony_ci DispatchResponse response = heapProfiler->StartSampling(params); 445e509ee18Sopenharmony_ci DispatchResponse result = heapProfiler->StopSampling(&samplingHeapProfile); 446e509ee18Sopenharmony_ci ASSERT_TRUE(result.IsOk()); 447e509ee18Sopenharmony_ci} 448e509ee18Sopenharmony_ci 449e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StartTrackingHeapObjects) 450e509ee18Sopenharmony_ci{ 451e509ee18Sopenharmony_ci std::string result = ""; 452e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 453e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 454e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 455e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 456e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 457e509ee18Sopenharmony_ci std::string msg = ""; 458e509ee18Sopenharmony_ci msg += R"({"id":0,"method":"HeapProfiler.StartTrackingHeapObjects","params":{"trackAllocations":0}})"; 459e509ee18Sopenharmony_ci DispatchRequest request1(msg); 460e509ee18Sopenharmony_ci dispatcherImpl->StartTrackingHeapObjects(request1); 461e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{\"code\":1,\"message\":\"wrong params\"}}"); 462e509ee18Sopenharmony_ci if (channel) { 463e509ee18Sopenharmony_ci delete channel; 464e509ee18Sopenharmony_ci channel = nullptr; 465e509ee18Sopenharmony_ci } 466e509ee18Sopenharmony_ci} 467e509ee18Sopenharmony_ci 468e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, StopTrackingHeapObjects) 469e509ee18Sopenharmony_ci{ 470e509ee18Sopenharmony_ci std::string result = ""; 471e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 472e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 473e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 474e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 475e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<HeapProfilerImpl::DispatcherImpl>(channel, std::move(tracing)); 476e509ee18Sopenharmony_ci std::string msg = ""; 477e509ee18Sopenharmony_ci msg += R"({"id":0,"method":"HeapProfiler.StopTrackingHeapObjects","params":{"reportProgress":0}})"; 478e509ee18Sopenharmony_ci DispatchRequest request1(msg); 479e509ee18Sopenharmony_ci dispatcherImpl->StopTrackingHeapObjects(request1); 480e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{\"code\":1,\"message\":\"wrong params\"}}"); 481e509ee18Sopenharmony_ci if (channel) { 482e509ee18Sopenharmony_ci delete channel; 483e509ee18Sopenharmony_ci channel = nullptr; 484e509ee18Sopenharmony_ci } 485e509ee18Sopenharmony_ci} 486e509ee18Sopenharmony_ci 487e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, ResetProfiles) 488e509ee18Sopenharmony_ci{ 489e509ee18Sopenharmony_ci std::string result = ""; 490e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 491e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 492e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 493e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, nullptr); 494e509ee18Sopenharmony_ci auto heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 495e509ee18Sopenharmony_ci heapprofiler->ResetProfiles(); 496e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 497e509ee18Sopenharmony_ci tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 498e509ee18Sopenharmony_ci heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 499e509ee18Sopenharmony_ci heapprofiler->ResetProfiles(); 500e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 501e509ee18Sopenharmony_ci if (channel) { 502e509ee18Sopenharmony_ci delete channel; 503e509ee18Sopenharmony_ci channel = nullptr; 504e509ee18Sopenharmony_ci } 505e509ee18Sopenharmony_ci} 506e509ee18Sopenharmony_ci 507e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, LastSeenObjectId) 508e509ee18Sopenharmony_ci{ 509e509ee18Sopenharmony_ci std::string result = ""; 510e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 511e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 512e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 513e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, nullptr); 514e509ee18Sopenharmony_ci auto heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 515e509ee18Sopenharmony_ci heapprofiler->LastSeenObjectId(0, 0); 516e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 517e509ee18Sopenharmony_ci tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 518e509ee18Sopenharmony_ci heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 519e509ee18Sopenharmony_ci heapprofiler->LastSeenObjectId(0, 0); 520e509ee18Sopenharmony_ci std::string msg = "{\"method\":\"HeapProfiler.lastSeenObjectId\","; 521e509ee18Sopenharmony_ci msg += "\"params\":{\"lastSeenObjectId\":0,"; 522e509ee18Sopenharmony_ci msg += "\"timestamp\":0}}"; 523e509ee18Sopenharmony_ci ASSERT_TRUE(result == msg); 524e509ee18Sopenharmony_ci if (channel) { 525e509ee18Sopenharmony_ci delete channel; 526e509ee18Sopenharmony_ci channel = nullptr; 527e509ee18Sopenharmony_ci } 528e509ee18Sopenharmony_ci} 529e509ee18Sopenharmony_ci 530e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, HeapStatsUpdate) 531e509ee18Sopenharmony_ci{ 532e509ee18Sopenharmony_ci std::string result = ""; 533e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 534e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 535e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 536e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, nullptr); 537e509ee18Sopenharmony_ci auto heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 538e509ee18Sopenharmony_ci heapprofiler->HeapStatsUpdate(nullptr, 0); 539e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 540e509ee18Sopenharmony_ci tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, channel); 541e509ee18Sopenharmony_ci heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 542e509ee18Sopenharmony_ci heapprofiler->HeapStatsUpdate(nullptr, 0); 543e509ee18Sopenharmony_ci std::string msg = "{\"method\":\"HeapProfiler.heapStatsUpdate\","; 544e509ee18Sopenharmony_ci msg += "\"params\":{\"statsUpdate\":[]}}"; 545e509ee18Sopenharmony_ci ASSERT_TRUE(result == msg); 546e509ee18Sopenharmony_ci if (channel) { 547e509ee18Sopenharmony_ci delete channel; 548e509ee18Sopenharmony_ci channel = nullptr; 549e509ee18Sopenharmony_ci } 550e509ee18Sopenharmony_ci} 551e509ee18Sopenharmony_ci 552e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, AddHeapSnapshotChunk) 553e509ee18Sopenharmony_ci{ 554e509ee18Sopenharmony_ci std::string result = ""; 555e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 556e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 557e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, nullptr); 558e509ee18Sopenharmony_ci auto heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 559e509ee18Sopenharmony_ci heapprofiler->AddHeapSnapshotChunk(nullptr, 0); 560e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 561e509ee18Sopenharmony_ci} 562e509ee18Sopenharmony_ci 563e509ee18Sopenharmony_ciHWTEST_F_L0(HeapProfilerImplTest, ReportHeapSnapshotProgress) 564e509ee18Sopenharmony_ci{ 565e509ee18Sopenharmony_ci std::string result = ""; 566e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 567e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 568e509ee18Sopenharmony_ci auto tracing = std::make_unique<HeapProfilerImpl>(ecmaVm, nullptr); 569e509ee18Sopenharmony_ci auto heapprofiler = std::make_unique<HeapProfilerImplFriendTest>(tracing); 570e509ee18Sopenharmony_ci heapprofiler->ReportHeapSnapshotProgress(0, 0); 571e509ee18Sopenharmony_ci ASSERT_TRUE(result == ""); 572e509ee18Sopenharmony_ci} 573e509ee18Sopenharmony_ci} // namespace panda::test 574