diff --git a/adapter/ohos/Compressor.java b/adapter/ohos/Compressor.java index 99f0dbb0a9ec5723d61e7717489c94b8b0158851..d4f5158d11a5cb6048959fda0d1a60422ba6fb42 100644 --- a/adapter/ohos/Compressor.java +++ b/adapter/ohos/Compressor.java @@ -183,6 +183,9 @@ public class Compressor { private static final String TARGET_FILE_PATH = HAPADDITION_FOLDER_NAME + LINUX_FILE_SEPARATOR + "resources" + LINUX_FILE_SEPARATOR + "base" + LINUX_FILE_SEPARATOR + "profile"; private static final String BACKUP_PREFIX = "backup"; + private static final int QUERY_SCHEMES_CHECK_COUNT = 50; + private static final int QUERY_SCHEMES_CHECK_MIN_API_VERSION = 21; + private static final int MIN_API_VERSION_ERROR_VALUE = -1; // set timestamp to get fixed MD5 private static final int ATOMIC_SERVICE_ENTRY_SIZE_LIMIT_DEFAULT = 2048; // 2MB;unit is KB @@ -1079,6 +1082,12 @@ public class Compressor { "Check the continueBundleName parameter in the Stage module failed.")); return false; } + // check querySchemes in module.json + if (!checkQuerySchemes(jsonString)) { + LOG.error(PackingToolErrMsg.CHECK_STAGE_HAP_FAILED.toString( + "Check the querySchemes parameter in the Stage module failed.")); + return false; + } return true; } @@ -1136,6 +1145,20 @@ public class Compressor { return true; } + private static boolean checkQuerySchemes(String jsonString) throws BundleException { + int minAPIVersion = ModuleJsonUtil.getMinAPIVersion(jsonString); + minAPIVersion = (minAPIVersion == MIN_API_VERSION_ERROR_VALUE) ? QUERY_SCHEMES_CHECK_MIN_API_VERSION : minAPIVersion; + List querySchemes = ModuleJsonUtil.getQuerySchemes(jsonString); + int querySchemesCount = querySchemes.size(); + if (querySchemesCount > QUERY_SCHEMES_CHECK_COUNT && minAPIVersion < QUERY_SCHEMES_CHECK_MIN_API_VERSION) { + String errMsg = "The number of querySchemes in the Hap(entry) exceeds " + QUERY_SCHEMES_CHECK_COUNT + + ", and the minAPIVersion is less than " + QUERY_SCHEMES_CHECK_MIN_API_VERSION; + LOG.error(PackingToolErrMsg.CHECK_STAGE_HAP_FAILED.toString(errMsg)); + return false; + } + return true; + } + private static boolean checkStageUbsanEnabledValid(String jsonString) throws BundleException { boolean asanEnabled = ModuleJsonUtil.getStageAsanEnabled(jsonString); boolean tsanEnabled = ModuleJsonUtil.getStageTsanEnabled(jsonString); diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index 0e1101c67f8e54a96d593fe621f77c4fabf4d9b7..0a1b9bd86e4e618cc3b551521dbcf828352dedfe 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -36,6 +36,7 @@ class ModuleJsonUtil { private static final String MIN_COMPATIBLE_VERSION_CODE = "minCompatibleVersionCode"; private static final String API_VERSION = "apiVersion"; private static final String MIN_API_VERSION = "minAPIVersion"; + private static final int MIN_API_VERSION_ERROR_VALUE = -1; private static final String TARGET_API_VERSION = "targetAPIVersion"; private static final String API_RELEASE_TYPE = "apiReleaseType"; private static final String DEBUG = "debug"; @@ -107,6 +108,7 @@ class ModuleJsonUtil { private static final String PROXY_DATAS = "proxyDatas"; private static final String PROXY_DATA = "proxyData"; private static final String PROXY_URI = "uri"; + private static final String QUERY_SCHEMES = "querySchemes"; private static final String CONTINUE_TYPE = "continueType"; private static final String CONTINUE_BUNDLE_NAME = "continueBundleName"; private static final String MULTI_APP_MODE = "multiAppMode"; @@ -1718,6 +1720,50 @@ class ModuleJsonUtil { return continueBundleName; } + /** + * get querySchemes from json file. + * + * @param jsonString is the json String of module.json + * @return querySchemes URL list + */ + public static List getQuerySchemes(String jsonString) throws BundleException { + List querySchemes = new ArrayList<>(); + JSONObject moduleObj = getModuleObj(jsonString); + if (!moduleObj.containsKey(QUERY_SCHEMES)) { + return querySchemes; + } + JSONArray querySchemesArray = moduleObj.getJSONArray(QUERY_SCHEMES); + if (querySchemesArray != null) { + querySchemesArray.stream() + .map(Object::toString) + .forEach(querySchemes::add); + } + return querySchemes; + } + + /** + * Gets the minAPIVersion from a {@code module.json} string. + *

+ * For example: + *

+     *   build-profile.json5                  module.json  minAPIVersion
+     *   "compatibleSdkVersion": "5.0.0(12)"  50000012     50000012 % 1000 //The last three digits represent the version
+     *   12                                   12           12
+     * 
+ * + * @param jsonString the JSON string of module.json + * @return the minAPIVersion value extracted from the module.json + */ + public static int getMinAPIVersion(String jsonString) throws BundleException { + JSONObject appObj = ModuleJsonUtil.getAppObj(jsonString); + if (!appObj.containsKey(MIN_API_VERSION)) { + LOG.warning("Get minAPIVersion in the Stage module.json failed."); + return MIN_API_VERSION_ERROR_VALUE; + } + int rawMinAPIVersion = appObj.getIntValue(MIN_API_VERSION); + return rawMinAPIVersion % 1000; + } + /** * get apiReleaseType in module.json * diff --git a/packing_tool/frameworks/include/json/module_json.h b/packing_tool/frameworks/include/json/module_json.h index ab20207c3634b3da533266334915e6c19186a074..b7f5eee8bffb9c7aa7d08d563469b0cc61267e94 100644 --- a/packing_tool/frameworks/include/json/module_json.h +++ b/packing_tool/frameworks/include/json/module_json.h @@ -203,12 +203,16 @@ public: bool GetMinApiVersion(int32_t& minAPIVersion); bool GetTargetApiVersion(int32_t& targetAPIVersion); bool GetDeliveryWithInstall(bool& deliveryWithInstall); + bool GetQuerySchemes(std::list& querySchemes); + bool GetQuerySchemesByModuleObj(std::unique_ptr& moduleObj, std::list& querySchemes); + bool GetQuerySchemesByArray(std::unique_ptr& querySchemesObj, std::list& querySchemes); bool IsModuleAtomicServiceValid(); bool CheckEntryInAtomicService(); bool CheckAtomicServiceInstallationFree(); bool CheckStageAsanTsanEnabledValid(); bool CheckStageAtomicService(); + bool CheckQuerySchemes(); bool CheckStageOverlayCfg(); bool GetGenerateBuildHash(bool& generateBuildHash); diff --git a/packing_tool/frameworks/src/hap_packager.cpp b/packing_tool/frameworks/src/hap_packager.cpp index 323f9f2c251ee0ea00fe2411e3786ed94ad581cd..24a53876bdb599aed501dc1aa79f483fb89898a1 100644 --- a/packing_tool/frameworks/src/hap_packager.cpp +++ b/packing_tool/frameworks/src/hap_packager.cpp @@ -423,6 +423,11 @@ bool HapPackager::CheckStageHap(const std::string &jsonPath) return false; } + if (!moduleJson_.CheckQuerySchemes()) { + LOGE("CheckQuerySchemes failed."); + return false; + } + return true; } diff --git a/packing_tool/frameworks/src/json/module_json.cpp b/packing_tool/frameworks/src/json/module_json.cpp index c9d7bce8f302cb978909cb1470e37fc5cd20c052..c91509e6fafc24bbb7b1c1f3d607b2eca486b794 100644 --- a/packing_tool/frameworks/src/json/module_json.cpp +++ b/packing_tool/frameworks/src/json/module_json.cpp @@ -31,6 +31,9 @@ const std::string VERSIONNAME = "versionName"; const std::string MIN_COMPATIBLE_VERSION_CODE = "minCompatibleVersionCode"; const std::string API_VERSION = "apiVersion"; const std::string MIN_API_VERSION = "minAPIVersion"; +const std::string QUERY_SCHEMES = "querySchemes"; +const int32_t QUERY_SCHEMES_CHECK_COUNT = 50; +const int32_t QUERY_SCHEMES_CHECK_MIN_API_VERSION = 21; const std::string TARGET_API_VERSION = "targetAPIVersion"; const std::string API_RELEASE_TYPE = "apiReleaseType"; const std::string DEBUG = "debug"; @@ -1236,6 +1239,22 @@ bool ModuleJson::CheckStageAtomicService() return true; } +bool ModuleJson::CheckQuerySchemes() +{ + int32_t rawMinAPIVersion = -1; + GetMinApiVersion(rawMinAPIVersion); + int32_t minAPIVersion = rawMinAPIVersion % 1000; + std::list querySchemes; + GetQuerySchemes(querySchemes); + int querySchemesCount = querySchemes.size(); + if (querySchemesCount > QUERY_SCHEMES_CHECK_COUNT && minAPIVersion < QUERY_SCHEMES_CHECK_MIN_API_VERSION) { + LOGE("The number of querySchemes in the Hap(entry) exceeds %d, and the minAPIVersion is less than %d", + QUERY_SCHEMES_CHECK_COUNT, QUERY_SCHEMES_CHECK_MIN_API_VERSION); + return false; + } + return true; +} + bool ModuleJson::CheckStageOverlayCfg() { std::string targetModuleName; @@ -1647,5 +1666,53 @@ bool ModuleJson::GetDeliveryWithInstall(bool& deliveryWithInstall) } return true; } + +bool ModuleJson::GetQuerySchemes(std::list& querySchemes) +{ + std::unique_ptr moduleObj; + if (!GetModuleObject(moduleObj)) { + LOGE("GetModuleObject failed!"); + return false; + } + return GetQuerySchemesByModuleObj(moduleObj, querySchemes); +} + +bool ModuleJson::GetQuerySchemesByModuleObj(std::unique_ptr& moduleObj, std::list& querySchemes) +{ + if (!moduleObj) { + LOGE("Module node is null!"); + return false; + } + if (moduleObj->Contains(QUERY_SCHEMES.c_str())) { + std::unique_ptr querySchemesObj; + if (moduleObj->GetArray(QUERY_SCHEMES.c_str(), &querySchemesObj) != Result::SUCCESS) { + LOGE("Module node get %s array node failed!", QUERY_SCHEMES.c_str()); + return false; + } + if (!GetQuerySchemesByArray(querySchemesObj, querySchemes)) { + LOGE("GetQuerySchemesByArray failed!"); + return false; + } + } + return true; +} + +bool ModuleJson::GetQuerySchemesByArray(std::unique_ptr& querySchemesObj, + std::list& querySchemes) +{ + if (!querySchemesObj) { + LOGE("querySchemes node is null!"); + return false; + } + for (int32_t i = 0; i < querySchemesObj->GetSize(); i++) { + std::unique_ptr obj = querySchemesObj->Get(i); + if (obj == nullptr) { + LOGE("querySchemesObj->Get(%{public}d) returned null", i); + continue; + } + querySchemes.push_back(obj->GetString()); + } + return true; +} } // namespace AppPackingTool } // namespace OHOS diff --git a/packing_tool/frameworks/test/unittest/json/module_json_test/module_json_test.cpp b/packing_tool/frameworks/test/unittest/json/module_json_test/module_json_test.cpp index f0867ded29913ffeae9ed410a9127854a7f000ab..be7a7bcf4e068201134cd8d2c32dc6fd68389604 100755 --- a/packing_tool/frameworks/test/unittest/json/module_json_test/module_json_test.cpp +++ b/packing_tool/frameworks/test/unittest/json/module_json_test/module_json_test.cpp @@ -1588,6 +1588,79 @@ const std::string APP_ERROR_DELIVERY_WITH_INSTALL = "{" "\"deliveryWithInstall\": 123" "}" "}"; + +const std::string APP_ERROR_QUERY_SCHEMES = "{" + "\"app\": {" + "\"versionCode\": 1000000," + "\"versionName\": \"test_version_name\"," + "\"minCompatibleVersionCode\": 99" + "}," + "\"module\": {" + "\"deviceType\": \"test\"" + "]" +"}"; + +const std::string MODULE_JSON_STRING_WITH_QUERY_SCHEMES_1 = "{" + "\"app\": {" + "\"versionCode\": 1000000," + "\"versionName\": \"test_version_name\"," + "\"minCompatibleVersionCode\": 99," + "\"minAPIVersion\": 20" + "}," + "\"module\": {" + "\"querySchemes\": [" + "\"queryUrl1\"," "\"queryUrl2\"," "\"queryUrl3\"," "\"queryUrl4\"," "\"queryUrl5\"" + "]" + "}" +"}"; + +const std::string MODULE_JSON_STRING_WITH_QUERY_SCHEMES_2 = "{" + "\"app\": {" + "\"versionCode\": 1000000," + "\"versionName\": \"test_version_name\"," + "\"minCompatibleVersionCode\": 99," + "\"minAPIVersion\": 20" + "}," + "\"module\": {" + "\"querySchemes\": [" + "\"queryUrl1\"," "\"queryUrl2\"," "\"queryUrl3\"," "\"queryUrl4\"," "\"queryUrl5\"," + "\"queryUrl6\"," "\"queryUrl7\"," "\"queryUrl8\"," "\"queryUrl9\"," "\"queryUrl10\"," + "\"queryUrl11\"," "\"queryUrl12\"," "\"queryUrl13\"," "\"queryUrl14\"," "\"queryUrl15\"," + "\"queryUrl16\"," "\"queryUrl17\"," "\"queryUrl18\"," "\"queryUrl19\"," "\"queryUrl20\"," + "\"queryUrl21\"," "\"queryUrl22\"," "\"queryUrl23\"," "\"queryUrl24\"," "\"queryUrl25\"," + "\"queryUrl26\"," "\"queryUrl27\"," "\"queryUrl28\"," "\"queryUrl29\"," "\"queryUrl30\"," + "\"queryUrl31\"," "\"queryUrl32\"," "\"queryUrl33\"," "\"queryUrl34\"," "\"queryUrl35\"," + "\"queryUrl36\"," "\"queryUrl37\"," "\"queryUrl38\"," "\"queryUrl39\"," "\"queryUrl440\"," + "\"queryUrl41\"," "\"queryUrl42\"," "\"queryUrl43\"," "\"queryUrl44\"," "\"queryUrl45\"," + "\"queryUrl46\"," "\"queryUrl47\"," "\"queryUrl48\"," "\"queryUrl49\"," "\"queryUrl50\"," + "\"queryUrl51\"," "\"queryUrl52\"," "\"queryUrl53\"," "\"queryUrl54\"," "\"queryUrl55\"" + "]" + "}" +"}"; + +const std::string MODULE_JSON_STRING_WITH_QUERY_SCHEMES_3 = "{" + "\"app\": {" + "\"versionCode\": 1000000," + "\"versionName\": \"test_version_name\"," + "\"minCompatibleVersionCode\": 99," + "\"minAPIVersion\": 21" + "}," + "\"module\": {" + "\"querySchemes\": [" + "\"queryUrl1\"," "\"queryUrl2\"," "\"queryUrl3\"," "\"queryUrl4\"," "\"queryUrl5\"," + "\"queryUrl6\"," "\"queryUrl7\"," "\"queryUrl8\"," "\"queryUrl9\"," "\"queryUrl10\"," + "\"queryUrl11\"," "\"queryUrl12\"," "\"queryUrl13\"," "\"queryUrl14\"," "\"queryUrl15\"," + "\"queryUrl16\"," "\"queryUrl17\"," "\"queryUrl18\"," "\"queryUrl19\"," "\"queryUrl20\"," + "\"queryUrl21\"," "\"queryUrl22\"," "\"queryUrl23\"," "\"queryUrl24\"," "\"queryUrl25\"," + "\"queryUrl26\"," "\"queryUrl27\"," "\"queryUrl28\"," "\"queryUrl29\"," "\"queryUrl30\"," + "\"queryUrl31\"," "\"queryUrl32\"," "\"queryUrl33\"," "\"queryUrl34\"," "\"queryUrl35\"," + "\"queryUrl36\"," "\"queryUrl37\"," "\"queryUrl38\"," "\"queryUrl39\"," "\"queryUrl440\"," + "\"queryUrl41\"," "\"queryUrl42\"," "\"queryUrl43\"," "\"queryUrl44\"," "\"queryUrl45\"," + "\"queryUrl46\"," "\"queryUrl47\"," "\"queryUrl48\"," "\"queryUrl49\"," "\"queryUrl50\"," + "\"queryUrl51\"," "\"queryUrl52\"," "\"queryUrl53\"," "\"queryUrl54\"," "\"queryUrl55\"" + "]" + "}" +"}"; } class ModuleJsonTest : public testing::Test { public: @@ -8581,4 +8654,207 @@ HWTEST_F(ModuleJsonTest, GetDeliveryWithInstall_0300, Function | MediumTest | Le EXPECT_TRUE(moduleJson.ParseFromString(MODULE_JSON_STRING)); EXPECT_TRUE(moduleJson.GetDeliveryWithInstall(deliveryWithInstall)); } + +/* + * @tc.name: GetQuerySchemes_0100 + * @tc.desc: test GetQuerySchemes when root is nullptr + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemes_0100, Function | MediumTest | Level1) +{ + std::list querySchemes; + OHOS::AppPackingTool::ModuleJson moduleJson; + moduleJson.root_ = nullptr; + EXPECT_FALSE(moduleJson.GetQuerySchemes(querySchemes)); +} + +/* + * @tc.name: GetQuerySchemes_0200 + * @tc.desc: test GetQuerySchemes when querySchemes field is invalid + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemes_0200, Function | MediumTest | Level1) +{ + std::list querySchemes; + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.ParseFromString(APP_ERROR_QUERY_SCHEMES)); + EXPECT_FALSE(moduleJson.GetQuerySchemes(querySchemes)); +} + +/* + * @tc.name: GetQuerySchemes_0300 + * @tc.desc: test GetQuerySchemes when querySchemes field exists and is valid + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemes_0300, Function | MediumTest | Level1) +{ + std::list querySchemes; + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.ParseFromString(MODULE_JSON_STRING_WITH_QUERY_SCHEMES_1)); + EXPECT_TRUE(moduleJson.GetQuerySchemes(querySchemes)); + EXPECT_FALSE(querySchemes.empty()); +} + +/* + * @tc.name: GetQuerySchemesByModuleObj_0100 + * @tc.desc: test GetQuerySchemesByModuleObj when moduleObj is nullptr + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByModuleObj_0100, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr moduleObj; // nullptr + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByModuleObj(moduleObj, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByModuleObj_0200 + * @tc.desc: test GetQuerySchemesByModuleObj when querySchemes field not exists + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByModuleObj_0200, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr moduleObj = PtJson::Parse("{\"module\": {}}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByModuleObj(moduleObj, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByModuleObj_0300 + * @tc.desc: test GetQuerySchemesByModuleObj when querySchemes exists but invalid + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByModuleObj_0300, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr moduleObj = PtJson::Parse("{\"querySchemes\": 123}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByModuleObj(moduleObj, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByModuleObj_0400 + * @tc.desc: test GetQuerySchemesByModuleObj when querySchemes is valid array + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByModuleObj_0400, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr moduleObj = PtJson::Parse("{\"querySchemes\": [\"https\", \"ftp\"]}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.GetQuerySchemesByModuleObj(moduleObj, querySchemes)); + EXPECT_EQ(querySchemes.size(), 2); + EXPECT_EQ(querySchemes.front(), "https"); +} + +/* + * @tc.name: GetQuerySchemesByArray_0100 + * @tc.desc: test GetQuerySchemesByArray when input is not array + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByArray_0100, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr notArray = PtJson::Parse("{\"querySchemes\": \"https\"}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByArray(notArray, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByArray_0200 + * @tc.desc: test GetQuerySchemesByArray when array is empty + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByArray_0200, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr emptyArray = PtJson::Parse("{\"querySchemes\": []}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByArray(emptyArray, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByArray_0300 + * @tc.desc: test GetQuerySchemesByArray when array contains non-string element + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByArray_0300, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr mixedArray = PtJson::Parse("{\"querySchemes\": 123}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_FALSE(moduleJson.GetQuerySchemesByArray(mixedArray, querySchemes)); +} + +/* + * @tc.name: GetQuerySchemesByArray_0400 + * @tc.desc: test GetQuerySchemesByArray when array contains valid strings + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(ModuleJsonTest, GetQuerySchemesByArray_0400, Function | MediumTest | Level1) +{ + std::list querySchemes; + std::unique_ptr array = PtJson::Parse("{\"querySchemes\": [\"https\", \"ftp\"]}"); + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.GetQuerySchemesByArray(array, querySchemes)); + EXPECT_EQ(querySchemes.size(), 2); + EXPECT_EQ(querySchemes.front(), "http"); +} + +/* + * @tc.name: CheckQuerySchemes_0100 + * @tc.desc: test CheckQuerySchemes when root is nullptr + */ +HWTEST_F(ModuleJsonTest, CheckQuerySchemes_0100, Function | MediumTest | Level1) +{ + OHOS::AppPackingTool::ModuleJson moduleJson; + moduleJson.root_ = nullptr; + EXPECT_TRUE(moduleJson.CheckQuerySchemes()); +} + +/* + * @tc.name: CheckQuerySchemes_0200 + * @tc.desc: test CheckQuerySchemes when querySchemes count <= limit + */ +HWTEST_F(ModuleJsonTest, CheckQuerySchemes_0200, Function | MediumTest | Level1) +{ + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.ParseFromString(MODULE_JSON_STRING_WITH_QUERY_SCHEMES_1)); + EXPECT_TRUE(moduleJson.CheckQuerySchemes()); +} + +/* + * @tc.name: CheckQuerySchemes_0300 + * @tc.desc: test CheckQuerySchemes when querySchemes count > limit but minAPIVersion >= threshold + */ +HWTEST_F(ModuleJsonTest, CheckQuerySchemes_0300, Function | MediumTest | Level1) +{ + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.ParseFromString(MODULE_JSON_STRING_WITH_QUERY_SCHEMES_3)); + EXPECT_TRUE(moduleJson.CheckQuerySchemes()); +} + +/* + * @tc.name: CheckQuerySchemes_0400 + * @tc.desc: test CheckQuerySchemes when querySchemes count > limit and minAPIVersion < threshold + */ +HWTEST_F(ModuleJsonTest, CheckQuerySchemes_0400, Function | MediumTest | Level1) +{ + OHOS::AppPackingTool::ModuleJson moduleJson; + EXPECT_TRUE(moduleJson.ParseFromString(MODULE_JSON_STRING_WITH_QUERY_SCHEMES_2)); + EXPECT_FALSE(moduleJson.CheckQuerySchemes()); +} }