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