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 <map>
17#include <string>
18#include <iostream>
19#include <fstream>
20#include <filesystem>
21#include "cJSON.h"
22#include <gtest/gtest.h>
23#include "secodeFuzz.h"
24#include "StageContext.h"
25#include "common.h"
26#include "ChangeJsonUtil.h"
27#define private public
28#include "CommandParser.h"
29using namespace fuzztest;
30
31namespace {
32std::string g_moduleJsonNoModule = R"({
33    "app" :
34    {
35        "apiReleaseType" : "Beta1"
36    }
37})";
38
39std::string g_moduleJsonNoModuleName = R"({
40    "module" :
41    {
42        "packageName" : "entry"
43    }
44})";
45
46std::string g_moduleJsonNoModulePackageName = R"({
47    "module" :
48    {
49        "name" : "entry"
50    }
51})";
52
53std::string g_moduleJson = R"({
54    "module" :
55    {
56        "name" : "entry",
57        "type" : "entry",
58        "description" : "$string:module_desc",
59        "mainElement" : "EntryAbility",
60        "deviceTypes" :
61        [
62            "phone",
63            "tablet",
64            "2in1"
65        ],
66        "deliveryWithInstall" : true,
67        "installationFree" : false,
68        "pages" : "$profile:main_pages",
69        "extensionAbilities": [{"name": ""}],
70        "packageName":  "entry",
71        "virtualMachine" : "ark11.0.2.0",
72        "compileMode" : "esmodule",
73        "descriptionId" : 16777220
74    }
75})";
76
77std::string g_pkgInfoJson = R"({
78    "entry": {
79        "packageName": "entry",
80        "bundleName": "",
81        "moduleName": "",
82        "version": "",
83        "entryPath": "src/main/",
84        "isSO": false,
85        "dependencyAlias": ""
86    }
87})";
88
89TEST(SetPkgContextInfoFuzzTest, test_json)
90{
91    std::cout << "--> SetPkgContextInfoFuzzTest for common start <--" << std::endl;
92    DT_FUZZ_START(0, TEST_TIMES, (char*)"SetPkgContextInfoFuzzTest", 0)
93    {
94        std::map<std::string, std::string> pkgContextMap;
95        std::map<std::string, std::string> packageNameList;
96        CommandParser::GetInstance().appResourcePath = ".";
97        CommandParser::GetInstance().loaderJsonPath = "./loader.json";
98        // 变化数据
99        std::string filePath = "module.json";
100        ChangeJsonUtil::WriteFile(filePath, g_moduleJsonNoModule);
101        OHOS::Ide::StageContext::GetInstance().SetPkgContextInfo(pkgContextMap, packageNameList);
102        ChangeJsonUtil::WriteFile(filePath, g_moduleJsonNoModuleName);
103        OHOS::Ide::StageContext::GetInstance().SetPkgContextInfo(pkgContextMap, packageNameList);
104        ChangeJsonUtil::WriteFile(filePath, g_moduleJsonNoModulePackageName);
105        OHOS::Ide::StageContext::GetInstance().SetPkgContextInfo(pkgContextMap, packageNameList);
106        uint64_t moduleIndex = 0;
107        cJSON* moduleJsonArgs = cJSON_Parse(g_moduleJson.c_str());
108        ChangeJsonUtil::ModifyObject(moduleJsonArgs, moduleIndex);
109        ChangeJsonUtil::WriteFile(filePath, moduleJsonArgs);
110        cJSON_Delete(moduleJsonArgs);
111        std::string pkgContextFilePath = "pkgContextInfo.json";
112        uint64_t pkgContextIndex = 0;
113        cJSON* pkgContextJsonArgs = cJSON_Parse(g_pkgInfoJson.c_str());
114        ChangeJsonUtil::ModifyObject(pkgContextJsonArgs, pkgContextIndex);
115        ChangeJsonUtil::WriteFile(pkgContextFilePath, pkgContextJsonArgs);
116        cJSON_Delete(pkgContextJsonArgs);
117        // 执行接口
118        OHOS::Ide::StageContext::GetInstance().SetPkgContextInfo(pkgContextMap, packageNameList);
119    }
120    DT_FUZZ_END()
121    printf("end ---- SetPkgContextInfoFuzzTest\r\n");
122    if (DT_GetIsPass() == 0) {
123        printf("test SetPkgContextInfoFuzzTest is not ok\r\n");
124    } else {
125        printf("test SetPkgContextInfoFuzzTest is ok\r\n");
126    }
127    std::cout << "--> SetPkgContextInfoFuzzTest for common end <--" << std::endl;
128}
129}