1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
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 <fcntl.h>
17 #include <gtest/gtest.h>
18 #include <memory>
19 #include <sys/ioctl.h>
20 #include "log/log.h"
21 #include "securec.h"
22 #include "updater/updater_const.h"
23 #include "updater/updater.h"
24 #include "sdcard_update/sdcard_update.h"
25 #include "fs_manager/mount.h"
26 #include "misc_info/misc_info.h"
27 #include "updater_main.h"
28 #include "updater_ui_stub.h"
29 #include "utils.h"
30 
31 using namespace Updater;
32 using namespace std;
33 using namespace testing::ext;
34 
35 namespace {
36 constexpr uint32_t MAX_ARG_SIZE = 24;
37 class UpdaterUtilUnitTest : public testing::Test {
38 public:
UpdaterUtilUnitTest()39     UpdaterUtilUnitTest()
40     {
41         InitUpdaterLogger("UPDATER", TMP_LOG, TMP_STAGE_LOG, TMP_ERROR_CODE_PATH);
42     }
~UpdaterUtilUnitTest()43     ~UpdaterUtilUnitTest() {}
44 
SetUpTestCase(void)45     static void SetUpTestCase(void) {}
TearDownTestCase(void)46     static void TearDownTestCase(void) {}
SetUp()47     void SetUp() {}
TearDown()48     void TearDown() {}
TestBody()49     void TestBody() {}
50 };
51 
52 HWTEST_F(UpdaterUtilUnitTest, DeleteUpdaterPath, TestSize.Level1)
53 {
54     std::string path = "/data/test/test/test";
55     bool ret = DeleteUpdaterPath(path);
56     EXPECT_EQ(ret, true);
57 
58     path = "/data/test";
59     ret = DeleteUpdaterPath(path);
60     EXPECT_EQ(ret, true);
61 }
62 
63 HWTEST_F(UpdaterUtilUnitTest, ClearMisc, TestSize.Level1)
64 {
65     bool ret = ClearMisc();
66     EXPECT_EQ(ret, true);
67 }
68 
69 HWTEST_F(UpdaterUtilUnitTest, IsSDCardExist, TestSize.Level1)
70 {
71     std::string sdcardStr = "";
72     bool ret = IsSDCardExist(sdcardStr);
73     EXPECT_EQ(ret, false);
74 }
75 
76 HWTEST_F(UpdaterUtilUnitTest, IsFlashd, TestSize.Level1)
77 {
78     EXPECT_EQ(IsFlashd({"boot_updater", "", "boot_flash"}), true);
79     EXPECT_EQ(IsFlashd({"boot_updater", "", ""}), false);
80 }
81 
82 HWTEST_F(UpdaterUtilUnitTest, IsUpdater, TestSize.Level1)
83 {
84     EXPECT_EQ(IsUpdater({"boot_updater", "", ""}), true);
85     EXPECT_EQ(IsUpdater({"boot_updater", "", "boot_flash"}), false);
86     EXPECT_EQ(IsUpdater({"boot_updater", "", "xxx"}), true);
87 }
88 
89 HWTEST_F(UpdaterUtilUnitTest, SelectMode, TestSize.Level1)
90 {
91     // clear already registered mode
92     GetBootModes().clear();
93 
__anon05c379330202(int argc, char **argv) 94     auto dummyEntry = [] (int argc, char **argv) -> int { return 0; };
95     // register modes
96     RegisterMode({ IsFlashd, "FLASHD", "", dummyEntry });
97     RegisterMode({ IsUpdater, "UPDATER", "", dummyEntry });
98 
99     // test select mode
100     auto mode = SelectMode({"boot_updater", "", ""});
101     ASSERT_NE(mode, std::nullopt);
102     EXPECT_EQ(mode->modeName, "UPDATER");
103 
104     mode = SelectMode({"boot_updater", "", "boot_flash"});
105     ASSERT_NE(mode, std::nullopt);
106     EXPECT_EQ(mode->modeName, "FLASHD");
107 
108     mode = SelectMode({"invalid_command", "", ""});
109     EXPECT_EQ(mode, std::nullopt);
110 }
111 
112 HWTEST_F(UpdaterUtilUnitTest, ParseParams, TestSize.Level1)
113 {
114     UpdateMessage boot {};
115     std::string commandMsg = "";
116     std::string updateMsg = "";
117     const std::string commandFile = "/data/updater/command";
118     auto fp = std::unique_ptr<FILE, decltype(&fclose)>(fopen(commandFile.c_str(), "wb"), fclose);
119     EXPECT_NE(fp, nullptr);
120     EXPECT_EQ(strncpy_s(boot.command, sizeof(boot.command) - 1, commandMsg.c_str(), commandMsg.size()), 0);
121     EXPECT_EQ(strncpy_s(boot.update, sizeof(boot.update) - 1, updateMsg.c_str(), updateMsg.size()), 0);
122     bool bRet = WriteUpdaterMessage(commandFile, boot);
123     EXPECT_EQ(bRet, true);
124     char **argv = new char*[1];
125     argv[0] = new char[MAX_ARG_SIZE];
126     std::string str = "./UpdaterMain";
127     EXPECT_EQ(strncpy_s(argv[0], MAX_ARG_SIZE, str.c_str(), str.size()), 0);
128     int argc = 1;
129     std::vector<std::string> args = Utils::ParseParams(argc, argv);
130     std::string res = "";
131     for (auto s : args) {
132         res += s;
133     }
134     EXPECT_EQ("./UpdaterMain", res);
135 
136     commandMsg = "boot_updater";
137     updateMsg = "--update_package=updater_full.zip";
138     EXPECT_EQ(strncpy_s(boot.command, sizeof(boot.command) - 1, commandMsg.c_str(), commandMsg.size()), 0);
139     EXPECT_EQ(strncpy_s(boot.update, sizeof(boot.update) - 1, updateMsg.c_str(), updateMsg.size()), 0);
140     bRet = WriteUpdaterMessage(commandFile, boot);
141     EXPECT_EQ(bRet, true);
142 
143     args = Utils::ParseParams(argc, argv);
144     res = "";
145     for (auto s : args) {
146         res += s;
147     }
148     EXPECT_EQ("./UpdaterMain--update_package=updater_full.zip", res);
149 }
150 
151 HWTEST_F(UpdaterUtilUnitTest, UpdaterMain, TestSize.Level1)
152 {
153     UpdateMessage boot {};
154     if (access("/data/updater/", 0)) {
155         int ret = mkdir("/data/updater/", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
156         ASSERT_EQ(ret, 0);
157     }
158     const std::string commandFile = "/data/updater/command";
159     auto fp = std::unique_ptr<FILE, decltype(&fclose)>(fopen(commandFile.c_str(), "wb"), fclose);
160     EXPECT_NE(fp, nullptr);
161     const std::string commandMsg = "boot_updater";
162     const std::string updateMsg = "--update_package=/data/updater/updater/updater_full.zip";
163     EXPECT_EQ(strncpy_s(boot.command, sizeof(boot.command) - 1, commandMsg.c_str(), commandMsg.size()), 0);
164     EXPECT_EQ(strncpy_s(boot.update, sizeof(boot.update) - 1, updateMsg.c_str(), updateMsg.size()), 0);
165     bool bRet = WriteUpdaterMessage(commandFile, boot);
166     EXPECT_EQ(bRet, true);
167     char **argv = new char*[1];
168     argv[0] = new char[MAX_ARG_SIZE];
169     EXPECT_EQ(strncpy_s(argv[0], MAX_ARG_SIZE, "./UpdaterMain", MAX_ARG_SIZE), 0);
170     int argc = 1;
171 
172     int ret = UpdaterMain(argc, argv);
173     EXPECT_EQ(ret, 0);
174     PostUpdater(true);
175     delete argv[0];
176     delete []argv;
177 }
178 
179 HWTEST_F(UpdaterUtilUnitTest, UpdaterFromSdcardTest, TestSize.Level1)
180 {
181     UpdateMessage boot {};
182     if (access("/data/updater/", 0)) {
183         int ret = mkdir("/data/updater/", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
184         ASSERT_EQ(ret, 0);
185     }
186     const std::string commandFile = "/data/updater/command";
187     auto fp = std::unique_ptr<FILE, decltype(&fclose)>(fopen(commandFile.c_str(), "wb"), fclose);
188     EXPECT_NE(fp, nullptr);
189     const std::string commandMsg = "boot_updater";
190     const std::string updateMsg = "--sdcard_update";
191     EXPECT_EQ(strncpy_s(boot.command, sizeof(boot.command) - 1, commandMsg.c_str(), commandMsg.size()), 0);
192     EXPECT_EQ(strncpy_s(boot.update, sizeof(boot.update) - 1, updateMsg.c_str(), updateMsg.size()), 0);
193     bool bRet = WriteUpdaterMessage(commandFile, boot);
194     EXPECT_EQ(bRet, true);
195     char **argv = new char*[1];
196     argv[0] = new char[MAX_ARG_SIZE];
197     EXPECT_EQ(strncpy_s(argv[0], MAX_ARG_SIZE, "./UpdaterMain", MAX_ARG_SIZE), 0);
198     int argc = 1;
199     EXPECT_EQ(UpdaterMain(argc, argv), 0);
200     delete argv[0];
201     delete []argv;
202 }
203 
204 HWTEST_F(UpdaterUtilUnitTest, DoInstallUpdaterPackageTest, TestSize.Level1)
205 {
206     UpdaterParams upParams;
207     upParams.callbackProgress = nullptr;
208     std::vector<std::string> output;
209     EXPECT_EQ(DoInstallUpdaterPackage(nullptr, upParams, HOTA_UPDATE), UPDATE_CORRUPT);
__anon05c379330302(float value) 210     upParams.callbackProgress = [] (float value) {};
211     EXPECT_EQ(DoInstallUpdaterPackage(nullptr, upParams, HOTA_UPDATE), UPDATE_CORRUPT);
212     upParams.retryCount = 0;
213     EXPECT_EQ(DoInstallUpdaterPackage(nullptr, upParams, HOTA_UPDATE), UPDATE_CORRUPT);
214     upParams.retryCount = 1;
215     EXPECT_EQ(DoInstallUpdaterPackage(nullptr, upParams, HOTA_UPDATE), UPDATE_CORRUPT);
216 }
217 
218 HWTEST_F(UpdaterUtilUnitTest, updater_ExtractUpdaterBinary, TestSize.Level1)
219 {
220     Hpackage::PkgManager::PkgManagerPtr pkgManager = Hpackage::PkgManager::CreatePackageInstance();
221     std::string path = "xxx";
222     int32_t ret = ExtractUpdaterBinary(pkgManager, path, UPDATER_BINARY);
223     EXPECT_EQ(ret, 1);
224     path = "/data/updater/updater/updater_full.zip";
225     ret = ExtractUpdaterBinary(pkgManager, path, UPDATER_BINARY);
226     Hpackage::PkgManager::ReleasePackageInstance(pkgManager);
227     EXPECT_EQ(ret, 1);
228 }
229 
230 HWTEST_F(UpdaterUtilUnitTest, updater_IsSpaceCapacitySufficient, TestSize.Level1)
231 {
232     UpdaterParams upParams {};
233     UpdaterStatus status = IsSpaceCapacitySufficient(upParams);
234     EXPECT_EQ(status, UPDATE_ERROR);
235     upParams.updatePackage.push_back("/data/updater/updater/updater_full.zip");
236     status = IsSpaceCapacitySufficient(upParams);
237     EXPECT_EQ(status, UPDATE_SUCCESS);
238     upParams.updatePackage.push_back("xxx");
239     ProgressSmoothHandler(0, 0);
240     ProgressSmoothHandler(-1, 0);
241     ProgressSmoothHandler(0, 1);
242     status = IsSpaceCapacitySufficient(upParams);
243     EXPECT_EQ(status, UPDATE_ERROR);
244 }
245 
246 HWTEST_F(UpdaterUtilUnitTest, updater_HandleChildOutput, TestSize.Level1)
247 {
248     std::string buf = "xxx";
249     bool retryUpdate = false;
250     UpdaterParams upParams;
251     HandleChildOutput(buf, 0, retryUpdate, upParams);
252     EXPECT_EQ(retryUpdate, false);
253     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
254     EXPECT_EQ(retryUpdate, false);
255     buf = "write_log:xxx";
256     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
257     EXPECT_EQ(retryUpdate, false);
258     buf = "retry_update:xxx";
259     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
260     EXPECT_EQ(retryUpdate, true);
261     buf = "ui_log:xxx";
262     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
263     EXPECT_EQ(retryUpdate, true);
264     buf = "show_progress:xxx";
265     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
266     EXPECT_EQ(retryUpdate, true);
267     buf = "show_progress:xxx:xxx";
268     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
269     EXPECT_EQ(retryUpdate, true);
270     buf = "set_progress:xxx";
271     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
272     EXPECT_EQ(retryUpdate, true);
273     buf = "xxx:xxx";
274     HandleChildOutput(buf, buf.size(), retryUpdate, upParams);
275     EXPECT_EQ(retryUpdate, true);
276 }
277 
278 HWTEST_F(UpdaterUtilUnitTest, InstallUpdaterPackageTest, TestSize.Level1)
279 {
280     UpdaterParams upParams;
281     upParams.retryCount = 0;
__anon05c379330402(float value) 282     upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); };
283     upParams.updatePackage.push_back("/data/updater/updater/updater_full.zip");
284     Hpackage::PkgManager::PkgManagerPtr pkgManager = Hpackage::PkgManager::CreatePackageInstance();
285     EXPECT_EQ(InstallUpdaterPackage(upParams, pkgManager), UPDATE_ERROR);
286     upParams.updateMode = SDCARD_UPDATE;
287     upParams.retryCount = 1;
288     EXPECT_EQ(InstallUpdaterPackage(upParams, pkgManager), UPDATE_ERROR);
289 }
290 
291 HWTEST_F(UpdaterUtilUnitTest, DoUpdatePackagesTest, TestSize.Level1)
292 {
293     UpdaterParams upParams;
294     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
295     upParams.updatePackage.push_back("/data/updater/updater/updater_full.zip");
296     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
__anon05c379330502(float value) 297     upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); };
298     upParams.installTime.push_back(std::chrono::duration<double>(0));
299     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_ERROR);
300 }
301 
302 HWTEST_F(UpdaterUtilUnitTest, StartUpdaterEntryTest, TestSize.Level1)
303 {
304     UpdaterParams upParams;
305     upParams.factoryResetMode = "factory_wipe_data";
306     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
307     upParams.factoryResetMode = "user_wipe_data";
308     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
309     upParams.factoryResetMode = "menu_wipe_data";
310     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
311     upParams.factoryResetMode = "";
312     EXPECT_EQ(DoUpdatePackages(upParams), UPDATE_CORRUPT);
313 }
314 
315 HWTEST_F(UpdaterUtilUnitTest, StartUpdaterProcTest, TestSize.Level1)
316 {
317     Hpackage::PkgManager::PkgManagerPtr pkgManager = Hpackage::PkgManager::CreatePackageInstance();
318     UpdaterParams upParams;
319     EXPECT_EQ(StartUpdaterProc(nullptr, upParams), UPDATE_CORRUPT);
320     EXPECT_EQ(StartUpdaterProc(pkgManager, upParams), UPDATE_ERROR);
321 }
322 
323 HWTEST_F(UpdaterUtilUnitTest, CheckPathNeedMountSD, TestSize.Level0)
324 {
325     UpdaterParams upParams;
326     upParams.updatePackage.push_back("/data/updater/updater_full.zip");
327     EXPECT_EQ(CheckPathNeedMountSD(upParams), false);
328     upParams.updatePackage.clear();
329     upParams.updatePackage.push_back("/sdcard/updater/updater_full.zip");
330     EXPECT_EQ(CheckPathNeedMountSD(upParams), true);
331     upParams.updatePackage.clear();
332     upParams.updatePackage.push_back("/data/sdcard/updater_full.zip");
333     EXPECT_EQ(CheckPathNeedMountSD(upParams), false);
334 }
335 }