• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
StartReportFunc(WriterStruct * writer)60 RandomWriteCtx* StartReportFunc(WriterStruct* writer)
61 {
62     return nullptr;
63 }
64 
FinishReportFunc(WriterStruct * writer,int32_t size)65 void FinishReportFunc(WriterStruct* writer, int32_t size)
66 {
67     return;
68 }
69 
PluginStart(HidumpPlugin & plugin,HidumpConfig & config)70 bool PluginStart(HidumpPlugin& plugin, HidumpConfig& config)
71 {
72     // serialize
73     int size = config.ByteSizeLong();
74     std::vector<uint8_t> configData(size);
75     int ret = config.SerializeToArray(configData.data(), configData.size());
76     CHECK_TRUE(ret > 0, false, "HidumpPluginUnittest: SerializeToArray fail!!!");
77     PROFILER_LOG_INFO(LOG_CORE, "HidumpPluginUnittest: SerializeToArray success");
78 
79     // start
80     ret = plugin.Start(configData.data(), configData.size());
81     CHECK_TRUE(ret == 0, false, "HidumpPluginUnittest: start plugin fail!!!");
82     PROFILER_LOG_INFO(LOG_CORE, "HidumpPluginUnittest: Start success");
83 
84     return true;
85 }
86 
87 /**
88  * @tc.name: hidump plugin
89  * @tc.desc: Test framework
90  * @tc.type: FUNC
91  */
92 HWTEST_F(HidumpPluginUnittest, TestFramework, TestSize.Level1)
93 {
94     std::string path = std::string("libhidumpplugin.z.so");
95     void* handle = dlopen(path.c_str(), RTLD_LAZY);
96     EXPECT_NE(handle, nullptr);
97     PluginModuleStruct* plugin = reinterpret_cast<PluginModuleStruct*>(dlsym(handle, "g_pluginModule"));
98     EXPECT_NE(plugin, nullptr);
99     EXPECT_STREQ(plugin->name, "hidump-plugin");
100 
101     // set config
102     HidumpConfig config;
103     config.set_report_fps(true);
104     int size = config.ByteSizeLong();
105     ASSERT_GT(size, 0);
106     std::vector<uint8_t> configData(size);
107     ASSERT_GT(config.SerializeToArray(configData.data(), configData.size()), 0);
108 
109     // test framework process
110     WriterStruct writer = {WriteFunc, FlushFunc};
111     std::vector<uint8_t> dataBuffer(plugin->resultBufferSizeHint);
112     EXPECT_EQ(plugin->callbacks->onRegisterWriterStruct(&writer), 0);
113     EXPECT_EQ(plugin->callbacks->onPluginSessionStart(configData.data(), configData.size()), 0);
114     EXPECT_EQ(plugin->callbacks->onPluginSessionStop(), 0);
115 }
116 
117 /**
118  * @tc.name: hidump plugin
119  * @tc.desc: Test if invalid cmd causes an exception
120  *           expect:"inaccessible or not found"
121  * @tc.type: FUNC
122  */
123 HWTEST_F(HidumpPluginUnittest, TestInvalidCmd1, TestSize.Level1)
124 {
125     HidumpConfig config;
126     HidumpPlugin plugin;
127     WriterStruct writer = {WriteFunc, FlushFunc};
128 
129     config.set_report_fps(true);
130     plugin.SetConfig(config);
131 
132     const char *cmd = "";
133     plugin.SetTestCmd(cmd);
134     plugin.SetWriter(&writer);
135     EXPECT_STREQ(plugin.GetTestCmd(), cmd);
136     EXPECT_TRUE(PluginStart(plugin, config));
137     EXPECT_EQ(plugin.Stop(), 0);
138 }
139 
140 /**
141  * @tc.name: hidump plugin
142  * @tc.desc: Test if invalid cmd causes an exception
143  *           expect:"HidumpPlugin: fps command not output error!"
144  * @tc.type: FUNC
145  */
146 HWTEST_F(HidumpPluginUnittest, TestInvalidCmd2, TestSize.Level1)
147 {
148     HidumpConfig config;
149     HidumpPlugin plugin;
150     WriterStruct writer = {WriteFunc, FlushFunc};
151 
152     config.set_report_fps(true);
153     plugin.SetConfig(config);
154 
155     const char *cmd = "SP_daemon -profilerfps 0";
156     plugin.SetTestCmd(cmd);
157     plugin.SetWriter(&writer);
158     EXPECT_STREQ(plugin.GetTestCmd(), cmd);
159     EXPECT_TRUE(PluginStart(plugin, config));
160     EXPECT_EQ(plugin.Stop(), 0);
161 }
162 
163 /**
164  * @tc.name: hidump plugin
165  * @tc.desc: Test Default Cmd
166  * @tc.type: FUNC
167  */
168 HWTEST_F(HidumpPluginUnittest, TestDefaultCmd, TestSize.Level1)
169 {
170     HidumpConfig config;
171     HidumpPlugin plugin;
172     WriterStruct writer = {WriteFunc, FlushFunc};
173 
174     config.set_report_fps(true);
175     plugin.SetConfig(config);
176 
177     plugin.SetWriter(&writer);
178     EXPECT_TRUE(PluginStart(plugin, config));
179     EXPECT_EQ(plugin.Stop(), 0);
180 }
181 
182 /**
183  * @tc.name: hidump plugin
184  * @tc.desc: Test Default Cmd and verify result
185  * @tc.type: FUNC
186  */
187 HWTEST_F(HidumpPluginUnittest, TestCmdAndVerifyResult, TestSize.Level1)
188 {
189     HidumpConfig config;
190     HidumpPlugin plugin;
191     WriterStruct writer = {WriteFunc, FlushFunc};
192 
193     config.set_report_fps(true);
194     plugin.SetConfig(config);
195 
196     plugin.SetWriter(&writer);
197     EXPECT_TRUE(PluginStart(plugin, config));
198     sleep(DEFAULT_WAIT);
199     EXPECT_EQ(plugin.Stop(), 0);
200 }
201 
202 /**
203  * @tc.name: hidump plugin
204  * @tc.desc: start fail test
205  * @tc.type: FUNC
206  */
207 HWTEST_F(HidumpPluginUnittest, TestStartFail, TestSize.Level1)
208 {
209     HidumpConfig config;
210     HidumpPlugin plugin;
211     WriterStruct writer = {WriteFunc, FlushFunc};
212 
213     // set config
214     config.set_report_fps(true);
215 
216     // test plugin process
217     plugin.SetWriter(&writer);
218     plugin.SetConfig(config);
219 
220     // serialize
221     int size = config.ByteSizeLong();
222     ASSERT_GT(size, 0);
223     std::vector<uint8_t> configData(size);
224     ASSERT_GT(config.SerializeToArray(configData.data(), configData.size()), 0);
225 
226     // start
227     EXPECT_NE(plugin.Start(configData.data(), size - 1), 0);
228 }
229 
230 /**
231  * @tc.name: hidump plugin
232  * @tc.desc: Test pb encoder data
233  * @tc.type: FUNC
234  */
235 HWTEST_F(HidumpPluginUnittest, TestPbEncoderData, TestSize.Level1)
236 {
237     HidumpConfig config;
238     HidumpPlugin plugin;
239     WriterStruct writer = {WriteFunc, FlushFunc, StartReportFunc, FinishReportFunc, false};
240     config.set_report_fps(true);
241     plugin.SetConfig(config);
242     plugin.SetWriter(&writer);
243     EXPECT_TRUE(PluginStart(plugin, config));
244     sleep(DEFAULT_WAIT);
245     plugin.running_ = false;
246     EXPECT_EQ(plugin.Stop(), 0);
247 }
248 
249 } // namespace