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 <gtest/gtest.h>
17 #include <thread>
18
19 #include "common.h"
20 #include "plugin_module.h"
21 #include "common_types.pb.h"
22
23 using namespace testing::ext;
24
25 namespace {
26 const std::string SUCCESS_PLUGIN_NAME = "libmemdataplugin.z.so";
27 constexpr size_t READ_BUFFER_SIZE = 4 * 1024 * 1024;
28 #if defined(__LP64__)
29 std::string g_testPluginDir("/system/lib64/");
30 #else
31 std::string g_testPluginDir("/system/lib/");
32 #endif
33
34 class PluginModuleTest : public ::testing::Test {
35 protected:
36 static constexpr auto TEMP_DELAY = std::chrono::milliseconds(20);
SetUpTestCase()37 static void SetUpTestCase()
38 {
39 #if defined(__i386__) || defined(__x86_64__)
40 char pluginDir[PATH_MAX + 1] = {0};
41 if (readlink("/proc/self/exe", pluginDir, PATH_MAX) > 0) {
42 char* pos = strrchr(pluginDir, '/');
43 if (pos != nullptr) {
44 *(pos++) = '\0';
45 g_testPluginDir = pluginDir;
46 }
47 }
48 #endif
49
50 std::this_thread::sleep_for(TEMP_DELAY);
51 }
52
TearDownTestCase()53 static void TearDownTestCase() {}
54 };
55
56 /**
57 * @tc.name: plugin
58 * @tc.desc: pluginmodule normal test.
59 * @tc.type: FUNC
60 */
HWTEST_F(PluginModuleTest, PluginModuleNormal, TestSize.Level1)61 HWTEST_F(PluginModuleTest, PluginModuleNormal, TestSize.Level1)
62 {
63 std::string pluginPath = g_testPluginDir + "/" + SUCCESS_PLUGIN_NAME;
64 PluginModuleInfo info;
65 auto plugin = std::make_shared<PluginModule>(pluginPath);
66 EXPECT_TRUE(plugin->Load());
67 EXPECT_TRUE(plugin->BindFunctions());
68 EXPECT_TRUE(plugin->GetInfo(info));
69 EXPECT_TRUE(plugin->IsLoaded());
70
71 uint32_t size = 0;
72 plugin->GetBufferSizeHint(size);
73 EXPECT_EQ(size, READ_BUFFER_SIZE);
74 std::string name;
75 EXPECT_TRUE(plugin->GetPluginName(name));
76 EXPECT_STREQ(name.c_str(), "memory-plugin");
77
78 const uint8_t configData[] = {74, 1, 10};
79 ProfilerPluginConfig config;
80 config.set_name(g_testPluginDir + "/" + SUCCESS_PLUGIN_NAME);
81 config.set_config_data((const void*)configData, 3);
82 config.set_sample_interval(1000);
83 plugin->SetConfigData(config.config_data());
84
85 std::string cfgData = plugin->GetConfigData();
86 EXPECT_EQ(cfgData.c_str()[0], 74);
87 EXPECT_EQ(cfgData.c_str()[1], 1);
88 EXPECT_EQ(cfgData.c_str()[2], 10);
89
90 std::unique_ptr<uint8_t[]> buffer = std::make_unique<uint8_t[]>(size);
91 EXPECT_NE(buffer, nullptr);
92 plugin->SetClockId(COMMON::GetClockId("realtime"));
93 (void)plugin->GetClockId();
94 EXPECT_FALSE(plugin->GetPath().empty());
95 EXPECT_TRUE(plugin->StartSession(reinterpret_cast<const uint8_t*>(cfgData.c_str()), cfgData.size()));
96 EXPECT_FALSE(plugin->GetStandaloneFileData());
97 EXPECT_TRUE(plugin->IsRunning());
98 EXPECT_NE(plugin->ReportResult(buffer.get(), size), 0);
99 EXPECT_TRUE(plugin->StopSession());
100
101 EXPECT_TRUE(plugin->StartSession(nullptr, 0));
102 EXPECT_EQ(plugin->ReportResult(buffer.get(), size), 0);
103 EXPECT_TRUE(plugin->StopSession());
104
105 EXPECT_TRUE(plugin->StartSession(reinterpret_cast<const uint8_t*>(cfgData.c_str()), cfgData.size()));
106 EXPECT_NE(plugin->ReportResult(nullptr, 0), 0);
107 EXPECT_NE(plugin->ReportResult(nullptr, 0), -1);
108 EXPECT_TRUE(plugin->StopSession());
109
110 EXPECT_TRUE(plugin->StartSession(nullptr, 0));
111 EXPECT_EQ(plugin->ReportResult(nullptr, 0), 0);
112 EXPECT_TRUE(plugin->StopSession());
113
114 EXPECT_TRUE(plugin->Unload());
115 EXPECT_FALSE(plugin->IsLoaded());
116 }
117
118 /**
119 * @tc.name: plugin
120 * @tc.desc: pluginmodule abnormal test.
121 * @tc.type: FUNC
122 */
HWTEST_F(PluginModuleTest, PluginModuleAbnormal, TestSize.Level1)123 HWTEST_F(PluginModuleTest, PluginModuleAbnormal, TestSize.Level1)
124 {
125 std::string pluginPath = "invalid.z.so";
126 PluginModuleInfo info;
127 auto plugin = std::make_shared<PluginModule>(pluginPath);
128 EXPECT_FALSE(plugin->Load());
129 EXPECT_FALSE(plugin->BindFunctions());
130 EXPECT_FALSE(plugin->GetInfo(info));
131 EXPECT_FALSE(plugin->IsLoaded());
132
133 uint32_t size = 0;
134 plugin->GetBufferSizeHint(size);
135 EXPECT_EQ(size, 0);
136
137 std::string name;
138 EXPECT_FALSE(plugin->GetPluginName(name));
139 EXPECT_STREQ(name.c_str(), "");
140
141 std::unique_ptr<uint8_t[]> buffer = std::make_unique<uint8_t[]>(size);
142 EXPECT_FALSE(plugin->StartSession(nullptr, 0));
143 EXPECT_FALSE(plugin->GetStandaloneFileData());
144 EXPECT_FALSE(plugin->IsRunning());
145 EXPECT_EQ(plugin->ReportResult(buffer.get(), size), -1);
146 EXPECT_FALSE(plugin->StopSession());
147 EXPECT_FALSE(plugin->Unload());
148 }
149
150 /**
151 * @tc.name: plugin
152 * @tc.desc: pluginmodule test.
153 * @tc.type: FUNC
154 */
HWTEST_F(PluginModuleTest, PluginModuleTest, TestSize.Level1)155 HWTEST_F(PluginModuleTest, PluginModuleTest, TestSize.Level1)
156 {
157 std::string pluginPath = g_testPluginDir + "/" + SUCCESS_PLUGIN_NAME;
158 PluginModuleInfo info;
159 auto plugin = std::make_shared<PluginModule>(pluginPath);
160
161 std::string outFileName;
162 EXPECT_FALSE(plugin->GetOutFileName(outFileName));
163 std::string pluginVersion;
164 EXPECT_FALSE(plugin->GetPluginVersion(pluginVersion));
165 EXPECT_EQ(plugin->GetWriter(), nullptr);
166
167 EXPECT_TRUE(plugin->Load());
168 EXPECT_TRUE(plugin->BindFunctions());
169 EXPECT_TRUE(plugin->GetInfo(info));
170 EXPECT_TRUE(plugin->IsLoaded());
171 EXPECT_TRUE(plugin->GetOutFileName(outFileName));
172 EXPECT_EQ(outFileName, "");
173 EXPECT_TRUE(plugin->GetPluginVersion(pluginVersion));
174 EXPECT_EQ(pluginVersion, "1.02");
175 BufferWriterPtr writer;
176 EXPECT_TRUE(plugin->RegisterWriter(writer));
177 }
178 } // namespace
179