1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
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 <cstring>
17 #include <dlfcn.h>
18 #include <fcntl.h>
19 #include <gtest/gtest.h>
20 #include <cinttypes>
21 #include <cstdio>
22 #include <ctime>
23 #include <unistd.h>
24 
25 #include "hidump_plugin.h"
26 #include "plugin_module_api.h"
27 
28 using namespace testing::ext;
29 
30 namespace {
31 const std::string DEFAULT_RECORD_FILE("/data/local/tmp/");
32 const int DEFAULT_WAIT = 10;
33 
34 class HidumpPluginUnittest : public ::testing::Test {
35 public:
SetUpTestCase()36     static void SetUpTestCase() {};
TearDownTestCase()37     static void TearDownTestCase() {};
38 
SetUp()39     void SetUp() {}
TearDown()40     void TearDown() {}
41 };
42 
WriteFunc(WriterStruct* writer, const void* data, size_t size)43 long WriteFunc(WriterStruct* writer, const void* data, size_t size)
44 {
45     if (writer == nullptr || data == nullptr || size <= 0) {
46         return -1;
47     }
48 
49     return 0;
50 }
51 
FlushFunc(WriterStruct* writer)52 bool FlushFunc(WriterStruct* writer)
53 {
54     if (writer == nullptr) {
55         return false;
56     }
57     return true;
58 }
59 
PluginStart(HidumpPlugin& plugin, HidumpConfig& config)60 bool PluginStart(HidumpPlugin& plugin, HidumpConfig& config)
61 {
62     // serialize
63     int size = config.ByteSizeLong();
64     std::vector<uint8_t> configData(size);
65     int ret = config.SerializeToArray(configData.data(), configData.size());
66     CHECK_TRUE(ret > 0, false, "HidumpPluginUnittest: SerializeToArray fail!!!");
67     PROFILER_LOG_INFO(LOG_CORE, "HidumpPluginUnittest: SerializeToArray success");
68 
69     // start
70     ret = plugin.Start(configData.data(), configData.size());
71     CHECK_TRUE(ret == 0, false, "HidumpPluginUnittest: start plugin fail!!!");
72     PROFILER_LOG_INFO(LOG_CORE, "HidumpPluginUnittest: Start success");
73 
74     return true;
75 }
76 
77 /**
78  * @tc.name: hidump plugin
79  * @tc.desc: Test framework
80  * @tc.type: FUNC
81  */
HWTEST_F(HidumpPluginUnittest, TestFramework, TestSize.Level1)82 HWTEST_F(HidumpPluginUnittest, TestFramework, TestSize.Level1)
83 {
84     std::string path = std::string("libhidumpplugin.z.so");
85     void* handle = dlopen(path.c_str(), RTLD_LAZY);
86     EXPECT_NE(handle, nullptr);
87     PluginModuleStruct* plugin = reinterpret_cast<PluginModuleStruct*>(dlsym(handle, "g_pluginModule"));
88     EXPECT_NE(plugin, nullptr);
89     EXPECT_STREQ(plugin->name, "hidump-plugin");
90 
91     // set config
92     HidumpConfig config;
93     config.set_report_fps(true);
94     int size = config.ByteSizeLong();
95     ASSERT_GT(size, 0);
96     std::vector<uint8_t> configData(size);
97     ASSERT_GT(config.SerializeToArray(configData.data(), configData.size()), 0);
98 
99     // test framework process
100     WriterStruct writer = {WriteFunc, FlushFunc};
101     std::vector<uint8_t> dataBuffer(plugin->resultBufferSizeHint);
102     EXPECT_EQ(plugin->callbacks->onRegisterWriterStruct(&writer), 0);
103     EXPECT_EQ(plugin->callbacks->onPluginSessionStart(configData.data(), configData.size()), 0);
104     EXPECT_EQ(plugin->callbacks->onPluginSessionStop(), 0);
105 }
106 
107 /**
108  * @tc.name: hidump plugin
109  * @tc.desc: Test if invalid cmd causes an exception
110  *           expect:"inaccessible or not found"
111  * @tc.type: FUNC
112  */
HWTEST_F(HidumpPluginUnittest, TestInvalidCmd1, TestSize.Level1)113 HWTEST_F(HidumpPluginUnittest, TestInvalidCmd1, TestSize.Level1)
114 {
115     HidumpConfig config;
116     HidumpPlugin plugin;
117     WriterStruct writer = {WriteFunc, FlushFunc};
118 
119     config.set_report_fps(true);
120     plugin.SetConfig(config);
121 
122     const char *cmd = "";
123     plugin.SetTestCmd(cmd);
124     plugin.SetWriter(&writer);
125     EXPECT_STREQ(plugin.GetTestCmd(), cmd);
126     EXPECT_TRUE(PluginStart(plugin, config));
127     EXPECT_EQ(plugin.Stop(), 0);
128 }
129 
130 /**
131  * @tc.name: hidump plugin
132  * @tc.desc: Test if invalid cmd causes an exception
133  *           expect:"HidumpPlugin: fps command not output error!"
134  * @tc.type: FUNC
135  */
HWTEST_F(HidumpPluginUnittest, TestInvalidCmd2, TestSize.Level1)136 HWTEST_F(HidumpPluginUnittest, TestInvalidCmd2, TestSize.Level1)
137 {
138     HidumpConfig config;
139     HidumpPlugin plugin;
140     WriterStruct writer = {WriteFunc, FlushFunc};
141 
142     config.set_report_fps(true);
143     plugin.SetConfig(config);
144 
145     const char *cmd = "SP_daemon -profilerfps 0";
146     plugin.SetTestCmd(cmd);
147     plugin.SetWriter(&writer);
148     EXPECT_STREQ(plugin.GetTestCmd(), cmd);
149     EXPECT_TRUE(PluginStart(plugin, config));
150     EXPECT_EQ(plugin.Stop(), 0);
151 }
152 
153 /**
154  * @tc.name: hidump plugin
155  * @tc.desc: Test Default Cmd
156  * @tc.type: FUNC
157  */
HWTEST_F(HidumpPluginUnittest, TestDefaultCmd, TestSize.Level1)158 HWTEST_F(HidumpPluginUnittest, TestDefaultCmd, TestSize.Level1)
159 {
160     HidumpConfig config;
161     HidumpPlugin plugin;
162     WriterStruct writer = {WriteFunc, FlushFunc};
163 
164     config.set_report_fps(true);
165     plugin.SetConfig(config);
166 
167     plugin.SetWriter(&writer);
168     EXPECT_TRUE(PluginStart(plugin, config));
169     EXPECT_EQ(plugin.Stop(), 0);
170 }
171 
172 /**
173  * @tc.name: hidump plugin
174  * @tc.desc: Test Default Cmd and verify result
175  * @tc.type: FUNC
176  */
HWTEST_F(HidumpPluginUnittest, TestCmdAndVerifyResult, TestSize.Level1)177 HWTEST_F(HidumpPluginUnittest, TestCmdAndVerifyResult, TestSize.Level1)
178 {
179     HidumpConfig config;
180     HidumpPlugin plugin;
181     WriterStruct writer = {WriteFunc, FlushFunc};
182 
183     config.set_report_fps(true);
184     plugin.SetConfig(config);
185 
186     plugin.SetWriter(&writer);
187     EXPECT_TRUE(PluginStart(plugin, config));
188     sleep(DEFAULT_WAIT);
189     EXPECT_EQ(plugin.Stop(), 0);
190 }
191 
192 /**
193  * @tc.name: hidump plugin
194  * @tc.desc: start fail test
195  * @tc.type: FUNC
196  */
HWTEST_F(HidumpPluginUnittest, TestStartFail, TestSize.Level1)197 HWTEST_F(HidumpPluginUnittest, TestStartFail, TestSize.Level1)
198 {
199     HidumpConfig config;
200     HidumpPlugin plugin;
201     WriterStruct writer = {WriteFunc, FlushFunc};
202 
203     // set config
204     config.set_report_fps(true);
205 
206     // test plugin process
207     plugin.SetWriter(&writer);
208     plugin.SetConfig(config);
209 
210     // serialize
211     int size = config.ByteSizeLong();
212     ASSERT_GT(size, 0);
213     std::vector<uint8_t> configData(size);
214     ASSERT_GT(config.SerializeToArray(configData.data(), configData.size()), 0);
215 
216     // start
217     EXPECT_NE(plugin.Start(configData.data(), size - 1), 0);
218 }
219 } // namespace