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/runtime_impl.h" 17e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 18e509ee18Sopenharmony_ci#include "tooling/protocol_handler.h" 19e509ee18Sopenharmony_ci 20e509ee18Sopenharmony_ciusing namespace panda::ecmascript; 21e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling; 22e509ee18Sopenharmony_ci 23e509ee18Sopenharmony_ci 24e509ee18Sopenharmony_cinamespace panda::test { 25e509ee18Sopenharmony_ciclass RuntimeImplTest : public testing::Test { 26e509ee18Sopenharmony_cipublic: 27e509ee18Sopenharmony_ci static void SetUpTestCase() 28e509ee18Sopenharmony_ci { 29e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 30e509ee18Sopenharmony_ci } 31e509ee18Sopenharmony_ci 32e509ee18Sopenharmony_ci static void TearDownTestCase() 33e509ee18Sopenharmony_ci { 34e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "TearDownCase"; 35e509ee18Sopenharmony_ci } 36e509ee18Sopenharmony_ci 37e509ee18Sopenharmony_ci void SetUp() override 38e509ee18Sopenharmony_ci { 39e509ee18Sopenharmony_ci TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope); 40e509ee18Sopenharmony_ci } 41e509ee18Sopenharmony_ci 42e509ee18Sopenharmony_ci void TearDown() override 43e509ee18Sopenharmony_ci { 44e509ee18Sopenharmony_ci TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope); 45e509ee18Sopenharmony_ci } 46e509ee18Sopenharmony_ci 47e509ee18Sopenharmony_ciprotected: 48e509ee18Sopenharmony_ci EcmaVM *ecmaVm {nullptr}; 49e509ee18Sopenharmony_ci EcmaHandleScope *scope {nullptr}; 50e509ee18Sopenharmony_ci JSThread *thread {nullptr}; 51e509ee18Sopenharmony_ci}; 52e509ee18Sopenharmony_ci 53e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplDispatch) 54e509ee18Sopenharmony_ci{ 55e509ee18Sopenharmony_ci std::string result = ""; 56e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 57e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 58e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 59e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 60e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 61e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.test","params":{}})"; 62e509ee18Sopenharmony_ci DispatchRequest request(msg); 63e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request); 64e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("unknown method: test") != std::string::npos); 65e509ee18Sopenharmony_ci 66e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"Rumtime.enable","params":{}})"; 67e509ee18Sopenharmony_ci DispatchRequest request1(msg); 68e509ee18Sopenharmony_ci dispatcherImpl->Dispatch(request1); 69e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("protocols") != std::string::npos); 70e509ee18Sopenharmony_ci if (channel != nullptr) { 71e509ee18Sopenharmony_ci delete channel; 72e509ee18Sopenharmony_ci channel = nullptr; 73e509ee18Sopenharmony_ci } 74e509ee18Sopenharmony_ci} 75e509ee18Sopenharmony_ci 76e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplEnable) 77e509ee18Sopenharmony_ci{ 78e509ee18Sopenharmony_ci std::string result = ""; 79e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 80e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 81e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 82e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 83e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 84e509ee18Sopenharmony_ci 85e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.enable","params":{}})"; 86e509ee18Sopenharmony_ci DispatchRequest request1(msg); 87e509ee18Sopenharmony_ci dispatcherImpl->Enable(request1); 88e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("protocols") != std::string::npos); 89e509ee18Sopenharmony_ci if (channel != nullptr) { 90e509ee18Sopenharmony_ci delete channel; 91e509ee18Sopenharmony_ci channel = nullptr; 92e509ee18Sopenharmony_ci } 93e509ee18Sopenharmony_ci} 94e509ee18Sopenharmony_ci 95e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplDisable) 96e509ee18Sopenharmony_ci{ 97e509ee18Sopenharmony_ci std::string result = ""; 98e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 99e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 100e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 101e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 102e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 103e509ee18Sopenharmony_ci 104e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.disable","params":{}})"; 105e509ee18Sopenharmony_ci DispatchRequest request1(msg); 106e509ee18Sopenharmony_ci dispatcherImpl->Disable(request1); 107e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 108e509ee18Sopenharmony_ci if (channel != nullptr) { 109e509ee18Sopenharmony_ci delete channel; 110e509ee18Sopenharmony_ci channel = nullptr; 111e509ee18Sopenharmony_ci } 112e509ee18Sopenharmony_ci} 113e509ee18Sopenharmony_ci 114e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplRunIfWaitingForDebugger) 115e509ee18Sopenharmony_ci{ 116e509ee18Sopenharmony_ci std::string result = ""; 117e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 118e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 119e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 120e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 121e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 122e509ee18Sopenharmony_ci 123e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.runIfWaitingForDebugger","params":{}})"; 124e509ee18Sopenharmony_ci DispatchRequest request1(msg); 125e509ee18Sopenharmony_ci dispatcherImpl->RunIfWaitingForDebugger(request1); 126e509ee18Sopenharmony_ci ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}"); 127e509ee18Sopenharmony_ci if (channel != nullptr) { 128e509ee18Sopenharmony_ci delete channel; 129e509ee18Sopenharmony_ci channel = nullptr; 130e509ee18Sopenharmony_ci } 131e509ee18Sopenharmony_ci} 132e509ee18Sopenharmony_ci 133e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplGetProperties) 134e509ee18Sopenharmony_ci{ 135e509ee18Sopenharmony_ci std::string result = ""; 136e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 137e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 138e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 139e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 140e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 141e509ee18Sopenharmony_ci 142e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.getProperties","params":{"objectId":0}})"; 143e509ee18Sopenharmony_ci DispatchRequest request(msg); 144e509ee18Sopenharmony_ci dispatcherImpl->GetProperties(request); 145e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("wrong params") != std::string::npos); 146e509ee18Sopenharmony_ci 147e509ee18Sopenharmony_ci msg = std::string() + R"({"id":0,"method":"Rumtime.getProperties","params":{"objectId":"0"}})"; 148e509ee18Sopenharmony_ci DispatchRequest request1(msg); 149e509ee18Sopenharmony_ci dispatcherImpl->GetProperties(request1); 150e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("Unknown object id") != std::string::npos); 151e509ee18Sopenharmony_ci if (channel != nullptr) { 152e509ee18Sopenharmony_ci delete channel; 153e509ee18Sopenharmony_ci channel = nullptr; 154e509ee18Sopenharmony_ci } 155e509ee18Sopenharmony_ci} 156e509ee18Sopenharmony_ci 157e509ee18Sopenharmony_ciHWTEST_F_L0(RuntimeImplTest, DispatcherImplGetHeapUsage) 158e509ee18Sopenharmony_ci{ 159e509ee18Sopenharmony_ci std::string result = ""; 160e509ee18Sopenharmony_ci std::function<void(const void*, const std::string &)> callback = 161e509ee18Sopenharmony_ci [&result]([[maybe_unused]] const void *ptr, const std::string &temp) {result = temp;}; 162e509ee18Sopenharmony_ci ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm); 163e509ee18Sopenharmony_ci auto runtimeImpl = std::make_unique<RuntimeImpl>(ecmaVm, channel); 164e509ee18Sopenharmony_ci auto dispatcherImpl = std::make_unique<RuntimeImpl::DispatcherImpl>(channel, std::move(runtimeImpl)); 165e509ee18Sopenharmony_ci 166e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Rumtime.getHeapUsage ","params":{}})"; 167e509ee18Sopenharmony_ci DispatchRequest request(msg); 168e509ee18Sopenharmony_ci dispatcherImpl->GetHeapUsage(request); 169e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("usedSize") != std::string::npos); 170e509ee18Sopenharmony_ci ASSERT_TRUE(result.find("totalSize") != std::string::npos); 171e509ee18Sopenharmony_ci if (channel != nullptr) { 172e509ee18Sopenharmony_ci delete channel; 173e509ee18Sopenharmony_ci channel = nullptr; 174e509ee18Sopenharmony_ci } 175e509ee18Sopenharmony_ci} 176e509ee18Sopenharmony_ci} // namespace panda::test 177