1 /*
2  * Copyright (c) 2024 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 <fstream>
17 #include <iostream>
18 #include <sstream>
19 #include <string>
20 #include <sys/stat.h>
21 #include <unistd.h>
22 #include <vector>
23 
24 #include "json/value.h"
25 #include <gtest/gtest.h>
26 
27 #include "b_error/b_error.h"
28 #include "b_error/b_excep_utils.h"
29 #include "b_json/b_json_service_disposal_config.h"
30 #include "cJsonMock.h"
31 
32 namespace OHOS::FileManagement::Backup {
33 using namespace std;
34 using namespace testing;
35 
36 namespace {
37 const string PATH = "/data/service/el2/100/backup/";
38 const string CONFIG_NAME = "RestoreDisposalConfig.json";
39 } // namespace
40 
41 class BJsonServiceDisposalConfigTest : public testing::Test {
42 public:
43     // 所有测试用例执行之前执行
44     static void SetUpTestCase(void);
45     // 所有测试用例执行之后执行
46     static void TearDownTestCase(void);
47     // 每次测试用例执行之前执行
48     void SetUp();
49     // 每次测试用例执行之后执行
50     void TearDown();
51 
52     static inline shared_ptr<CJsonMock> cJsonMock = nullptr;
53 };
54 
TearDown()55 void BJsonServiceDisposalConfigTest::TearDown() {}
56 
SetUp()57 void BJsonServiceDisposalConfigTest::SetUp()
58 {
59     string filePath = PATH + CONFIG_NAME;
60     bool result = remove(filePath.c_str());
61     if (result) {
62         GTEST_LOG_(INFO) << "delete file success.";
63     } else {
64         GTEST_LOG_(INFO) << "delete file failed.";
65     }
66 }
67 
SetUpTestCase()68 void BJsonServiceDisposalConfigTest::SetUpTestCase()
69 {
70     cJsonMock = make_shared<CJsonMock>();
71     CJson::cJsonPtr = cJsonMock;
72 }
73 
TearDownTestCase()74 void BJsonServiceDisposalConfigTest::TearDownTestCase()
75 {
76     CJson::cJsonPtr = nullptr;
77     cJsonMock = nullptr;
78 }
79 
80 /* *
81  * @tc.number: SUB_Disposal_Config_Test_0102
82  * @tc.name: SUB_Disposal_Config_Test_0102
83  * @tc.desc: 测试print返回空指针情况
84  * @tc.size: MEDIUM
85  * @tc.type: FUNC
86  * @tc.level Level 1
87  * @tc.require: IAAMIK
88  */
89 HWTEST_F(BJsonServiceDisposalConfigTest, SUB_Disposal_Config_Test_0102, testing::ext::TestSize.Level1)
90 {
91     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-begin SUB_Disposal_Config_Test_0102";
92     try {
93         int cjson = 0;
94         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
95         EXPECT_CALL(*cJsonMock, cJSON_CreateArray()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
96         EXPECT_CALL(*cJsonMock, cJSON_AddItemToObject(_, _, _)).WillOnce(Return(true));
97         EXPECT_CALL(*cJsonMock, cJSON_Print(_)).WillOnce(Return(nullptr));
98         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
99         BJsonDisposalConfig config;
100     } catch (...) {
101         EXPECT_TRUE(false);
102         GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-an exception occurred by construction.";
103     }
104     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-end SUB_Disposal_Config_Test_0102";
105 }
106 
107 /* *
108  * @tc.number: SUB_Disposal_Config_Test_0103
109  * @tc.name: SUB_Disposal_Config_Test_0103
110  * @tc.desc: 测试配置文件存在的情况
111  * @tc.size: MEDIUM
112  * @tc.type: FUNC
113  * @tc.level Level 1
114  * @tc.require: IAAMIK
115  */
116 HWTEST_F(BJsonServiceDisposalConfigTest, SUB_Disposal_Config_Test_0103, testing::ext::TestSize.Level1)
117 {
118     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-begin SUB_Disposal_Config_Test_0103";
119     try {
120         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(nullptr));
121         BJsonDisposalConfig config;
122     } catch (...) {
123         EXPECT_TRUE(false);
124         GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-an exception occurred by construction.";
125     }
126     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-end SUB_Disposal_Config_Test_0103";
127 }
128 
129 /* *
130  * @tc.number: SUB_Disposal_Config_Test_0104
131  * @tc.name: SUB_Disposal_Config_Test_0104
132  * @tc.desc: 测试creatArray返回空指针情况
133  * @tc.size: MEDIUM
134  * @tc.type: FUNC
135  * @tc.level Level 1
136  * @tc.require: IAAMIK
137  */
138 HWTEST_F(BJsonServiceDisposalConfigTest, SUB_Disposal_Config_Test_0104, testing::ext::TestSize.Level1)
139 {
140     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-begin SUB_Disposal_Config_Test_0104";
141     try {
142         int cjson = 0;
143         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
144         EXPECT_CALL(*cJsonMock, cJSON_CreateArray()).WillOnce(Return(nullptr));
145         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
146         BJsonDisposalConfig config;
147     } catch (...) {
148         EXPECT_TRUE(false);
149         GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-an exception occurred by construction.";
150     }
151     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-end SUB_Disposal_Config_Test_0104";
152 }
153 
154 /* *
155  * @tc.number: SUB_Disposal_Config_Test_0202
156  * @tc.name: Disposal_Config_Test_0202
157  * @tc.desc: 测试修改config文件时print返回空指针
158  * @tc.size: MEDIUM
159  * @tc.type: FUNC
160  * @tc.level Level 1
161  * @tc.require: IAAMIK
162  */
163 HWTEST_F(BJsonServiceDisposalConfigTest, Disposal_Config_Test_0202, testing::ext::TestSize.Level1)
164 {
165     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-begin Disposal_Config_Test_0202";
166     try {
167         string filePath = PATH + CONFIG_NAME;
168         int cjson = 0;
169         string str = "test";
170         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
171         EXPECT_CALL(*cJsonMock, cJSON_CreateArray()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
172         EXPECT_CALL(*cJsonMock, cJSON_AddItemToObject(_, _, _)).WillOnce(Return(true));
173         EXPECT_CALL(*cJsonMock, cJSON_Print(_)).WillOnce(Return(nullptr));
174         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
175         BJsonDisposalConfig config;
176         EXPECT_EQ(access(filePath.c_str(), F_OK), 0);
177         const string bundleName = "test1";
178         EXPECT_CALL(*cJsonMock, cJSON_Parse(_)).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
179         EXPECT_CALL(*cJsonMock, cJSON_GetObjectItem(_, _)).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
180         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
181         EXPECT_CALL(*cJsonMock, cJSON_AddStringToObject(_, _, _)).WillOnce(Return(nullptr));
182         EXPECT_CALL(*cJsonMock, cJSON_AddItemToArray(_, _)).WillOnce(Return(true));
183         EXPECT_CALL(*cJsonMock, cJSON_Print(_)).WillOnce(Return(nullptr));
184         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
185         bool retAdd = config.AppendIntoDisposalConfigFile(bundleName);
186         EXPECT_FALSE(retAdd);
187     } catch (...) {
188         EXPECT_TRUE(false);
189         GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-an exception occurred by construction.";
190     }
191     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-end Disposal_Config_Test_0202";
192 }
193 
194 /* *
195  * @tc.number: SUB_Disposal_Config_Test_0203
196  * @tc.name: Disposal_Config_Test_0203
197  * @tc.desc: 测试修改config文件时parse返回空指针的情况
198  * @tc.size: MEDIUM
199  * @tc.type: FUNC
200  * @tc.level Level 1
201  * @tc.require: IAAMIK
202  */
203 HWTEST_F(BJsonServiceDisposalConfigTest, Disposal_Config_Test_0203, testing::ext::TestSize.Level1)
204 {
205     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-begin Disposal_Config_Test_0203";
206     try {
207         string filePath = PATH + CONFIG_NAME;
208         int cjson = 0;
209         string str = "test";
210         EXPECT_CALL(*cJsonMock, cJSON_CreateObject()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
211         EXPECT_CALL(*cJsonMock, cJSON_CreateArray()).WillOnce(Return(reinterpret_cast<cJSON *>(&cjson)));
212         EXPECT_CALL(*cJsonMock, cJSON_AddItemToObject(_, _, _)).WillOnce(Return(true));
213         EXPECT_CALL(*cJsonMock, cJSON_Print(_)).WillOnce(Return(nullptr));
214         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
215         BJsonDisposalConfig config;
216         EXPECT_EQ(access(filePath.c_str(), F_OK), 0);
217         const string bundleName = "test1";
218         EXPECT_CALL(*cJsonMock, cJSON_Parse(_)).WillOnce(Return(nullptr));
219         EXPECT_CALL(*cJsonMock, cJSON_Delete(_)).WillOnce(Return());
220         bool retAdd = config.AppendIntoDisposalConfigFile(bundleName);
221         EXPECT_FALSE(retAdd);
222     } catch (...) {
223         EXPECT_TRUE(false);
224         GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-an exception occurred by construction.";
225     }
226     GTEST_LOG_(INFO) << "BJsonServiceDisposalConfigTest-end Disposal_Config_Test_0203";
227 }
228 } // namespace OHOS::FileManagement::Backup