From 1139331da19c13e5bfedc7e60338e877fef3e55d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 14:44:24 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix=20alarm=20Signed-off-by:=20=E9=BB=8E?= =?UTF-8?q?=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file_access/src/file_access_helper.cpp | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index b8cabb35..346c34ae 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -41,6 +41,7 @@ namespace { constexpr int COPY_EXCEPTION = -1; constexpr int COPY_NOEXCEPTION = -2; constexpr uint32_t MAX_COPY_ERROR_COUNT = 1000; + constexpr int CONVERT_TO_TEN = 10; } sptr g_sourceExtProxy; @@ -889,6 +890,21 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s std::string &metaJson) { json jsonObject; + auto convertToLongLong = [](const std::string &str, long long& Value) -> bool { + char* end; + errno = 0; + Value = std::strtoll(str.c_str(), &end, CONVERT_TO_TEN); + if (end == str.c_str()) { + return false; + } + if (error == ERANGE0) { + return false; + } + if (*end != '\0') { + return false; + } + return true; + } for (size_t i = 0; i < columns.size(); i++) { auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); // Assign a default value based on the type, When fileIo obtains an invalid value. @@ -909,7 +925,10 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s if (results[i].empty()) { results[i] = "0"; } - jsonObject[columns[i]] = std::atoi(results[i].c_str()); + long long num; + if (convertToLongLong(result[i], num)) { + jsonObject[colums[i]] = num; + } break; default: jsonObject[columns[i]] = " "; -- Gitee From 69e693d60691e40c64c26abb2542f2a7c5e34785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 14:59:29 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix=20alarm2=20Signed-off-by:=20=E9=BB=8E?= =?UTF-8?q?=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 346c34ae..cb53f1b8 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -897,7 +897,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s if (end == str.c_str()) { return false; } - if (error == ERANGE0) { + if (errno == ERANGE) { return false; } if (*end != '\0') { -- Gitee From 650ecb3522d6b8b26a45ba2307be9914b9fad0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 15:37:26 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix=20alarm=203=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index cb53f1b8..4b6b21ba 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -904,7 +904,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s return false; } return true; - } + }; for (size_t i = 0; i < columns.size(); i++) { auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); // Assign a default value based on the type, When fileIo obtains an invalid value. -- Gitee From b136f6831a4f484b7ba7674861610cd4a2dff7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 15:54:22 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix=20alarm=204=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 4b6b21ba..0f9a2b41 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -926,7 +926,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s results[i] = "0"; } long long num; - if (convertToLongLong(result[i], num)) { + if (convertToLongLong(results[i], num)) { jsonObject[colums[i]] = num; } break; -- Gitee From fe23a6452911cba88a49a611abce9d8a7f1816cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 16:23:41 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix=20alarm=205=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 0f9a2b41..d74bc030 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -927,7 +927,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s } long long num; if (convertToLongLong(results[i], num)) { - jsonObject[colums[i]] = num; + jsonObject[columns[i]] = num; } break; default: -- Gitee From 1d2cd95e9486dcfd0fd48f3b8fe43c329bbd7f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 16:25:25 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fix=20alarm=206=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index d74bc030..251c0671 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -890,10 +890,10 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s std::string &metaJson) { json jsonObject; - auto convertToLongLong = [](const std::string &str, long long& Value) -> bool { + auto convertToLongLong = [](const std::string &str, long long& value) -> bool { char* end; errno = 0; - Value = std::strtoll(str.c_str(), &end, CONVERT_TO_TEN); + value = std::strtoll(str.c_str(), &end, CONVERT_TO_TEN); if (end == str.c_str()) { return false; } -- Gitee From ea969b7e1ee23d12e74dc5edc47d7d78649efc6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 19:58:17 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix=20alarm=207=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/unittest/get_query_result_test.cpp | 400 ++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 test/unittest/get_query_result_test.cpp diff --git a/test/unittest/get_query_result_test.cpp b/test/unittest/get_query_result_test.cpp new file mode 100644 index 00000000..93961051 --- /dev/null +++ b/test/unittest/get_query_result_test.cpp @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "file_access_extension_info.h" +#include "file_access_framework_errno.h" + +namespace OHOS::FileAccessFwk { +using namespace std; +using namespace nlohmann; + +// 复现GetQueryResult函数,因为在源文件中是static函数,无法直接访问 +enum ResultType { + STRING_TYPE = 1, + INT32_TYPE, + INT64_TYPE, +}; + +static const std::unordered_map FILE_RESULT_TYPE = { + { DISPLAY_NAME, STRING_TYPE }, + { RELATIVE_PATH, STRING_TYPE }, + { FILE_SIZE, INT64_TYPE }, + { DATE_ADDED, INT64_TYPE }, + { DATE_MODIFIED, INT64_TYPE }, + { WIDTH, INT32_TYPE }, + { HEIGHT, INT32_TYPE }, + { DURATION, INT32_TYPE }, +}; + +static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, + std::string &metaJson) +{ + json jsonObject; + auto convertToLongLong = [](const std::string &str, long long& value) -> bool { + char* end; + errno = 0; + value = std::strtoll(str.c_str(), &end, 10); + if (end == str.c_str()) { + return false; + } + if (errno == ERANGE) { + return false; + } + if (*end != '\0') { + return false; + } + return true; + }; + for (size_t i = 0; i < columns.size(); i++) { + auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); + // Assign a default value based on the type, When fileIo obtains an invalid value. + switch (memberType) { + case STRING_TYPE: + if (results[i].empty()) { + results[i] = " "; + } + jsonObject[columns[i]] = results[i]; + break; + case INT32_TYPE: + if (results[i].empty()) { + results[i] = "0"; + } + jsonObject[columns[i]] = std::atoi(results[i].c_str()); + break; + case INT64_TYPE: + if (results[i].empty()) { + results[i] = "0"; + } + long long num; + if (convertToLongLong(results[i], num)) { + jsonObject[columns[i]] = num; + } + break; + default: + jsonObject[columns[i]] = " "; + break; + } + } + metaJson = jsonObject.dump(); + return ERR_OK; +} + +class GetQueryResultTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); +}; + +void GetQueryResultTest::SetUpTestCase(void) +{ + // setup for all test cases +} + +void GetQueryResultTest::TearDownTestCase(void) +{ + // teardown for all test cases +} + +void GetQueryResultTest::SetUp(void) +{ + // setup for each test case +} + +void GetQueryResultTest::TearDown(void) +{ + // teardown for each test case +} + +/** + * @tc.number: GetQueryResult_STRING_TYPE_EmptyResult_001 + * @tc.name: GetQueryResult_STRING_TYPE_EmptyResult_001 + * @tc.desc: Test GetQueryResult with STRING_TYPE and empty result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_STRING_TYPE_EmptyResult_001, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DISPLAY_NAME}; + vector results = {""}; // Empty string result + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[DISPLAY_NAME], " "); +} + +/** + * @tc.number: GetQueryResult_STRING_TYPE_NonEmptyResult_002 + * @tc.name: GetQueryResult_STRING_TYPE_NonEmptyResult_002 + * @tc.desc: Test GetQueryResult with STRING_TYPE and non-empty result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_STRING_TYPE_NonEmptyResult_002, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {RELATIVE_PATH}; + vector results = {"Documents/test.txt"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[RELATIVE_PATH], "Documents/test.txt"); +} + +/** + * @tc.number: GetQueryResult_INT32_TYPE_EmptyResult_003 + * @tc.name: GetQueryResult_INT32_TYPE_EmptyResult_003 + * @tc.desc: Test GetQueryResult with INT32_TYPE and empty result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_EmptyResult_003, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {WIDTH}; + vector results = {""}; // Empty string result + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[WIDTH], 0); +} + +/** + * @tc.number: GetQueryResult_INT32_TYPE_ValidResult_004 + * @tc.name: GetQueryResult_INT32_TYPE_ValidResult_004 + * @tc.desc: Test GetQueryResult with INT32_TYPE and valid result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_ValidResult_004, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {HEIGHT}; + vector results = {"1080"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[HEIGHT], 1080); +} + +/** + * @tc.number: GetQueryResult_INT32_TYPE_InvalidResult_005 + * @tc.name: GetQueryResult_INT32_TYPE_InvalidResult_005 + * @tc.desc: Test GetQueryResult with INT32_TYPE and invalid result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_InvalidResult_005, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DURATION}; + vector results = {"invalid"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[DURATION], 0); // atoi("invalid") returns 0 +} + +/** + * @tc.number: GetQueryResult_INT64_TYPE_EmptyResult_006 + * @tc.name: GetQueryResult_INT64_TYPE_EmptyResult_006 + * @tc.desc: Test GetQueryResult with INT64_TYPE and empty result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_EmptyResult_006, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {FILE_SIZE}; + vector results = {""}; // Empty string result + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[FILE_SIZE], 0); +} + +/** + * @tc.number: GetQueryResult_INT64_TYPE_ValidResult_007 + * @tc.name: GetQueryResult_INT64_TYPE_ValidResult_007 + * @tc.desc: Test GetQueryResult with INT64_TYPE and valid result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_ValidResult_007, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DATE_MODIFIED}; + vector results = {"1632456789000"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[DATE_MODIFIED], 1632456789000); +} + +/** + * @tc.number: GetQueryResult_INT64_TYPE_InvalidResult_008 + * @tc.name: GetQueryResult_INT64_TYPE_InvalidResult_008 + * @tc.desc: Test GetQueryResult with INT64_TYPE and invalid result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_InvalidResult_008, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DATE_ADDED}; + vector results = {"invalid123"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + // Should not be assigned due to conversion failure + EXPECT_FALSE(jsonObject[DATE_ADDED].is_number_integer()); +} + +/** + * @tc.number: GetQueryResult_INT64_TYPE_ValidLongLong_009 + * @tc.name: GetQueryResult_INT64_TYPE_ValidLongLong_009 + * @tc.desc: Test GetQueryResult with INT64_TYPE and valid long long result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_ValidLongLong_009, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DATE_ADDED}; + vector results = {"9223372036854775807"}; // Max value for long long + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[DATE_ADDED], 9223372036854775807); +} + +/** + * @tc.number: GetQueryResult_INT64_TYPE_OutOfRange_010 + * @tc.name: GetQueryResult_INT64_TYPE_OutOfRange_010 + * @tc.desc: Test GetQueryResult with INT64_TYPE and out of range result value. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_OutOfRange_010, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {FILE_SIZE}; + vector results = {"9223372036854775808"}; // Value larger than max long long + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + // Should not be assigned due to conversion failure + EXPECT_FALSE(jsonObject[FILE_SIZE].is_number_integer()); +} + +/** + * @tc.number: GetQueryResult_MultipleColumns_011 + * @tc.name: GetQueryResult_MultipleColumns_011 + * @tc.desc: Test GetQueryResult with multiple columns of different types. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_MultipleColumns_011, testing::TestSize::Level1) +{ + string uri = "test_uri"; + vector columns = {DISPLAY_NAME, FILE_SIZE, WIDTH, HEIGHT}; + vector results = {"test.txt", "1024", "1920", "1080"}; + string metaJson; + + int ret = GetQueryResult(uri, columns, results, metaJson); + + EXPECT_EQ(ret, ERR_OK); + json jsonObject = json::parse(metaJson); + EXPECT_EQ(jsonObject[DISPLAY_NAME], "test.txt"); + EXPECT_EQ(jsonObject[FILE_SIZE], 1024); + EXPECT_EQ(jsonObject[WIDTH], 1920); + EXPECT_EQ(jsonObject[HEIGHT], 1080); +} + +/** + * @tc.number: GetQueryResult_DefaultCase_012 + * @tc.name: GetQueryResult_DefaultCase_012 + * @tc.desc: Test GetQueryResult with an unknown column type (default case). + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level: Level1 + */ +HWTEST_F(GetQueryResultTest, GetQueryResult_DefaultCase_012, testing::TestSize::Level1) +{ + // Adding a mock column with an unknown type to trigger the default case + string uri = "test_uri"; + vector columns = {"unknown_column"}; + vector results = {"some_value"}; + string metaJson; + + // Manually add an entry to FILE_RESULT_TYPE with an unknown type + // Since we can't modify FILE_RESULT_TYPE directly, we'll test the default case differently + // We can create a column that doesn't exist in FILE_RESULT_TYPE to trigger an exception + // But since the function uses .at() which throws on missing key, we can't reach the switch default case + + // This test case documents that we cannot reach the default case in the switch statement + // due to the use of .at() which throws an exception before reaching the switch + EXPECT_THROW(GetQueryResult(uri, columns, results, metaJson), std::out_of_range); +} +} // namespace OHOS::FileAccessFwk \ No newline at end of file -- Gitee From c2f5a79f4471aa1bccc41da50e8f026442af6f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7?= Date: Thu, 4 Sep 2025 20:17:05 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix=20alarm=208=20Signed-off-by:=20?= =?UTF-8?q?=E9=BB=8E=E5=BC=A0=E6=A5=B7=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file_access/include/file_access_helper.h | 6 +- .../file_access/src/file_access_helper.cpp | 37 +- test/unittest/get_query_result_test.cpp | 400 ------------------ 3 files changed, 25 insertions(+), 418 deletions(-) delete mode 100644 test/unittest/get_query_result_test.cpp diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index 2731c05d..806f9197 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -68,6 +68,8 @@ public: const std::vector &wants); static bool IsFilePathValid(const std::string &filePath); + bool ConvertToLongLong(const std::string &str, long long& value); + bool Release(); int Access(Uri &uri, bool &isExist); int OpenFile(Uri &uri, const int flags, int &fd); @@ -90,6 +92,8 @@ public: int UnregisterNotify(Uri uri); int MoveItem(Uri &sourceFile, Uri &targetParent, std::vector &moveResult, bool force); int MoveFile(Uri &sourceFile, Uri &targetParent, std::string &fileName, Uri &newFile); + int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, + std::string &metaJson); private: sptr GetProxyByUri(Uri &uri); sptr GetProxyByBundleName(const std::string &bundleName); @@ -110,7 +114,7 @@ private: int CopyOperation(Uri &sourceUri, Uri &destUri, std::vector ©Result, bool force = false); int CopyFileOperation(Uri &sourceUri, Uri &destUri, const std::string &fileName, Uri &newFileUri); int IsDirectory(Uri &uri, bool &isDir); - + sptr token_ = nullptr; std::unordered_map> cMap_; }; diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 251c0671..acb6fca8 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -886,25 +886,28 @@ static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector< return ERR_OK; } -static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, +bool FileAccessHelper::ConvertToLongLong(const std::string &str, long long& value) +{ + char* end; + errno = 0; + value = std::strtoll(str.c_str(), &end, CONVERT_TO_TEN); + if (end == str.c_str()) { + return false; + } + if (errno == ERANGE) { + return false; + } + if (*end != '\0') { + return false; + } + return true; +} + +int FileAccessHelper::GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, std::string &metaJson) { json jsonObject; - auto convertToLongLong = [](const std::string &str, long long& value) -> bool { - char* end; - errno = 0; - value = std::strtoll(str.c_str(), &end, CONVERT_TO_TEN); - if (end == str.c_str()) { - return false; - } - if (errno == ERANGE) { - return false; - } - if (*end != '\0') { - return false; - } - return true; - }; + FileAccessHelper fileAccessHelper(nullptr, {}); for (size_t i = 0; i < columns.size(); i++) { auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); // Assign a default value based on the type, When fileIo obtains an invalid value. @@ -926,7 +929,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s results[i] = "0"; } long long num; - if (convertToLongLong(results[i], num)) { + if (fileAccessHelper.ConvertToLongLong(results[i], num)) { jsonObject[columns[i]] = num; } break; diff --git a/test/unittest/get_query_result_test.cpp b/test/unittest/get_query_result_test.cpp deleted file mode 100644 index 93961051..00000000 --- a/test/unittest/get_query_result_test.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright (c) 2024 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - -#include "file_access_extension_info.h" -#include "file_access_framework_errno.h" - -namespace OHOS::FileAccessFwk { -using namespace std; -using namespace nlohmann; - -// 复现GetQueryResult函数,因为在源文件中是static函数,无法直接访问 -enum ResultType { - STRING_TYPE = 1, - INT32_TYPE, - INT64_TYPE, -}; - -static const std::unordered_map FILE_RESULT_TYPE = { - { DISPLAY_NAME, STRING_TYPE }, - { RELATIVE_PATH, STRING_TYPE }, - { FILE_SIZE, INT64_TYPE }, - { DATE_ADDED, INT64_TYPE }, - { DATE_MODIFIED, INT64_TYPE }, - { WIDTH, INT32_TYPE }, - { HEIGHT, INT32_TYPE }, - { DURATION, INT32_TYPE }, -}; - -static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, - std::string &metaJson) -{ - json jsonObject; - auto convertToLongLong = [](const std::string &str, long long& value) -> bool { - char* end; - errno = 0; - value = std::strtoll(str.c_str(), &end, 10); - if (end == str.c_str()) { - return false; - } - if (errno == ERANGE) { - return false; - } - if (*end != '\0') { - return false; - } - return true; - }; - for (size_t i = 0; i < columns.size(); i++) { - auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); - // Assign a default value based on the type, When fileIo obtains an invalid value. - switch (memberType) { - case STRING_TYPE: - if (results[i].empty()) { - results[i] = " "; - } - jsonObject[columns[i]] = results[i]; - break; - case INT32_TYPE: - if (results[i].empty()) { - results[i] = "0"; - } - jsonObject[columns[i]] = std::atoi(results[i].c_str()); - break; - case INT64_TYPE: - if (results[i].empty()) { - results[i] = "0"; - } - long long num; - if (convertToLongLong(results[i], num)) { - jsonObject[columns[i]] = num; - } - break; - default: - jsonObject[columns[i]] = " "; - break; - } - } - metaJson = jsonObject.dump(); - return ERR_OK; -} - -class GetQueryResultTest : public testing::Test { -public: - static void SetUpTestCase(void); - static void TearDownTestCase(void); - void SetUp(); - void TearDown(); -}; - -void GetQueryResultTest::SetUpTestCase(void) -{ - // setup for all test cases -} - -void GetQueryResultTest::TearDownTestCase(void) -{ - // teardown for all test cases -} - -void GetQueryResultTest::SetUp(void) -{ - // setup for each test case -} - -void GetQueryResultTest::TearDown(void) -{ - // teardown for each test case -} - -/** - * @tc.number: GetQueryResult_STRING_TYPE_EmptyResult_001 - * @tc.name: GetQueryResult_STRING_TYPE_EmptyResult_001 - * @tc.desc: Test GetQueryResult with STRING_TYPE and empty result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_STRING_TYPE_EmptyResult_001, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DISPLAY_NAME}; - vector results = {""}; // Empty string result - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[DISPLAY_NAME], " "); -} - -/** - * @tc.number: GetQueryResult_STRING_TYPE_NonEmptyResult_002 - * @tc.name: GetQueryResult_STRING_TYPE_NonEmptyResult_002 - * @tc.desc: Test GetQueryResult with STRING_TYPE and non-empty result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_STRING_TYPE_NonEmptyResult_002, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {RELATIVE_PATH}; - vector results = {"Documents/test.txt"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[RELATIVE_PATH], "Documents/test.txt"); -} - -/** - * @tc.number: GetQueryResult_INT32_TYPE_EmptyResult_003 - * @tc.name: GetQueryResult_INT32_TYPE_EmptyResult_003 - * @tc.desc: Test GetQueryResult with INT32_TYPE and empty result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_EmptyResult_003, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {WIDTH}; - vector results = {""}; // Empty string result - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[WIDTH], 0); -} - -/** - * @tc.number: GetQueryResult_INT32_TYPE_ValidResult_004 - * @tc.name: GetQueryResult_INT32_TYPE_ValidResult_004 - * @tc.desc: Test GetQueryResult with INT32_TYPE and valid result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_ValidResult_004, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {HEIGHT}; - vector results = {"1080"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[HEIGHT], 1080); -} - -/** - * @tc.number: GetQueryResult_INT32_TYPE_InvalidResult_005 - * @tc.name: GetQueryResult_INT32_TYPE_InvalidResult_005 - * @tc.desc: Test GetQueryResult with INT32_TYPE and invalid result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT32_TYPE_InvalidResult_005, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DURATION}; - vector results = {"invalid"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[DURATION], 0); // atoi("invalid") returns 0 -} - -/** - * @tc.number: GetQueryResult_INT64_TYPE_EmptyResult_006 - * @tc.name: GetQueryResult_INT64_TYPE_EmptyResult_006 - * @tc.desc: Test GetQueryResult with INT64_TYPE and empty result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_EmptyResult_006, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {FILE_SIZE}; - vector results = {""}; // Empty string result - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[FILE_SIZE], 0); -} - -/** - * @tc.number: GetQueryResult_INT64_TYPE_ValidResult_007 - * @tc.name: GetQueryResult_INT64_TYPE_ValidResult_007 - * @tc.desc: Test GetQueryResult with INT64_TYPE and valid result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_ValidResult_007, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DATE_MODIFIED}; - vector results = {"1632456789000"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[DATE_MODIFIED], 1632456789000); -} - -/** - * @tc.number: GetQueryResult_INT64_TYPE_InvalidResult_008 - * @tc.name: GetQueryResult_INT64_TYPE_InvalidResult_008 - * @tc.desc: Test GetQueryResult with INT64_TYPE and invalid result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_InvalidResult_008, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DATE_ADDED}; - vector results = {"invalid123"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - // Should not be assigned due to conversion failure - EXPECT_FALSE(jsonObject[DATE_ADDED].is_number_integer()); -} - -/** - * @tc.number: GetQueryResult_INT64_TYPE_ValidLongLong_009 - * @tc.name: GetQueryResult_INT64_TYPE_ValidLongLong_009 - * @tc.desc: Test GetQueryResult with INT64_TYPE and valid long long result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_ValidLongLong_009, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DATE_ADDED}; - vector results = {"9223372036854775807"}; // Max value for long long - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[DATE_ADDED], 9223372036854775807); -} - -/** - * @tc.number: GetQueryResult_INT64_TYPE_OutOfRange_010 - * @tc.name: GetQueryResult_INT64_TYPE_OutOfRange_010 - * @tc.desc: Test GetQueryResult with INT64_TYPE and out of range result value. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_INT64_TYPE_OutOfRange_010, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {FILE_SIZE}; - vector results = {"9223372036854775808"}; // Value larger than max long long - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - // Should not be assigned due to conversion failure - EXPECT_FALSE(jsonObject[FILE_SIZE].is_number_integer()); -} - -/** - * @tc.number: GetQueryResult_MultipleColumns_011 - * @tc.name: GetQueryResult_MultipleColumns_011 - * @tc.desc: Test GetQueryResult with multiple columns of different types. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_MultipleColumns_011, testing::TestSize::Level1) -{ - string uri = "test_uri"; - vector columns = {DISPLAY_NAME, FILE_SIZE, WIDTH, HEIGHT}; - vector results = {"test.txt", "1024", "1920", "1080"}; - string metaJson; - - int ret = GetQueryResult(uri, columns, results, metaJson); - - EXPECT_EQ(ret, ERR_OK); - json jsonObject = json::parse(metaJson); - EXPECT_EQ(jsonObject[DISPLAY_NAME], "test.txt"); - EXPECT_EQ(jsonObject[FILE_SIZE], 1024); - EXPECT_EQ(jsonObject[WIDTH], 1920); - EXPECT_EQ(jsonObject[HEIGHT], 1080); -} - -/** - * @tc.number: GetQueryResult_DefaultCase_012 - * @tc.name: GetQueryResult_DefaultCase_012 - * @tc.desc: Test GetQueryResult with an unknown column type (default case). - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level: Level1 - */ -HWTEST_F(GetQueryResultTest, GetQueryResult_DefaultCase_012, testing::TestSize::Level1) -{ - // Adding a mock column with an unknown type to trigger the default case - string uri = "test_uri"; - vector columns = {"unknown_column"}; - vector results = {"some_value"}; - string metaJson; - - // Manually add an entry to FILE_RESULT_TYPE with an unknown type - // Since we can't modify FILE_RESULT_TYPE directly, we'll test the default case differently - // We can create a column that doesn't exist in FILE_RESULT_TYPE to trigger an exception - // But since the function uses .at() which throws on missing key, we can't reach the switch default case - - // This test case documents that we cannot reach the default case in the switch statement - // due to the use of .at() which throws an exception before reaching the switch - EXPECT_THROW(GetQueryResult(uri, columns, results, metaJson), std::out_of_range); -} -} // namespace OHOS::FileAccessFwk \ No newline at end of file -- Gitee