diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 0000000..0172d9b --- /dev/null +++ b/BUILD.gn @@ -0,0 +1,148 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//build/lite/config/component/lite_component.gni") + +## Build Contacts_DataAbility.hap +ohos_hap("Contacts_DataAbility") { + hap_profile = "./config.json" + shared_libraries = [ + ":contactsdataability", + ] + certificate_profile = "./signature/contactsdata.p7b" + hap_name = "Contacts_DataAbility" + part_name = "contactsdata_hap" + subsystem_name = "applications" +} + +## Build contactsdataability.so {{{ +config("contactsdataability_public_config") { + visibility = [ ":*" ] + include_dirs = [ + "//third_party/node/src", + "ability/common/include", + "ability/common/utils/include/", + "dataBusiness/voicemail/include", + "dataBusiness/calllog/include", + "dataBusiness/contacts/include", + "ability/account/include", + "dataBusiness/quicksearch/include", + "ability/sinicization/include", + "ability/account/include", + "ability/merge/include", + "ability/datadisasterrecovery/include", + ] + cflags = [ ] +} + +ohos_shared_library("contactsdataability") { + sources = [ + "dataBusiness/calllog/src/calllog_ability.cpp", + "dataBusiness/calllog/src/calllog_database.cpp", + "dataBusiness/voicemail/src/voicemail_ability.cpp", + "dataBusiness/voicemail/src/voicemail_database.cpp", + "dataBusiness/contacts/src/contacts_database.cpp", + "dataBusiness/contacts/src/contacts_account.cpp", + "dataBusiness/contacts/src/contacts_type.cpp", + "dataBusiness/contacts/src/contacts_data_ability.cpp", + "ability/common/utils/src/merge_utils.cpp", + "ability/common/utils/src/uri_utils.cpp", + "ability/common/utils/src/file_utils.cpp", + "ability/common/utils/src/contacts_path.cpp", + "ability/common/utils/src/predicates_convert.cpp", + "ability/merge/src/candidate_status.cpp", + "ability/merge/src/merger_contacts.cpp", + "ability/merge/src/match_candidate.cpp", + "ability/merge/src/candidate.cpp", + "ability/common/utils/src/contacts_json_utils.cpp", + "ability/common/utils/src/contacts_common_event.cpp", + "ability/common/utils/src/sql_analyzer.cpp", + "dataBusiness/contacts/src/contacts_update_helper.cpp", + "dataBusiness/contacts/src/raw_contacts.cpp", + "dataBusiness/contacts/src/contacts.cpp", + "dataBusiness/quicksearch/src/contacts_search.cpp", + "ability/sinicization/src/construction_name.cpp", + "ability/sinicization/src/character_transliterate.cpp", + "ability/common/utils/src/contacts_string_utils.cpp", + "ability/account/src/account_data_collection.cpp", + "ability/account/src/account_sync.cpp", + "ability/account/src/account_manager.cpp", + "dataBusiness/contacts/src/profile_database.cpp", + "ability/datadisasterrecovery/src/database_disaster_recovery.cpp" + ] +include_dirs=[ + "//utils/native/base/include", + "//base/hiviewdfx/hilog/interfaces/native/innerkits/include", + "//third_party/jsoncpp", + "//third_party/jsoncpp/include/json", + "//base/account/os_account/interfaces/innerkits/ohosaccount/native/include/", + "//base/account/os_account/interfaces/kits/napi/distributedaccount/include/", + "//base/account/os_account/interfaces/innerkits/include", + "//foundation/aafwk/standard/interfaces/innerkits/want/include", + "//foundation/appexecfwk/standard/kits/appkit/native/app", + "//foundation/aafwk/standard/interfaces/innerkits/want/include/ohos/aafwk/content", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager/include", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler/include", + "//foundation/aafwk/standard/services/abilitymgr/include", + "//foundation/appexecfwk/standard/common/log/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//foundation/aafwk/standard/frameworks/kits/ability/native/include", + "//base/notification/ces_standard/interfaces/innerkits/native/include/" + ] + +deps = [ + "//foundation/aafwk/standard/frameworks/kits/ability/native:abilitykit_native", + "//foundation/aafwk/standard/frameworks/kits/appkit:appkit_native", + "//utils/native/base:utils", + "//foundation/ace/napi:ace_napi", + "//third_party/jsoncpp:jsoncpp", + "//base/notification/ces_standard/frameworks/core:cesfwk_core", + "//base/notification/ces_standard/frameworks/native:cesfwk_innerkits", + "//base/notification/ces_standard/services:cesfwk_services", + "//foundation/aafwk/standard/interfaces/innerkits/want/:want", + "//foundation/distributedschedule/safwk/interfaces/innerkits/safwk:system_ability_fwk", + "//foundation/aafwk/standard/frameworks/kits/ability/native:dummy_classes", + "//foundation/appexecfwk/standard/common:libappexecfwk_common", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//utils/native/base:utilsbase", + ] + + public_configs = [ ":contactsdataability_public_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:want", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "eventhandler:libeventhandler", + "ipc:ipc_core", + "ces_standard:cesfwk_innerkits", + "native_appdatamgr:native_appdatafwk", + "native_appdatamgr:native_dataability", + "native_appdatamgr:native_preferences", + "native_appdatamgr:native_rdb", + ] + if (is_standard_system) { + external_deps += [ "hiviewdfx_hilog_native:libhilog" ] + } else { + external_deps += [ "hilog:libhilog" ] + } + + public_deps = [] + relative_install_dir = "module" + part_name = "contactsdata_hap" + subsystem_name = "applications" +} +## Build contactsdataability.so }}} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4947287 --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 0000000..850de47 --- /dev/null +++ b/OAT.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.en.md b/README.en.md index 7da05f2..d801960 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,44 @@ -# applications_contactsdata +# applications_contactsdata -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} +- [Introduction](#section1166054159366) +- [Image architecture](#section1619419895966) +- [Directory Structure](#section161941989596) +- [Repositories Involved](#section1371113476307) -#### Software Architecture -Software architecture description +## Introduction -#### Installation +The contact database application is an indispensable management information application for every user to manage the contact database. +Its content is very important for user managers, so the contact database should be able to provide sufficient information and quick +query means for each user's management, which greatly facilitates users to reasonably manage the contact database information. -1. xxxx -2. xxxx -3. xxxx +## Image architecture -#### Instructions +![](figures/Image_architecture.png) -1. xxxx -2. xxxx -3. xxxx +## Directory Structure -#### Contribution +``` +/foundation/contactsdataability/ +├── ability +│   ├── account #Account Management +│   ├── checkpermission #Permission Check +│   ├── common #Public Method +│   ├── datadisasterrecovery #Data Corruption Recovery +│   ├── merge #Contacts Merge +│   └── sinicization #Chinese Characters to Pinyin Related +├── contacts #NAPI +├── dataBusiness +│   ├── calllog #Call Records +│   ├── contacts #Contacts Person +│   ├── quicksearch #Quick Search +│   └── voicemail #Voicemail +├── test #Test Catalog +├── BUILD.gn +└── ohos.build +``` -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request +## Repositories Involved +system applications -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +applications_contactsdata \ No newline at end of file diff --git a/README.md b/README.md index b0466b6..41fb02f 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,521 @@ +# 联系人数据库子系统 # applications_contactsdata -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +- [简介](#section1166054159366) +- [架构图](#section1619419895966) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) -#### 软件架构 -软件架构说明 +## 简介 +联系人数据库应用是每一个用户管理联系人数据库的不可缺少的一个管理信息应用, +它的内容对于用户管理者来说是至关重要的,所以联系人数据库应该能够为每一个 +用户的管理提供充足的信息和快捷查询手段,大大方便用户合理的管理联系人数据库信息。 -#### 安装教程 +## 架构图 -1. xxxx -2. xxxx -3. xxxx +![](figures/Image_architecture.png) -#### 使用说明 +## 目录 -1. xxxx -2. xxxx -3. xxxx +``` +/foundation/contactsdataability/ +├── ability +│   ├── account #账户管理 +│   ├── checkpermission #权限检测 +│   ├── common #公共方法:log,utils等 +│   ├── datadisasterrecovery #数据损坏恢复 +│   ├── merge #联系人合并 +│   └── sinicization #汉字转拼音相关 +├── contacts #NAPI +├── dataBusiness +│   ├── calllog #通话记录 +│   ├── contacts #联系人 +│   ├── quicksearch #快速检索 +│   └── voicemail #语音信箱 +├── test #测试目录 +├── BUILD.gn +└── ohos.build +``` +## 使用说明 -#### 参与贡献 +### 概述 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +提供联系人数据和通话记录以及语音信箱增、删、改、查、等接口。 +接口参数主要有string类型的uri和对象类型的value、DataAbilityPredicates +使用功能接口前,需要导入相关模块。 -#### 特技 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +``` +### 通话记录 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 通话记录插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 通话记录id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 调用insert方法 +DAHelper.insert(calllogUri, value).then((data) => { + console.info("calllogId = " + data); +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(calllogUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(calllogUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` + +#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name", "phone_number"]; +// 调用query方法 +DAHelper.query(calllogUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + var id = resultSet.getInt(resultSet.getColumnIndex("id")); + var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` +返回值为 ResultSet 查询结果集 + +### 语音信箱 + +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 语音信箱插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 语音信箱表id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 调用insert方法 +DAHelper.insert(voicemaiUri, value).then((data) => { + console.info("calllogId = " + data); +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition:DataAbilityPredicates) + +- 接口说明 + + 语音信箱修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(voicemaiUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 语音信箱删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(voicemaiUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` + +#### DAHelper.query(uri: string, resultColumns:array, condition: DataAbilityPredicates) + +- 接口说明 + + 语音信箱查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name", "phone_number"]; +// 调用query方法 +DAHelper.query(voicemaiUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + var id = resultSet.getInt(resultSet.getColumnIndex("id")); + var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` + +### 联系人 + +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 联系人插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 联系人数据表id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +var value = {"display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 调用insert方法 +DAHelper.insert(rawContactUri, value).then((rawContactId) => { + console.info("rawContactId = " + rawContactId); + // 联系人详细信息插入 + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xxxxxxx" + }; + DAHelper.insert(contactDataUri, contactDataValues).then((contactDataId) => { + console.info("rawContactId = " + contactDataId); + }; +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +var value = {"display_name" : "xxx"}; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(rawContactUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(contactDataUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` +#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +// 获取DAHelper +var DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name"]; +// 调用query方法 +DAHelper.query(rawContactUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` +| 系统公共uri | +| --------------------------------------------------------- | +| dataability:///com.ohos.contactsdataability | +| dataability:///com.ohos.contactsdataability/contacts/contact | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/contact_data | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/query_merge_list| +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/split_contact | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/manual_merge | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_merge | +| dataability:///com.ohos.contactsdataability/contacts/contact_type | +| dataability:///com.ohos.contactsdataability/contacts/groups | +| dataability:///com.ohos.contactsdataability/contacts/photo_files | +| dataability:///com.ohos.contactsdataability/contacts/contact_blocklist | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/search_contact | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact_record | +| dataability:///com.ohos.contactsdataability/contacts/backup | +| dataability:///com.ohos.contactsdataability/contacts/recover | +| dataability:///com.ohos.contactsdataability/profile/contact | +| dataability:///com.ohos.contactsdataability/profile/raw_contact | +| dataability:///com.ohos.contactsdataability/profile/contact_data | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/query_merge_list | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/split_contact | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/manual_merge | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/auto_merge | +| dataability:///com.ohos.contactsdataability/profile/contact_type | +| dataability:///com.ohos.contactsdataability/profile/groups | +| dataability:///com.ohos.contactsdataability/profile/photo_files | +| dataability:///com.ohos.contactsdataability/profile/contact_blocklist | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/profile/search_contact | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact_record | +| dataability:///com.ohos.contactsdataability/profile/backup | +| dataability:///com.ohos.contactsdataability/profile/recover | +| dataability:///com.ohos.calllogability | +| dataability:///com.ohos.calllogability/calls/calllog | +| dataability:///com.ohos.voicemailability | +| dataability:///com.ohos.voicemailability/calls/voicemail | +## 相关仓 + +系统应用 + +applications_contactsdata \ No newline at end of file diff --git a/ability/account/.gitignore b/ability/account/.gitignore new file mode 100644 index 0000000..0e9778b --- /dev/null +++ b/ability/account/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +.. +# Except this file +!.gitignore \ No newline at end of file diff --git a/ability/account/include/account_change_event.h b/ability/account/include/account_change_event.h new file mode 100644 index 0000000..7933a6a --- /dev/null +++ b/ability/account/include/account_change_event.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef ACCOUNT_CHANGE_EVENT_H +#define ACCOUNT_CHANGE_EVENT_H + +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace Contacts { +class AccountChangeEvent : public OHOS::EventFwk::CommonEventSubscriber { +public: + ~AccountChangeEvent(); + AccountChangeEvent(const OHOS::EventFwk::CommonEventSubscribeInfo &sp); + void OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data) override; +private: + const static std::string SPLIT_SYMBOL_VERTICAL = "||"; + const static std::string SPLIT_SYMBOL_COMMA = ","; +}; +} // namespace Contacts +} // namespace OHOS +#endif // ACCOUNT_CHANGE_EVENT_H diff --git a/ability/account/include/account_data_collection.h b/ability/account/include/account_data_collection.h new file mode 100644 index 0000000..b356bf9 --- /dev/null +++ b/ability/account/include/account_data_collection.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef ACCOUNT_DATA_COLLECTION_H +#define ACCOUNT_DATA_COLLECTION_H + +#include + +#include "account_info.h" + +namespace OHOS { +namespace Contacts { +class AccountDataCollection { +public: + AccountDataCollection(); + ~AccountDataCollection(); + AccountDataCollection(std::string accountName, std::string accountType, std::string dataColletion); + // Judge whether local account + bool IsDefualtAccount(); + // Judge whether the system account + bool ContainSysAccounts(std::vector sysAccounts); + std::string GetcAccountName(); + std::string GetcAccountType(); + std::string GetcDataCollection(); + +private: + std::string cAccountName_; + std::string cAccountType_; + std::string cDataCollection_; +}; +} // namespace Contacts +} // namespace OHOS + +#endif // ACCOUNT_DATA_COLLECTION_H diff --git a/ability/account/include/account_event_manager.h b/ability/account/include/account_event_manager.h new file mode 100644 index 0000000..a31a5fb --- /dev/null +++ b/ability/account/include/account_event_manager.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef ACCOUNT_EVENT_MANAGER_H +#define ACCOUNT_EVENT_MANAGER_H + +#include + +namespace OHOS { +namespace Contacts { +class AccountEventManager { +public: + static std::shared_ptr GetInstance(); + ~AccountEventManager(); + void PublishEvent(std::string data); + void SubscriberAccountEvent(); + +private: + static std::shared_ptr instance_; + const static std::string EVENT; + AccountEventManager(); +}; +} // namespace Contacts +} // namespace OHOS +#endif // ACCOUNT_EVENT_MANAGER_H diff --git a/ability/account/include/account_manager.h b/ability/account/include/account_manager.h new file mode 100644 index 0000000..cbcf17f --- /dev/null +++ b/ability/account/include/account_manager.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef ACCOUNT_MANAGER_H +#define ACCOUNT_MANAGER_H + +namespace OHOS { +namespace Contacts { +class AccountManager { +public: + AccountManager(); + ~AccountManager(); + int GetAccount(); +}; +} // namespace Contacts +} // namespace OHOS +#endif // ACCOUNT_MANAGER_H diff --git a/ability/account/include/account_sync.h b/ability/account/include/account_sync.h new file mode 100644 index 0000000..9a7bc6a --- /dev/null +++ b/ability/account/include/account_sync.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef ACCOUNT_SYNC_H +#define ACCOUNT_SYNC_H + +#include + +#include "account_info.h" + +#include "account_data_collection.h" +#include "contacts_database.h" +#include "profile_database.h" + +namespace OHOS { +namespace Contacts { +class AccountSync { +public: + ~AccountSync(); + static std::shared_ptr GetInstance(); + static std::shared_ptr contactsDataBase_; + static std::shared_ptr profileDataBase_; + // Update account synchronously + void SyncUpdateAccount(std::vector sysAccounts, bool isProfile); + +private: + AccountSync(); + static std::shared_ptr instance_; + int ClearData(std::shared_ptr store, int accountId); + void getShouldUpdateAndAddAccounts(std::vector systemAccounts, + std::vector localAccounts, + std::vector &shouldUpdateAccounts, + std::vector &shouldAddAccounts); +}; +} // namespace Contacts +} // namespace OHOS + +#endif // ACCOUNT_SYNC_H \ No newline at end of file diff --git a/ability/account/src/account_change_event.cpp b/ability/account/src/account_change_event.cpp new file mode 100644 index 0000000..e8629ae --- /dev/null +++ b/ability/account/src/account_change_event.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 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 "account_change_event.h" + +#include "account_sync.h" +#include "common.h" +#include "contacts_string_utils.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +AccountChangeEvent::AccountChangeEvent(const OHOS::EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) +{ +} + +AccountChangeEvent::~AccountChangeEvent() +{ +} + +void AccountChangeEvent::OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data) +{ + std::shared_ptr accountSync = AccountSync::GetInstance(); + std::vector sysAccounts; + std::vector accountObjVec = ContactsStringUtils::SplitStr(data.GetData(), SPLIT_SYMBOL_VERTICAL); + for (size_t i = 0; i < accountObjVec.size(); i++) { + std::vector accountObj = ContactsStringUtils::SplitStr(accountObjVec[i], SPLIT_SYMBOL_COMMA); + OHOS::AccountSA::OhosAccountInfo var; + var.name_ = accountObj[0]; + var.uid_ = accountObj[1]; + sysAccounts.push_back(var); + } + accountSync->SyncUpdateAccount(sysAccounts, true); + HILOG_INFO("AccountChangeEvent OnReceiveEvent update profile successful"); + accountSync->SyncUpdateAccount(sysAccounts, false); + HILOG_INFO("AccountChangeEvent OnReceiveEvent update local successful"); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/account/src/account_data_collection.cpp b/ability/account/src/account_data_collection.cpp new file mode 100644 index 0000000..c1cf2fd --- /dev/null +++ b/ability/account/src/account_data_collection.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 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 "account_data_collection.h" + +#include + +#include "contacts_columns.h" + +namespace OHOS { +namespace Contacts { +AccountDataCollection::AccountDataCollection(void) +{ +} + +AccountDataCollection::~AccountDataCollection() +{ +} + +AccountDataCollection::AccountDataCollection( + std::string accountName, std::string accountType, std::string dataCollection) +{ + this->cAccountName_ = accountName; + this->cAccountType_ = accountType; + this->cDataCollection_ = dataCollection; +} + +std::string AccountDataCollection::GetcAccountName() +{ + return this->cAccountName_; +} + +std::string AccountDataCollection::GetcAccountType() +{ + return this->cAccountType_; +} + +std::string AccountDataCollection::GetcDataCollection() +{ + return this->cDataCollection_; +} + +bool AccountDataCollection::IsDefualtAccount() +{ + return AccountData::ACCOUNT_NAME == this->cAccountName_ && AccountData::ACCOUNT_TYPE == this->cAccountType_; +} + +bool AccountDataCollection::ContainSysAccounts(std::vector sysAccounts) +{ + for (auto iter = sysAccounts.begin(); iter != sysAccounts.end(); ++iter) { + if (iter->name_ == this->cAccountName_ && iter->uid_ == this->cAccountType_) { + return true; + } + } + return false; +} +} // namespace Contacts +} // namespace OHOS diff --git a/ability/account/src/account_event_manager.cpp b/ability/account/src/account_event_manager.cpp new file mode 100644 index 0000000..1884068 --- /dev/null +++ b/ability/account/src/account_event_manager.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021 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 "account_event_manager.h" + +#include + +#include "common_event_manager.h" +#include "want.h" + +#include "account_change_event.h" + +namespace OHOS { +namespace Contacts { +namespace { +std::mutex g_mtx; +} +const std::string AccountEventManager::EVENT = "com.test.account.change.event"; +std::shared_ptr AccountEventManager::instance_ = nullptr; + +AccountEventManager::AccountEventManager(void) +{ +} + +AccountEventManager::~AccountEventManager() +{ +} + +std::shared_ptr AccountEventManager::GetInstance() +{ + if (instance_ == nullptr) { + instance_.reset(new AccountEventManager()); + } + return instance_; +} + +void AccountEventManager::PublishEvent(std::string data) +{ + // make a want + OHOS::AAFwk::Want want; + want.SetAction(EVENT); + // make common event + OHOS::EventFwk::CommonEventData event; + event.SetWant(want); + event.SetData(data); + + // lock the mutex + g_mtx.lock(); + // publish a common event + OHOS::EventFwk::CommonEventManager::PublishCommonEvent(event); + g_mtx.unlock(); +} + +void AccountEventManager::SubscriberAccountEvent() +{ + OHOS::EventFwk::MatchingSkills matchingSkills; + matchingSkills.AddEvent(EVENT); + OHOS::EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); + std::shared_ptr subscriber = std::make_shared(subscriberInfo); + OHOS::EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/account/src/account_manager.cpp b/ability/account/src/account_manager.cpp new file mode 100644 index 0000000..ad2cd70 --- /dev/null +++ b/ability/account/src/account_manager.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 "account_manager.h" + +#include "contacts_account.h" +#include "contacts_columns.h" +#include "contacts_database.h" + +namespace OHOS { +namespace Contacts { +AccountManager::AccountManager(void) +{ +} + +AccountManager::~AccountManager() +{ +} + +int AccountManager::GetAccount() +{ + // query accountId + std::shared_ptr contactsAccount = ContactsAccount::GetInstance(); + int accountId = contactsAccount->LookupAccountTypeId( + ContactsDataBase::store_, AccountData::ACCOUNT_NAME, AccountData::ACCOUNT_TYPE); + return accountId; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/account/src/account_sync.cpp b/ability/account/src/account_sync.cpp new file mode 100644 index 0000000..232349c --- /dev/null +++ b/ability/account/src/account_sync.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2021 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 "account_sync.h" + +#include + +#include "common.h" +#include "contacts.h" +#include "contacts_account.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "contacts_string_utils.h" +#include "hilog_wrapper.h" +#include "raw_contacts.h" + +namespace OHOS { +namespace Contacts { +namespace { +std::mutex g_mtx; +} +std::shared_ptr AccountSync::contactsDataBase_ = nullptr; +std::shared_ptr AccountSync::profileDataBase_ = nullptr; +std::shared_ptr AccountSync::instance_ = nullptr; +std::shared_ptr g_contactsAccount = nullptr; + +std::shared_ptr AccountSync::GetInstance() +{ + if (instance_ == nullptr) { + instance_.reset(new AccountSync()); + } + return instance_; +} + +AccountSync::AccountSync() +{ + contactsDataBase_ = ContactsDataBase::GetInstance(); + g_contactsAccount = ContactsAccount::GetInstance(); + profileDataBase_ = ProfileDatabase::GetInstance(); +} + +AccountSync::~AccountSync() +{ +} + +void AccountSync::getShouldUpdateAndAddAccounts(std::vector systemAccounts, + std::vector localAccounts, + std::vector &shouldUpdateAccounts, + std::vector &shouldAddAccounts) +{ + for (size_t i = 0; i < systemAccounts.size(); i++) { + for (size_t j = 0; j < localAccounts.size(); j++) { + if (systemAccounts[i].uid_ == localAccounts[j].GetcAccountType() && + systemAccounts[i].uid_ == localAccounts[j].GetcAccountType()) { + break; + } + if (j == localAccounts.size() - 1) { + shouldAddAccounts.push_back(systemAccounts[i]); + } + } + } +} + +void AccountSync::SyncUpdateAccount(std::vector sysAccounts, bool isProfile) +{ + g_mtx.lock(); + if (sysAccounts.empty()) { + HILOG_ERROR("AccountSync::SyncUpdateAccount sysAccounts is null"); + return; + } + std::shared_ptr store = nullptr; + if (isProfile) { + store = profileDataBase_->store_; + HILOG_INFO("AccountSync::SyncUpdateAccount this is profileDataBase_ operation"); + } else { + store = contactsDataBase_->contactStore_; + HILOG_INFO("AccountSync::SyncUpdateAccount this is contactsDataBase_ operation"); + } + if (store == nullptr) { + HILOG_ERROR("SyncUpdateAccount isProfile values is %{public}d this database store ponit is null", isProfile); + return; + } + std::vector accounts = g_contactsAccount->GetAccountFromLoacl(store); + std::vector notInSysAccounts; + std::vector needAddAccount; + for (size_t i = 0; i < accounts.size(); i++) { + auto iter = accounts[i]; + // if account is not default and not in sysAccounts then this should remove + if (!iter.IsDefualtAccount() && !iter.ContainSysAccounts(sysAccounts)) { + notInSysAccounts.push_back(iter); + } + } + HILOG_INFO("SyncUpdateAccount getNotExistAccount notInSysAccounts size is :%{public}d", notInSysAccounts.size()); + std::vector shouldUpdateAccounts; + std::vector shouldAddAccounts; + getShouldUpdateAndAddAccounts(sysAccounts, accounts, shouldUpdateAccounts, shouldAddAccounts); + HILOG_INFO("SyncUpdateAccount:%{public}d, :%{public}d", shouldUpdateAccounts.size(), shouldAddAccounts.size()); + store->BeginTransaction(); + if (!notInSysAccounts.empty()) { + g_contactsAccount->StopForegin(store); + store->Commit(); + for (size_t i = 0; i < notInSysAccounts.size(); i++) { + int accountId = g_contactsAccount->GetNotExistAccount(store, notInSysAccounts[i]); + HILOG_INFO("SyncUpdateAccount getNotExistAccount value is :%{public}d", accountId); + ClearData(store, accountId); + } + } + for (size_t i = 0; i < shouldAddAccounts.size(); i++) { + g_contactsAccount->Insert(store, shouldAddAccounts[i].name_, shouldAddAccounts[i].uid_); + store->Commit(); + } + g_contactsAccount->OpenForegin(store); + store->Commit(); + g_mtx.unlock(); +} + +int AccountSync::ClearData(std::shared_ptr store, int accountId) +{ + RawContacts contactsRawContact; + Contacts contactsContact; + if (accountId > ID_EMPTITY) { + int needDeleteRawContactId = contactsRawContact.GetDeleteRawContactIdByAccountId(store, accountId); + HILOG_INFO("GetDeleteRawContactIdByAccountId successfuly , needDeleteRawContactId is %{public}d", + needDeleteRawContactId); + int needDeleteContactId = contactsRawContact.GetDeleteContactIdByAccountId(store, accountId); + HILOG_INFO("GetDeleteContactIdByAccountId successfuly needDeleteContactId is %{public}d", needDeleteContactId); + g_contactsAccount->DeleteDataByRawId(store, needDeleteRawContactId); + int ret = store->Commit(); + HILOG_INFO("DeleteDataByRawId successfuly commit ret %{public}d", ret); + contactsRawContact.DeleteRawcontactByRawId(store, needDeleteRawContactId); + ret = store->Commit(); + HILOG_INFO("DeleteRawcontactByRawId successfuly commit ret %{public}d", ret); + contactsContact.DeleteContactById(store, needDeleteContactId); + ret = store->Commit(); + HILOG_INFO("DeletecontactsById successfuly commit ret %{public}d", ret); + g_contactsAccount->DeleteGroupsByAccountId(store, accountId); + ret = store->Commit(); + HILOG_INFO("DeleteGroupsByAccountId successfuly commit ret %{public}d", ret); + g_contactsAccount->DeleteAccountByAccountId(store, accountId); + ret = store->Commit(); + HILOG_INFO("DeleteAccountByAccountId successfuly commit ret %{public}d", ret); + } + return RDB_EXECUTE_OK; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/checkpermission/.gitignore b/ability/checkpermission/.gitignore new file mode 100644 index 0000000..86d0cb2 --- /dev/null +++ b/ability/checkpermission/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/ability/common/include/common.h b/ability/common/include/common.h new file mode 100644 index 0000000..9fdfb14 --- /dev/null +++ b/ability/common/include/common.h @@ -0,0 +1,892 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef COMMON_H +#define COMMON_H + +#include + +#include "contacts_path.h" + +namespace OHOS { +namespace Contacts { +// error code +constexpr int RDB_EXECUTE_OK = 0; +constexpr int RDB_EXECUTE_FAIL = -1; +constexpr int OPERATION_ERROR = -1; +constexpr int OPERATION_OK = 0; +constexpr int RDB_OBJECT_EMPTY = -1; +constexpr int PARAMETER_EMPTY = -1; + +constexpr int DELETE_MARK = 1; +constexpr int ID_EMPTITY = 0; +constexpr int BATCH_INSERT_COUNT = 40; + +// ResultSet get Num +constexpr int RESEULT_GET_ONE = 1; +constexpr int RESEULT_GET_TWO = 2; + +// contact table has Judge +constexpr int HAS_NAME = 1; +constexpr int HAS_PHONE = 2; +constexpr int HAS_EMAIL = 3; +constexpr int HAS_GROUP = 4; + +// Contacts DataBase Code +constexpr int CONTACTS_CONTACT = 10000; +constexpr int CONTACTS_RAW_CONTACT = 10001; +constexpr int CONTACTS_CONTACT_DATA = 10002; +constexpr int CONTACTS_CONTACT_TYPE = 10003; +constexpr int CONTACTS_DELETED_RAW_CONTACT = 10004; +constexpr int CONTACTS_GROUPS = 10005; +constexpr int CONTACTS_ACCOUNT = 10006; +constexpr int CONTACTS_BLOCKLIST = 10007; +constexpr int CONTACTS_SEARCH_CONTACT = 10008; +constexpr int CONTACTS_SYNC_STATUS = 10009; +constexpr int CONTACTS_PHOTO_FILES = 100010; +constexpr int CONTACTS_LOCAL_LANG = 10011; +constexpr int CONTACTS_DATABASE_BACKUP_TASK = 10012; +constexpr int CONTACTS_DELETE = 10013; +constexpr int QUERY_MERGE_LIST = 10014; +constexpr int SPLIT_CONTACT = 10015; +constexpr int MANUAL_MERGE = 10016; +constexpr int AUTO_MERGE = 10017; +constexpr int CONTACTS_DELETE_RECORD = 10018; +constexpr int CONTACT_TYPE = 10019; +constexpr int CONTACT_BACKUP = 10020; +constexpr int CONTACT_RECOVER = 10021; + +constexpr int ACCOUNT = 10020; +constexpr int CALLLOG = 20000; +constexpr int VOICEMAIL = 20001; +constexpr int REPLAYING = 20002; + +// PROFILE DATABASE CODE +constexpr int PROFILE_CONTACT = 30000; +constexpr int PROFILE_RAW_CONTACT = 30001; +constexpr int PROFILE_CONTACT_DATA = 30002; +constexpr int PROFILE_CONTACT_TYPE = 30003; +constexpr int PROFILE_DELETED_RAW_CONTACT = 30004; +constexpr int PROFILE_GROUPS = 30005; +constexpr int PROFILE_ACCOUNT = 30006; +constexpr int PROFILE_BLOCKLIST = 30007; +constexpr int PROFILE_SEARCH_CONTACT = 30008; +constexpr int PROFILE_SYNC_STATUS = 30009; +constexpr int PROFILE_PHOTO_FILES = 300010; +constexpr int PROFILE_LOCAL_LANG = 30011; +constexpr int PROFILE_DATABASE_BACKUP_TASK = 30012; +constexpr int PROFILE_DELETE_RECORD = 30013; +constexpr int PROFILE_TYPE = 30014; +constexpr int PROFILE_DELETE = 30015; +constexpr int PROFILE_BACKUP = 30016; +constexpr int PROFILE_RECOVER = 30017; + +// DATABASE OPEN VERSION +constexpr int DATABASE_OPEN_VERSION = 1; + +// DATABASE NEW VERSION +constexpr int DATABASE_NEW_VERSION = 2; + +// REQUEST PARAMS ARGS NUM +constexpr int REQUEST_PARAMS_NUM = 2; + +constexpr const char *PROFILE_DATABASE_NAME = "profile"; +constexpr const char *CONTACT_DATABASE_NAME = "contacts"; + +// Rebase +constexpr int REBASE_SETTING = 0; +constexpr int REBASE_COUNT = 5; + +// MergeMode Number +constexpr int MERGE_MODE_DEFAULT = 0; +constexpr int MERGE_MODE_MANUAL = 1; +constexpr int MERGE_MODE_AUTO = 2; + +// Uri +constexpr const char *CONTACT_URI = "dataability:///com.ohos.contactsdataability"; +constexpr const char *VOICEMAIL_URI = "dataability:///com.ohos.voicemailability"; +constexpr const char *CALL_LOG_URI = "dataability:///com.ohos.calllogability"; + +constexpr const char *CREATE_CALLLOG = + "CREATE TABLE IF NOT EXISTS [calllog](" + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[phone_number] TEXT, " + "[display_name] TEXT, " + "[call_direction] INTEGER NOT NULL DEFAULT 0, " + "[voicemail_uri] TEXT, " + "[sim_type] INTEGER , " + "[is_hd] INTEGER , " + "[is_read] INTEGER NOT NULL DEFAULT 0, " + "[ring_duration] INTEGER NOT NULL DEFAULT 0, " + "[talk_duration] INTEGER NOT NULL DEFAULT 0, " + "[format_number] TEXT, " + "[quicksearch_key] TEXT, " + "[number_type] INTEGER, " + "[number_type_name] TEXT, " + "[begin_time] INTEGER NOT NULL DEFAULT 0, " + "[end_time] INTEGER NOT NULL DEFAULT 0, " + "[answer_state] INTEGER , " + "[create_time] INTEGER, " + "[number_location] TEXT, " + "[photo_id] INTEGER, " + "[photo_uri] TEXT, " + "[country_iso_code] INTEGER, " + "[extra1] TEXT, " + "[extra2] TEXT, " + "[extra3] TEXT, " + "[extra4] TEXT, " + "[extra5] TEXT, " + "[extra6] TEXT)"; + +constexpr const char *CREATE_VOICEMAIL = + "CREATE TABLE IF NOT EXISTS [voicemail](" + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[phone_number] TEXT, " + "[quicksearch_key] TEXT, " + "[display_name] TEXT, " + "[voicemail_uri] TEXT, " + "[voicemail_type] INTEGER NOT NULL DEFAULT 0, " + "[voice_file_size] INTEGER NOT NULL DEFAULT 0, " + "[voice_duration] INTEGER NOT NULL DEFAULT 0, " + "[voice_status] INTEGER NOT NULL DEFAULT 0, " + "[origin_type] TEXT, " + "[create_time] INTEGER);"; + +constexpr const char *CREATE_REPLYING = + "CREATE TABLE [replying](" + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[name] TEXT, " + "[replying_uri] TEXT, " + "[replying_path] TEXT, " + "[phone_account_id] TEXT, " + "[has_content] NOT NULL DEFAULT 0, " + "[duration] INTEGER NOT NULL DEFAULT 0, " + "[content_type] TEXT, " + "[last_modified] INTEGER NOT NULL DEFAULT 0, " + "[synced] INTEGER NOT NULL DEFAULT 0 );"; + +constexpr const char *CREATE_CONTACT = + "CREATE TABLE IF NOT EXISTS [contact](" + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[name_raw_contact_id] INTEGER REFERENCES raw_contact(id), " + "[photo_id] INTEGER, " + "[photo_file_id] INTEGER REFERENCES [photo_files]([id]), " + "[personal_ringtone] TEXT, " + "[is_transfer_voicemail] INTEGER NOT NULL DEFAULT 0, " + "[company] TEXT, " + "[position] TEXT, " + "[quick_search_key] TEXT, " + "[read_only] INTEGER NOT NULL DEFAULT 0, " + "[personal_notification_ringtone] TEXT, " + "[has_phone_number] INTEGER NOT NULL DEFAULT 0, " + "[has_display_name] INTEGER NOT NULL DEFAULT 0, " + "[has_email] INTEGER NOT NULL DEFAULT 0, " + "[has_group] INTEGER NOT NULL DEFAULT 0)"; + +constexpr const char *CREATE_CONTACT_INDEX = + "CREATE INDEX IF NOT EXISTS [contact_name_raw_contact_id_index] " + "ON [contact] ([name_raw_contact_id])"; + +constexpr const char *CREATE_RAW_CONTACT = + "CREATE TABLE IF NOT EXISTS [raw_contact]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[contact_id] INTEGER REFERENCES [contact]([id]), " + "[photo_id] INTEGER, " + "[photo_file_id] INTEGER REFERENCES [photo_files]([id]), " + "[is_transfer_voicemail] INTEGER NOT NULL DEFAULT 0, " + "[personal_ringtone] TEXT, " + "[is_deleted] INTEGER NOT NULL DEFAULT 0, " + "[personal_notification_ringtone] TEXT, " + "[photo_first_name] TEXT, " + "[account_id] INTEGER, " + "[version] INTEGER NOT NULL DEFAULT 0, " + "[display_name] TEXT, " + "[sort] TEXT, " + "[contacted_count] INTEGER NOT NULL DEFAULT 0, " + "[lastest_contacted_time] INTEGER NOT NULL DEFAULT 0, " + "[favorite] INTEGER NOT NULL DEFAULT 0, " + "[favorite_order] TEXT, " + "[phonetic_name] TEXT, " + "[phonetic_name_type] INTEGER , " + "[company] TEXT, " + "[position] TEXT, " + "[read_only] INTEGER NOT NULL DEFAULT 0, " + "[sort_first_letter] TEXT, " + "[merge_mode] INTEGER NOT NULL DEFAULT 0, " + "[is_need_merge] INTEGER NOT NULL DEFAULT 1, " + "[merge_status] INTEGER NOT NULL DEFAULT 1, " + "[is_merge_target] INTEGER NOT NULL DEFAULT 0, " + "[vibration_setting] INTEGER NOT NULL DEFAULT 0, " + "[sync_id] INTEGER, " + "[syn_1] TEXT, " + "[syn_2] TEXT, " + "[syn_3] TEXT)"; + +constexpr const char *CREATE_CONTACT_DATA = + "CREATE TABLE IF NOT EXISTS [contact_data]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[type_id] INTEGER REFERENCES [contact_type]([id]), " + "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " + "[read_only] INTEGER NOT NULL DEFAULT 0, " + "[version] INTEGER NOT NULL DEFAULT 0, " + "[is_preferred_number] INTEGER NOT NULL DEFAULT 0, " + "[detail_info] TEXT, " + "[family_name] TEXT, " + "[middle_name_phonetic] TEXT, " + "[given_name] TEXT, " + "[given_name_phonetic] TEXT, " + "[alias_detail_info] TEXT, " + "[phonetic_name] TEXT, " + "[position] TEXT, " + "[extend1] TEXT, " + "[extend2] TEXT, " + "[extend3] TEXT, " + "[extend4] TEXT, " + "[city] TEXT, " + "[country] TEXT, " + "[neighborhood] TEXT, " + "[pobox] TEXT, " + "[postcode] TEXT, " + "[region] TEXT, " + "[street] TEXT, " + "[alpha_name] TEXT, " + "[other_lan_last_name] TEXT, " + "[other_lan_first_name] TEXT, " + "[extend5] TEXT, " + "[lan_style] TEXT, " + "[custom_data] TEXT, " + "[extend6] TEXT, " + "[extend7] TEXT, " + "[blob_data] BLOB, " + "[syn_1] TEXT, " + "[syn_2] TEXT, " + "[syn_3] TEXT)"; +constexpr const char *CREATE_CONTACT_TYPE = + "CREATE TABLE IF NOT EXISTS [contact_type]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[content_type] TEXT )"; + +constexpr const char *CREATE_DELETED_RAW_CONTACT = + "CREATE TABLE IF NOT EXISTS [deleted_raw_contact]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[contact_id] INTEGER REFERENCES [contact]([id])," + "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " + "[delete_source] TEXT, " + "[delete_time] INTEGER NOT NULL DEFAULT 0, " + "[display_name] TEXT, " + "[delete_account] TEXT, " + "[backup_data] TEXT, " + "[delete_date] TEXT, " + "[is_deleted] INTEGER NOT NULL DEFAULT 0)"; + +constexpr const char *CREATE_GROUPS = + "CREATE TABLE IF NOT EXISTS [groups]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[account_id] INTEGER REFERENCES [account]([id]), " + "[group_name] TEXT, " + "[group_notes] TEXT, " + "[is_deleted] INTEGER NOT NULL DEFAULT 0, " + "[group_ringtone] TEXT, " + "[ringtone_modify_time] INTEGER NOT NULL DEFAULT 0, " + "[lastest_modify_time] INTEGER NOT NULL DEFAULT 0)"; + +constexpr const char *CREATE_ACCOUNT = + "CREATE TABLE IF NOT EXISTS [account]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[account_name] TEXT, " + "[account_type] TEXT, " + "[data_info] TEXT)"; + +constexpr const char *CREATE_CONTACT_BLOCKLIST = + "CREATE TABLE IF NOT EXISTS [contact_blocklist]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[types] INTEGER NOT NULL DEFAULT 0, " + "[phone_number] TEXT, " + "[content] TEXT, " + "[time_stamp] INTEGER NOT NULL DEFAULT 0)"; + +constexpr const char *CREATE_SEARCH_CONTACT = + "CREATE TABLE IF NOT EXISTS [search_contact]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[account_id] INTEGER REFERENCES [account]([id]), " + "[contact_id] INTEGER REFERENCES [contact]([id]), " + "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " + "[search_name] TEXT, " + "[display_name] TEXT, " + "[phonetic_name] TEXT, " + "[photo_id] TEXT, " + "[photo_file_id] INTEGER REFERENCES [photo_files]([id]))"; + +constexpr const char *CREATE_PHOTO_FILES = + "CREATE TABLE IF NOT EXISTS [photo_files]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[file_height] INTEGER NOT NULL DEFAULT 0, " + "[file_width] INTEGER NOT NULL DEFAULT 0, " + "[file_size] INTEGER NOT NULL DEFAULT 0)"; + +constexpr const char *CREATE_LOCAL_LANG = + "CREATE TABLE IF NOT EXISTS[local_lang]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[local] TEXT)"; + +constexpr const char *CREATE_DATABASE_BACKUP_TASK = + "CREATE TABLE IF NOT EXISTS[database_backup_task]( " + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[backup_time] TEXT, " + "[backup_path] TEXT, " + "[remarks] TEXT)"; + +constexpr const char *CREATE_INSERT_BACKUP_TIME = + "CREATE TRIGGER [insert_database_backup_task] AFTER INSERT ON [database_backup_task] " + " BEGIN " + " UPDATE " + " [database_backup_task] " + " SET " + " [backup_time] = STRFTIME ('%s', 'now') " + " WHERE " + " [id] = [NEW].[id]; " + " END "; + +constexpr const char *CREATE_CONTACT_INDEX_DATA1 = + "CREATE INDEX IF NOT EXISTS [contact_data_type_contact_data_index] " + "ON [contact_data] ([type_id],[detail_info])"; +constexpr const char *CREATE_CONTACT_INDEX_DATA2 = + "CREATE INDEX IF NOT EXISTS [contact_data_raw_contact_id] " + "ON [contact_data] ([raw_contact_id])"; + +constexpr const char *CREATE_SEARCH_CONTACT_INDEX1 = + "CREATE INDEX IF NOT EXISTS [search_contact_id_index] " + "ON [search_contact] ([contact_id])"; +constexpr const char *CREATE_SEARCH_CONTACT_INDEX2 = + "CREATE INDEX IF NOT EXISTS [search_raw_contact_id_index] " + "ON [search_contact] ([raw_contact_id])"; + +constexpr const char *CREATE_RAW_CONTACT_INDEX = + "CREATE INDEX IF NOT EXISTS [raw_contact_id_index] " + "ON [raw_contact] ([contact_id])"; + +constexpr const char *CREATE_VIEW_CONTACT = + "CREATE VIEW IF NOT EXISTS[view_contact] AS SELECT " + "[contact].[id] AS [id], " + "[contact].[photo_id] AS [photo_id], " + "[contact].[photo_file_id] AS [photo_file_id], " + "[contact].[quick_search_key] AS [quick_search_key], " + "[contact].[has_phone_number] AS [has_phone_number], " + "[contact].[has_display_name] AS [has_display_name], " + "[contact].[has_email] AS [has_email], " + "[contact].[has_group] AS [has_group], " + "[name_raw_contact_id], " + "[name_raw_contact].[account_id] AS [account_id], " + "[name_raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " + "[name_raw_contact].[personal_ringtone] AS [personal_ringtone], " + "[name_raw_contact].[is_deleted] AS [is_deleted], " + "[name_raw_contact].[photo_first_name] AS [photo_first_name], " + "[name_raw_contact].[version] AS [version], " + "[name_raw_contact].[display_name] AS [display_name], " + "[name_raw_contact].[sort] AS [sort], " + "[name_raw_contact].[contacted_count] AS [contacted_count], " + "[name_raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " + "[name_raw_contact].[favorite] AS [favorite], " + "[name_raw_contact].[favorite_order] AS [favorite_order], " + "[name_raw_contact].[phonetic_name] AS [phonetic_name], " + "[name_raw_contact].[phonetic_name_type] AS [phonetic_name_type], " + "[name_raw_contact].[company] AS [company], " + "[name_raw_contact].[position] AS [position], " + "[name_raw_contact].[read_only] AS [read_only], " + "[name_raw_contact].[sort_first_letter] AS [sort_first_letter], " + "[name_raw_contact].[merge_mode] AS [merge_mode], " + "[name_raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " + "[name_raw_contact].[is_need_merge] AS [is_need_merge], " + "[name_raw_contact].[merge_status] AS [merge_status], " + "[name_raw_contact].[is_merge_target] AS [is_merge_target], " + "[name_raw_contact].[vibration_setting] AS [vibration_setting], " + "[name_raw_contact].[sync_id] AS [sync_id], " + "[name_raw_contact].[syn_1] AS [syn_1], " + "[name_raw_contact].[syn_2] AS [syn_2], " + "[name_raw_contact].[syn_3] AS [syn_3], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type], " + "[photo_files].[file_size] AS [file_size], " + "[photo_files].[file_height] AS [file_height], " + "[photo_files].[file_width] AS [file_width] " + "FROM [contact] " + "JOIN [raw_contact] AS [name_raw_contact] " + "ON ([name_raw_contact_id] = [name_raw_contact].[id]) " + "LEFT JOIN [account] ON " + "([name_raw_contact].[account_id] = [account].[id]) " + "LEFT JOIN [photo_files] ON " + "([photo_files].[id] = [contact].[photo_file_id])"; + +constexpr const char *CREATE_VIEW_RAW_CONTACT = + "CREATE VIEW IF NOT EXISTS [view_raw_contact] AS SELECT " + "[contact_id], " + "[raw_contact].[id] AS [id], " + "[raw_contact].[account_id] AS [account_id], " + "[raw_contact].[photo_id] AS [photo_id], " + "[raw_contact].[photo_file_id] AS [photo_file_id], " + "[raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " + "[raw_contact].[personal_ringtone] AS [personal_ringtone], " + "[raw_contact].[is_deleted] AS [is_deleted], " + "[raw_contact].[photo_first_name] AS [photo_first_name], " + "[raw_contact].[version] AS [version], " + "[raw_contact].[display_name] AS [display_name], " + "[raw_contact].[sort] AS [sort], " + "[raw_contact].[contacted_count] AS [contacted_count], " + "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " + "[raw_contact].[favorite] AS [favorite], " + "[raw_contact].[favorite_order] AS [favorite_order], " + "[raw_contact].[phonetic_name] AS [phonetic_name], " + "[raw_contact].[phonetic_name_type] AS [phonetic_name_type], " + "[raw_contact].[company] AS [company], " + "[raw_contact].[position] AS [position], " + "[raw_contact].[read_only] AS [read_only], " + "[raw_contact].[sort_first_letter] AS [sort_first_letter], " + "[raw_contact].[merge_mode] AS [merge_mode], " + "[raw_contact].[is_need_merge] AS [is_need_merge], " + "[raw_contact].[merge_status] AS [merge_status], " + "[raw_contact].[is_merge_target] AS [is_merge_target], " + "[raw_contact].[vibration_setting] AS [vibration_setting], " + "[raw_contact].[sync_id] AS [sync_id], " + "[raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " + "[raw_contact].[syn_1] AS [syn_1], " + "[raw_contact].[syn_2] AS [syn_2], " + "[raw_contact].[syn_3] AS [syn_3], " + "[photo_files].[file_size] AS [file_size], " + "[photo_files].[file_height] AS [file_height], " + "[photo_files].[file_width] AS [file_width], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type] " + "FROM [raw_contact] " + "LEFT JOIN [account] ON " + "([raw_contact].[account_id] = [account].[id]) " + "LEFT JOIN [photo_files] ON " + "([photo_files].[id] = [photo_file_id])"; + +constexpr const char *CREATE_VIEW_CONTACT_DATA = + "CREATE VIEW IF NOT EXISTS [view_contact_data] AS SELECT " + "[contact_data].[id] AS [id], " + "[contact_data].[type_id] AS [type_id], " + "[contact_data].[raw_contact_id] AS [raw_contact_id], " + "[contact_data].[read_only] AS [read_only], " + "[contact_data].[version] AS [version], " + "[contact_data].[family_name] AS [family_name], " + "[contact_data].[middle_name_phonetic] AS [middle_name_phonetic], " + "[contact_data].[given_name] AS [given_name], " + "[contact_data].[given_name_phonetic] AS [given_name_phonetic], " + "[contact_data].[is_preferred_number] AS [is_preferred_number], " + "[contact_data].[phonetic_name] AS [phonetic_name], " + "[contact_data].[detail_info] AS [detail_info], " + "[contact_data].[alias_detail_info] AS [alias_detail_info], " + "[contact_data].[position] AS [position], " + "[contact_data].[extend1] AS [extend1], " + "[contact_data].[extend2] AS [extend2], " + "[contact_data].[extend3] AS [extend3], " + "[contact_data].[extend4] AS [extend4], " + "[contact_data].[alpha_name] AS [alpha_name], " + "[contact_data].[other_lan_last_name] AS [other_lan_last_name], " + "[contact_data].[other_lan_first_name] AS [other_lan_first_name], " + "[contact_data].[extend5] AS [extend5], " + "[contact_data].[lan_style] AS [lan_style], " + "[contact_data].[custom_data] AS [custom_data], " + "[contact_data].[extend6] AS [extend6], " + "[contact_data].[extend7] AS [extend7], " + "[contact_data].[blob_data] AS [blob_data], " + "[contact_data].[syn_1] AS [syn_1], " + "[contact_data].[city] AS [city], " + "[contact_data].[syn_2] AS [syn_2], " + "[contact_data].[syn_3] AS [syn_3], " + "[contact_data].[country] AS [country], " + "[contact_data].[neighborhood] AS [neighborhood], " + "[contact_data].[pobox] AS [pobox], " + "[contact_data].[postcode] AS [postcode], " + "[contact_data].[region] AS [region], " + "[contact_data].[street] AS [street], " + "[contact_type].[content_type] AS [content_type], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type], " + "[account].[data_info] AS [data_info], " + "[account].[id] AS [account_id], " + "[groups].[id] AS [group_id], " + "[groups].[group_name] AS [group_name], " + "[groups].[group_notes] AS [group_notes], " + "[groups].[is_deleted] AS [group_is_deleted], " + "[groups].[group_ringtone] AS [group_ringtone], " + "[groups].[ringtone_modify_time] AS [ringtone_modify_time], " + "[groups].[lastest_modify_time] AS [lastest_modify_time], " + "[photo_files].[file_size] AS [file_size], " + "[photo_files].[file_height] AS [file_height], " + "[photo_files].[file_width] AS [file_width], " + "[contact].[id] AS [contact_id], " + "[contact].[photo_id] AS [photo_id], " + "[contact].[photo_file_id] AS [photo_file_id], " + "[contact].[personal_ringtone] AS [personal_ringtone], " + "[contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " + "[contact].[company] AS [company], " + "[contact].[quick_search_key] AS [quick_search_key], " + "[contact].[personal_notification_ringtone] AS " + "[personal_notification_ringtone], " + "[contact].[has_phone_number] AS [has_phone_number], " + "[contact].[has_display_name] AS [has_display_name], " + "[contact].[has_email] AS [has_email], " + "[contact].[has_group] AS [has_group], " + "[raw_contact].[contacted_count] AS [contacted_count], " + "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " + "[raw_contact].[favorite] AS [favorite], " + "[raw_contact].[favorite_order] AS [favorite_order], " + "[raw_contact].[display_name] AS [display_name], " + "[raw_contact].[sort] AS [sort], " + "[raw_contact].[sort_first_letter] AS [sort_first_letter], " + "[raw_contact].[is_deleted] AS [is_deleted], " + "[raw_contact].[phonetic_name_type] AS [phonetic_name_type], " + "[raw_contact].[photo_first_name] AS [photo_first_name] " + "FROM [contact_data] " + "JOIN [raw_contact] ON " + "([contact_data].[raw_contact_id] = [raw_contact].[id]) " + "JOIN [contact] ON ([contact].[id] = [raw_contact].[contact_id]) " + "JOIN [raw_contact] AS [name_raw_contact] ON " + "([name_raw_contact_id] = [name_raw_contact].[id]) " + "LEFT JOIN [account] ON " + "([raw_contact].[account_id] = [account].[id]) " + "LEFT JOIN [contact_type] ON " + "([contact_type].[id] = [contact_data].[type_id]) " + "LEFT JOIN [groups] ON " + "([contact_type].[content_type] = 'group_membership' " + "AND [groups].[id] = [contact_data].[detail_info]) " + "LEFT JOIN [photo_files] ON " + "([contact_type].[content_type] = 'photo' " + "AND [photo_files].[id] = [raw_contact].[photo_file_id])"; + +constexpr const char *CREATE_SEARCH_CONTACT_VIEW = + "CREATE VIEW IF NOT EXISTS [search_contact_view] AS SELECT " + "[search_contact].[id] AS [id], " + "[search_contact].[account_id] AS [account_id], " + "[search_contact].[contact_id] AS [contact_id], " + "[search_contact].[raw_contact_id] AS [raw_contact_id], " + "[search_contact].[search_name] AS [search_name], " + "[search_contact].[photo_id] AS [photo_id], " + "[search_contact].[photo_file_id] AS [photo_file_id], " + "[contact_type].[content_type] AS [content_type], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type], " + "[account].[data_info] AS [data_info], " + "[groups].[group_name] AS [group_name], " + "[groups].[group_notes] AS [group_notes], " + "[groups].[is_deleted] AS [group_is_deleted], " + "[groups].[group_ringtone] AS [group_ringtone], " + "[groups].[ringtone_modify_time] AS [ringtone_modify_time], " + "[groups].[lastest_modify_time] AS [lastest_modify_time], " + "[photo_files].[file_size] AS [file_size], " + "[photo_files].[file_height] AS [file_height], " + "[photo_files].[file_width] AS [file_width], " + "[contact].[personal_ringtone] AS [personal_ringtone], " + "[contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " + "[contact].[personal_notification_ringtone] AS " + "[personal_notification_ringtone], " + "[contact].[has_phone_number] AS [has_phone_number], " + "[contact].[has_display_name] AS [has_display_name], " + "[contact].[has_email] AS [has_email], " + "[contact].[has_group] AS [has_group], " + "[raw_contact].[contacted_count] AS [contacted_count], " + "[raw_contact].[favorite] AS [favorite], " + "[raw_contact].[favorite_order] AS [favorite_order], " + "[raw_contact].[display_name] AS [display_name], " + "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " + "[raw_contact].[sort_first_letter] AS [sort_first_letter], " + "[raw_contact].[sort] AS [sort], " + "[raw_contact].[photo_first_name] AS [photo_first_name], " + "[raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " + "[raw_contact].[is_deleted] AS [is_deleted], " + "[contact_data].[type_id] AS [type_id], " + "[contact_data].[phonetic_name] AS [phonetic_name], " + "[contact_data].[raw_contact_id] AS [raw_contact_id], " + "[contact_data].[read_only] AS [read_only], " + "[contact_data].[version] AS [version], " + "[contact_data].[alias_detail_info] AS [alias_detail_info], " + "[contact_data].[is_preferred_number] AS [is_preferred_number], " + "[contact_data].[detail_info] AS [detail_info], " + "[contact_data].[city] AS [city], " + "[contact_data].[position] AS [position], " + "[contact_data].[middle_name_phonetic] AS [middle_name_phonetic], " + "[contact_data].[given_name] AS [given_name], " + "[contact_data].[family_name] AS [family_name], " + "[contact_data].[given_name_phonetic] AS [given_name_phonetic], " + "[contact_data].[country] AS [country], " + "[contact_data].[neighborhood] AS [neighborhood], " + "[contact_data].[pobox] AS [pobox], " + "[contact_data].[postcode] AS [postcode], " + "[contact_data].[region] AS [region], " + "[contact_data].[street] AS [street], " + "[contact_data].[extend1] AS [extend1], " + "[contact_data].[extend2] AS [extend2], " + "[contact_data].[extend3] AS [extend3], " + "[contact_data].[extend4] AS [extend4], " + "[contact_data].[alpha_name] AS [alpha_name], " + "[contact_data].[other_lan_last_name] AS [other_lan_last_name], " + "[contact_data].[other_lan_first_name] AS [other_lan_first_name], " + "[contact_data].[extend5] AS [extend5], " + "[contact_data].[lan_style] AS [lan_style], " + "[contact_data].[custom_data] AS [custom_data], " + "[contact_data].[extend6] AS [extend6], " + "[contact_data].[extend7] AS [extend7], " + "[contact_data].[blob_data] AS [blob_data], " + "[contact_data].[syn_1] AS [syn_1], " + "[contact_data].[syn_2] AS [syn_2], " + "[contact_data].[syn_3] AS [syn_3] " + "FROM [search_contact] " + "JOIN [raw_contact] ON " + "([search_contact].[raw_contact_id] = [raw_contact].[id]) " + "JOIN [contact] ON " + "([contact].[id] = [raw_contact].[contact_id]) " + "JOIN [raw_contact] AS [name_raw_contact] ON " + "([name_raw_contact_id] = [name_raw_contact].[id]) " + "LEFT JOIN [account] ON " + "([search_contact].[account_id] = [account].[id]) " + "LEFT JOIN [contact_data] ON " + "([contact_data].[raw_contact_id] = [raw_contact].[id]) " + "LEFT JOIN [contact_type] ON " + "([contact_data].[type_id] = [contact_type].[id]) " + "LEFT JOIN [groups] ON " + "([contact_type].[content_type] = 'group_membership' " + "AND [groups].[id] = [contact_data].[detail_info]) " + "LEFT JOIN [photo_files] ON " + "([contact_type].[content_type] = 'photo' " + "AND [photo_files].[id] = [search_contact].[photo_file_id])"; + +constexpr const char *CREATE_VIEW_GROUPS = + "CREATE VIEW IF NOT EXISTS [view_groups] " + "AS SELECT " + "[groups].[id] AS [id], " + "[groups].[account_id] AS [account_id], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type], " + "[groups].[group_name] AS [group_name] , " + "[groups].[group_notes] AS [group_notes] , " + "[groups].[is_deleted] AS [is_deleted] , " + "[groups].[group_ringtone] AS [group_ringtone], " + "[groups].[ringtone_modify_time] AS [ringtone_modify_time] , " + "[groups].[lastest_modify_time] AS [lastest_modify_time] " + "FROM [groups] " + "LEFT JOIN [account] ON ([groups].[account_id] = [account].[id])"; + +constexpr const char *CREATE_VIEW_DELETED = + "CREATE VIEW IF NOT EXISTS [view_deleted] " + "AS SELECT " + "[deleted_raw_contact].[id] AS [id], " + "[contact].[id] AS [contact_id], " + "[contact].[photo_id] AS [photo_id], " + "[contact].[photo_file_id] AS [photo_file_id], " + "[contact].[quick_search_key] AS [quick_search_key], " + "[contact].[has_phone_number] AS [has_phone_number], " + "[contact].[has_display_name] AS [has_display_name], " + "[contact].[has_email] AS [has_email], " + "[contact].[has_group] AS [has_group], " + "[name_raw_contact].[account_id] AS [account_id], " + "[name_raw_contact].[id] AS [raw_contact_id], " + "[name_raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " + "[name_raw_contact].[personal_ringtone] AS [personal_ringtone], " + "[name_raw_contact].[is_deleted] AS [is_deleted], " + "[name_raw_contact].[version] AS [version], " + "[name_raw_contact].[display_name] AS [display_name], " + "[name_raw_contact].[sort] AS [sort], " + "[name_raw_contact].[contacted_count] AS [contacted_count], " + "[name_raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " + "[name_raw_contact].[favorite] AS [favorite], " + "[name_raw_contact].[favorite_order] AS [favorite_order], " + "[name_raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " + "[name_raw_contact].[phonetic_name] AS [phonetic_name], " + "[name_raw_contact].[phonetic_name_type] AS [phonetic_name_type], " + "[name_raw_contact].[company] AS [company], " + "[name_raw_contact].[position] AS [position], " + "[name_raw_contact].[read_only] AS [read_only], " + "[name_raw_contact].[sort_first_letter] AS [sort_first_letter], " + "[name_raw_contact].[merge_mode] AS [merge_mode], " + "[name_raw_contact].[is_need_merge] AS [is_need_merge], " + "[name_raw_contact].[merge_status] AS [merge_status], " + "[name_raw_contact].[is_merge_target] AS [is_merge_target], " + "[name_raw_contact].[vibration_setting] AS [vibration_setting], " + "[name_raw_contact].[photo_first_name] AS [photo_first_name], " + "[name_raw_contact].[sync_id] AS [sync_id], " + "[name_raw_contact].[syn_1] AS [syn_1], " + "[name_raw_contact].[syn_2] AS [syn_2], " + "[name_raw_contact].[syn_3] AS [syn_3], " + "[deleted_raw_contact].[delete_source] AS [delete_source]," + "[deleted_raw_contact].[delete_time] AS [delete_time], " + "[deleted_raw_contact].[delete_account] AS [delete_account], " + "[deleted_raw_contact].[backup_data] AS [backup_data], " + "[account].[account_name] AS [account_name], " + "[account].[account_type] AS [account_type], " + "[photo_files].[file_size] AS [file_size], " + "[photo_files].[file_height] AS [file_height], " + "[photo_files].[file_width] AS [file_width] " + "FROM [deleted_raw_contact] " + "LEFT JOIN [contact] ON ([contact].[id] = [deleted_raw_contact].[contact_id]) " + "LEFT JOIN [raw_contact] AS [name_raw_contact] ON ([name_raw_contact].[id] = " + "[deleted_raw_contact].[raw_contact_id] " + "AND [name_raw_contact].[is_deleted] = 1)" + "LEFT JOIN [account] ON ([name_raw_contact].[account_id] = [account].[id]) " + "LEFT JOIN [photo_files] ON ([photo_files].[id] = [name_raw_contact].[photo_file_id]) "; + +constexpr const char *UPDATE_CONTACT_BY_INSERT_CONTACT_DATA = + "CREATE TRIGGER IF NOT EXISTS [update_contact_by_insert_contact_data] AFTER INSERT ON [contact_data] FOR EACH ROW " + "BEGIN " + "UPDATE " + "[contact] " + "SET " + "[has_display_name] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 6 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_email] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 1 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_group] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 9 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_phone_number] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 5 " + "AND [NEW].[detail_info] IS NOT NULL; " + "END"; + +constexpr const char *UPDATE_CONTACT_BY_DELETE_CONTACT_DATA = + "CREATE TRIGGER IF NOT EXISTS [update_contact_by_delete_contact_data] AFTER DELETE ON [contact_data] FOR EACH ROW " + "BEGIN " + "UPDATE " + "[contact] " + "SET " + "[has_display_name] = 0 " + "WHERE " + "[OLD].[raw_contact_id] = [name_raw_contact_id] " + "AND [OLD].[type_id] = 6; " + "UPDATE " + "[contact] " + "SET " + "[has_email] = 0 " + "WHERE " + "[OLD].[raw_contact_id] = [name_raw_contact_id] " + "AND [OLD].[type_id] = 1; " + "UPDATE " + "[contact] " + "SET " + "[has_group] = 0 " + "WHERE " + "[OLD].[raw_contact_id] = [name_raw_contact_id] " + "AND [OLD].[type_id] = 9; " + "UPDATE " + "[contact] " + "SET " + "[has_phone_number] = 0 " + "WHERE " + "[OLD].[raw_contact_id] = [name_raw_contact_id] " + "AND [OLD].[type_id] = 5; " + "END"; + +constexpr const char *UPDATE_CONTACT_BY_UPDATE_CONTACT_DATA = + "CREATE TRIGGER IF NOT EXISTS [update_contact_by_update_contact_data] AFTER UPDATE ON [contact_data] FOR EACH ROW " + "BEGIN " + "UPDATE " + "[contact] " + "SET " + "[has_display_name] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 6 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_email] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 1 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_group] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 9 " + "AND [NEW].[detail_info] IS NOT NULL; " + "UPDATE " + "[contact] " + "SET " + "[has_phone_number] = 1 " + "WHERE " + "[NEW].[raw_contact_id] = [name_raw_contact_id] " + "AND [NEW].[type_id] = 5 " + "AND [NEW].[detail_info] IS NOT NULL; " + "END"; + +constexpr const char *INSERT_DELETE_RAW_CONTACT = + "CREATE TRIGGER IF NOT EXISTS insert_delete_raw_contact AFTER INSERT ON deleted_raw_contact " + "BEGIN " + "UPDATE deleted_raw_contact SET delete_time = STRFTIME('%s','now') WHERE id = NEW.id; " + "END"; + +constexpr const char *UPDATE_RAW_CONTACT_VERSION = + "CREATE TRIGGER IF NOT EXISTS [update_raw_contact_version] AFTER UPDATE ON [raw_contact] " + "BEGIN " + "UPDATE " + "[raw_contact] " + "SET " + "[version] = [OLD].[version] + 1 " + "WHERE " + "[id] = [OLD].[id] AND [NEW].[is_deleted] != [OLD].[is_deleted]; " + "END"; + +constexpr const char *UPDATE_CONTACT_DATA_VERSION = + "CREATE TRIGGER IF NOT EXISTS [update_contact_data_version] AFTER UPDATE ON [contact_data] " + "BEGIN " + "UPDATE " + "[contact_data] " + "SET " + "[version] = [OLD].[version] + 1 " + "WHERE " + "[id] = [OLD].[id]; " + "END"; + +constexpr const char *INSERT_CONTACT_QUICK_SEARCH = + "CREATE TRIGGER IF NOT EXISTS [insert_contact_quick_search]AFTER INSERT ON [contact] BEGIN " + "UPDATE [contact] SET [quick_search_key] = [NEW].[id] WHERE [id] = [NEW].[id]; END"; + +constexpr const char *CALL_LOG_PHONE_NUMBER_INDEX = + "CREATE INDEX IF NOT EXISTS [calllog_phone_number_index] ON [calllog] ([phone_number])"; + +constexpr const char *MERGE_INFO = + "CREATE TABLE IF NOT EXISTS [merge_info](" + "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " + "[raw_contact_id] INTEGER NOT NULL DEFAULT 0 )"; + +constexpr const char *MERGE_INFO_INDEX = + "CREATE INDEX IF NOT EXISTS [merge_info_index] ON [merge_info] ([raw_contact_id])"; +} // namespace Contacts +} // namespace OHOS +#endif // COMMON_H \ No newline at end of file diff --git a/ability/common/include/contacts_columns.h b/ability/common/include/contacts_columns.h new file mode 100644 index 0000000..8aad569 --- /dev/null +++ b/ability/common/include/contacts_columns.h @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_COLUMNS_H +#define CONTACT_COLUMNS_H + +namespace OHOS { +namespace Contacts { +class ContactTableName { +public: + ~ContactTableName(); + static constexpr const char *ACCOUNT = "account"; + static constexpr const char *CONTACT_TYPE = "contact_type"; + static constexpr const char *DELETE_RAW_CONTACT = "deleted_raw_contact"; + static constexpr const char *GROUPS = "groups"; + static constexpr const char *CONTACT = "contact"; + static constexpr const char *CONTACT_BLOCKLIST = "contact_blocklist"; + static constexpr const char *CONTACT_DATA = "contact_data"; + static constexpr const char *LOCAL_LANG = "local_lang"; + static constexpr const char *PHOTO_FILES = "photo_files"; + static constexpr const char *RAW_CONTACT = "raw_contact"; + static constexpr const char *SEARCH_CONTACT = "search_contact"; + static constexpr const char *DATABASE_BACKUP_TASK = "database_backup_task"; + static constexpr const char *MERGE_INFO = "merge_info"; +}; + +class CallLogColumns { +public: + ~CallLogColumns(); + static constexpr const char *DISPLAY_NAME = "display_name"; + static constexpr const char *QUICK_SEARCH_KEY = "quicksearch_key"; + static constexpr const char *PHONE_NUMBER = "phone_number"; + static constexpr const char *BEGIN_TIME = "begin_time"; +}; + +class DatabaseBackupColumns { +public: + ~DatabaseBackupColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *BACKUP_TIME = "backup_time"; + static constexpr const char *BACKUP_PATH = "backup_path"; + static constexpr const char *REMARKS = "remarks"; +}; + +class CallsTableName { +public: + ~CallsTableName(); + static constexpr const char *CALLLOG = "calllog"; + static constexpr const char *VOICEMAIL = "voicemail"; + static constexpr const char *REPLYING = "replying"; +}; + +class ViewName { +public: + ~ViewName(); + static constexpr const char *SEARCH_CONTACT_VIEW = "search_contact_view"; + static constexpr const char *VIEW_CONTACT_DATA = "view_contact_data"; + static constexpr const char *VIEW_CONTACT = "view_contact"; + static constexpr const char *VIEW_RAW_CONTACT = "view_raw_contact"; + static constexpr const char *VIEW_GROUPS = "view_groups"; + static constexpr const char *VIEW_DELETED = "view_deleted"; +}; + +class AliasName { +public: + ~AliasName(); + static constexpr const char *ACCOUNT_DEFAULT = "accountDefault"; + static constexpr const char *NAME_RAW_CONTACT = "name_raw_contact"; + static constexpr const char *DATA_ID = "data_id"; + static constexpr const char *CONTACT = "contact"; + static constexpr const char *DATA = "data"; +}; + +class ContactPublicColumns { +public: + ~ContactPublicColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *COUNT = "count"; +}; + +class AccountColumns { +public: + ~AccountColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *ACCOUNT_NAME = "account_name"; + static constexpr const char *ACCOUNT_TYPE = "account_type"; + static constexpr const char *DATA_INFO = "data_info"; +}; + +class ContentTypeColumns { +public: + ~ContentTypeColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *CONTENT_TYPE = "content_type"; +}; + +class DeleteRawContactColumns { +public: + ~DeleteRawContactColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *CONTACT_ID = "contact_id"; + static constexpr const char *RAW_CONTACT_ID = "raw_contact_id"; + static constexpr const char *DELETE_SOURCE = "delete_source"; + static constexpr const char *DELETE_TIME = "delete_time"; + static constexpr const char *DISPLAY_NAME = "display_name"; + static constexpr const char *DELETE_ACCOUNT = "delete_account"; + static constexpr const char *BACKUP_DATA = "backup_data"; + static constexpr const char *DELETE_DATE = "delete_date"; + static constexpr const char *IS_DELETED = "is_deleted"; +}; + +class GroupsColumns { +public: + ~GroupsColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *ACCOUNT_ID = "account_id"; + static constexpr const char *GROUP_NAME = "group_name"; + static constexpr const char *GROUP_NOTES = "group_notes"; + static constexpr const char *IS_DELETED = "is_deleted"; + static constexpr const char *GROUP_RINGTONE = "group_ringtone"; + static constexpr const char *RINGTONE_MODIFY_TIME = "ringtone_modify_time"; + static constexpr const char *LASTEST_MODIFY_TIME = "lastest_modify_time"; +}; + +class ContactColumns { +public: + ~ContactColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *NAME_RAW_CONTACT_ID = "name_raw_contact_id"; + static constexpr const char *PHOTO_FILE_ID = "photo_file_id"; + static constexpr const char *PHOTO_ID = "photo_id"; + static constexpr const char *PERSONAL_RINGTONE = "personal_ringtone"; + static constexpr const char *IS_TRANSFER_VOICEMAIL = "is_transfer_voicemail"; + static constexpr const char *COMPANY = "company"; + static constexpr const char *POSITION = "position"; + static constexpr const char *QUICK_SEARCH_KEY = "quick_search_key"; + static constexpr const char *CONTACTED_COUNT = "contacted_count"; + static constexpr const char *LASTEST_CONTACTED_TIME = "lastest_contacted_time"; + static constexpr const char *FAVORITE = "favorite"; + static constexpr const char *FAVORITE_ORDER = "favorite_order"; + static constexpr const char *READ_ONLY = "read_only"; + static constexpr const char *PERSONAL_NOTIFICATION_RINGTONE = "personal_notification_ringtone"; + static constexpr const char *HAS_PHONE_NUMBER = "has_phone_number"; + static constexpr const char *HAS_DISPLAY_NAME = "has_display_name"; + static constexpr const char *HAS_EMAIL = "has_email"; + static constexpr const char *HAS_GROUP = "has_group"; +}; + +class ContactBlockListColumns { +public: + ~ContactBlockListColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *TYPES = "types"; + static constexpr const char *PHONE_NUMBER = "phone_number"; + static constexpr const char *CONTENT = "content"; + static constexpr const char *TIME_STAMP = "time_stamp"; +}; + +class ContactDataColumns { +public: + ~ContactDataColumns(); + static constexpr const char *TYPE_ID = "type_id"; + static constexpr const char *RAW_CONTACT_ID = "raw_contact_id"; + static constexpr const char *READ_ONLY = "read_only"; + static constexpr const char *VERSION = "version"; + static constexpr const char *IS_PERFERRED_NUMBER = "is_preferred_number"; + static constexpr const char *DETAIL_INFO = "detail_info"; + static constexpr const char *POSITION = "position"; + static constexpr const char *EXTEND1 = "extend1"; + static constexpr const char *EXTEND2 = "extend2"; + static constexpr const char *EXTEND3 = "extend3"; + static constexpr const char *EXTEND4 = "extend4"; + static constexpr const char *ALPHA_NAME = "alpha_name"; + static constexpr const char *OTHRE_LAN_LAST_NAME = "other_lan_last_name"; + static constexpr const char *OTHRE_LAN_FIRST_NAME = "other_lan_first_name"; + static constexpr const char *EXTEND5 = "extend5"; + static constexpr const char *PHONETIC_NAME = "phonetic_name"; + static constexpr const char *LAN_STYLE = "lan_style"; + static constexpr const char *CUSTOM_DATA = "custom_data"; + static constexpr const char *EXTEND6 = "extend6"; + static constexpr const char *EXTEND7 = "extend7"; + static constexpr const char *BLOB_DATA = "blob_data"; + static constexpr const char *SYNC_1 = "sync_1"; + static constexpr const char *SYNC_2 = "sync_2"; + static constexpr const char *SYNC_3 = "sync_3"; +}; + +class LocalLanguageColumns { +public: + ~LocalLanguageColumns(); + static constexpr const char *LOCAL = "local"; +}; + +class PhotoFilesColumns { +public: + ~PhotoFilesColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *FILE_WIDTH = "file_width"; + static constexpr const char *FILE_HEIGHT = "file_height"; + static constexpr const char *FILE_SIZE = "file_size"; +}; + +class RawContactColumns { +public: + ~RawContactColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *CONTACT_ID = "contact_id"; + static constexpr const char *PHOTO_ID = "photo_id"; + static constexpr const char *PHOTO_FILE_ID = "photo_file_id"; + static constexpr const char *IS_TRANSFER_VOICEMAIL = "is_transfer_voicemail"; + static constexpr const char *PERSONAL_RINGTONE = "personal_ringtone"; + static constexpr const char *IS_DELETED = "is_deleted"; + static constexpr const char *PHOTO_FIRST_NAME = "photo_first_name"; + static constexpr const char *ACCOUNT_ID = "account_id"; + static constexpr const char *VERSION = "version"; + static constexpr const char *DISPLAY_NAME = "display_name"; + static constexpr const char *SORT = "sort"; + static constexpr const char *CONTACTED_COUNT = "contacted_count"; + static constexpr const char *LASTEST_CONTACTED_TIME = "lastest_contacted_time"; + static constexpr const char *FAVORITE = "favorite"; + static constexpr const char *FAVORITE_ORDER = "favorite_order"; + static constexpr const char *PHONETIC_NAME = "phonetic_name"; + static constexpr const char *PHONETIC_NAME_TYPE = "phonetic_name_type"; + static constexpr const char *COMPANY = "company"; + static constexpr const char *POSITION = "position"; + static constexpr const char *READ_ONLY = "read_only"; + static constexpr const char *SORT_FIRST_LETTER = "sort_first_letter"; + static constexpr const char *MERGE_MODE = "merge_mode"; + static constexpr const char *IS_NEED_MERGE = "is_need_merge"; + static constexpr const char *MERGE_STATUS = "merge_status"; + static constexpr const char *IS_MERGE_TARGET = "is_merge_target"; + static constexpr const char *VIBRATION_SETTING = "vibration_setting"; + static constexpr const char *SYNC_ID = "sync_id"; + static constexpr const char *SYNC_1 = "sync_1"; + static constexpr const char *SYNC_2 = "sync_2"; + static constexpr const char *SYNC_3 = "sync_3"; +}; + +class SearchContactColumns { +public: + ~SearchContactColumns(); + static constexpr const char *ID = "id"; + static constexpr const char *ACCOUNT_ID = "account_id"; + static constexpr const char *CONTACT_ID = "contact_id"; + static constexpr const char *RAW_CONTACT_ID = "raw_contact_id"; + static constexpr const char *SEARCH_NAME = "search_name"; + static constexpr const char *DISPLAY_NAME = "display_name"; + static constexpr const char *PHONETIC_NAME = "phonetic_name"; + static constexpr const char *FAVORITE = "favorite"; + static constexpr const char *PHOTO_ID = "photo_id"; + static constexpr const char *PHOTO_FILE_ID = "photo_file_id"; +}; + +class AccountData { +public: + ~AccountData(); + static constexpr const char *ACCOUNT_NAME = "phone"; + static constexpr const char *ACCOUNT_TYPE = "com.ohos.contacts"; +}; + +class ContentTypeData { +public: + ~ContentTypeData(); + static constexpr const char *EMAIL = "email"; + static constexpr const char *IM = "im"; + static constexpr const char *NICKNAME = "nickname"; + static constexpr const char *ORGANIZATION = "organization"; + static constexpr const char *PHONE = "phone"; + static constexpr const char *NAME = "name"; + static constexpr const char *ADDRESS = "postal_address"; + static constexpr const char *PHOTO = "photo"; + static constexpr const char *GROUP_MEMBERSHIP = "group_membership"; + static constexpr const char *NOTE = "note"; + static constexpr const char *CONTACT_EVENT = "contact_event"; + static constexpr const char *WEBSITE = "website"; + static constexpr const char *RELATION = "relation"; + static constexpr const char *CONTACT_MISC = "contact_misc"; + static constexpr const char *HICALL_DEVICE = "hicall_device"; + static constexpr const char *CAMCARD = "camcard"; + static constexpr const char *SIP_ADDRESS = "sip_address"; +}; +class MergeInfo { +public: + ~MergeInfo(); + static constexpr const char *RAW_CONTACT_ID = "raw_contact_id"; +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_COLUMNS_H diff --git a/ability/common/include/hilog_wrapper.h b/ability/common/include/hilog_wrapper.h new file mode 100644 index 0000000..2450a8b --- /dev/null +++ b/ability/common/include/hilog_wrapper.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2021 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. + */ + +#ifndef HILOG_WRAPPER_H +#define HILOG_WRAPPER_H + +#define CONFIG_HILOG +#ifdef CONFIG_HILOG + +#include "hilog/log.h" + +#ifdef HILOG_FATAL +#undef HILOG_FATAL +#endif + +#ifdef HILOG_ERROR +#undef HILOG_ERROR +#endif + +#ifdef HILOG_WARN +#undef HILOG_WARN +#endif + +#ifdef HILOG_INFO +#undef HILOG_INFO +#endif + +#ifdef HILOG_DEBUG +#undef HILOG_DEBUG +#endif + +static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = {LOG_CORE, 0, "ContactsDataAbility===>"}; + +#define HILOG_FATAL(...) (void)OHOS::HiviewDFX::HiLog::Fatal(LOG_LABEL, __VA_ARGS__) +#define HILOG_ERROR(...) (void)OHOS::HiviewDFX::HiLog::Error(LOG_LABEL, __VA_ARGS__) +#define HILOG_WARN(...) (void)OHOS::HiviewDFX::HiLog::Warn(LOG_LABEL, __VA_ARGS__) +#define HILOG_INFO(...) (void)OHOS::HiviewDFX::HiLog::Info(LOG_LABEL, __VA_ARGS__) +#define HILOG_DEBUG(...) (void)OHOS::HiviewDFX::HiLog::Debug(LOG_LABEL, __VA_ARGS__) +#else + +#define HILOG_FATAL(...) +#define HILOG_ERROR(...) +#define HILOG_WARN(...) +#define HILOG_INFO(...) +#define HILOG_DEBUG(...) + +#endif // CONFIG_HILOG + +#endif // HILOG_WRAPPER_H \ No newline at end of file diff --git a/ability/common/utils/include/async_task.h b/ability/common/utils/include/async_task.h new file mode 100644 index 0000000..016187b --- /dev/null +++ b/ability/common/utils/include/async_task.h @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTSDATAABILITY_ASYNC_TASK_H +#define CONTACTSDATAABILITY_ASYNC_TASK_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "contacts_database.h" +#include "contacts_update_helper.h" +#include "hilog_wrapper.h" +#include "match_candidate.h" + +namespace OHOS { +namespace Contacts { +class AsyncItem { +public: + virtual ~AsyncItem() + { + } + + virtual void Run() = 0; +}; + +class AsyncTaskMutex { +public: + void lock() + { + while (flag.test_and_set(std::memory_order_acquire)) + ; + } + + void unlock() + { + flag.clear(std::memory_order_release); + } + +private: + std::atomic_flag flag = ATOMIC_FLAG_INIT; +}; + +class AsyncTaskQueue { +public: + // single instance + static AsyncTaskQueue *Instance() + { + static AsyncTaskQueue obj; + return &obj; + } + +public: + // clear task + void Clear() + { + std::lock_guard lk(mtx); + while (que.size() > 0) + que.pop(); + } + + // que empty + bool Empty() const + { + std::lock_guard lk(mtx); + return que.empty(); + } + + size_t Size() const + { + std::lock_guard lk(mtx); + return que.size(); + } + + size_t GetThreads() const + { + return threads; + } + + bool Push(AsyncItem *item) + { + std::lock_guard lk(mtx); + if (maxSize > 0 && que.size() >= maxSize) { + HILOG_ERROR("AsyncTask maxSize error"); + return false; + } + que.push(item); + return true; + } + + // startTask + void Start(size_t threads = 1, size_t maxSize = 1000000) + { + if (this->threads > 0) { + return; + } + this->threads = threads; + this->maxSize = maxSize; + for (size_t i = 0; i < this->threads; i++) { + std::thread(std::bind(&AsyncTaskQueue::Run, this)).detach(); + } + } + +public: + void Run() + { + AsyncItem *item = nullptr; + while (this->threads > 0) { + if (Pop(&item)) { + if (item != nullptr) { + item->Run(); + delete item; + item = nullptr; + } + } else { + std::chrono::milliseconds dura(1); + std::this_thread::sleep_for(dura); + } + } + } + +private: + size_t maxSize; + size_t threads; + mutable AsyncTaskMutex mtx; + std::queue que; + AsyncTaskQueue() + { + this->maxSize = 0; + } + + bool Pop(AsyncItem **item) + { + std::lock_guard lk(mtx); + if (que.empty()) { + return false; + } + *item = que.front(); + que.pop(); + return true; + } +}; + +// impl run +class AsyncTask : public AsyncItem { + std::shared_ptr store; + std::vector rawContactIdVector; + bool isDeleted; + +public: + void Run() + { + ContactsUpdateHelper contactsUpdateHelper; + contactsUpdateHelper.UpdateCallLogByPhoneNum(rawContactIdVector, store, isDeleted); + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + contactsDataBase->InsertMergeData(store, rawContactIdVector); + contactsDataBase->MarkMerge(store); + } + +public: + AsyncTask(std::shared_ptr &store, std::vector &rawContactIdVector, bool isDeleted) + { + this->store = store; + this->rawContactIdVector = rawContactIdVector; + this->isDeleted = isDeleted; + } + +public: + AsyncTask() + { + } +}; + +class AsyncDeleteContactsTask : public AsyncItem { + std::vector queryValuesBucket; + std::shared_ptr store; + +public: + void Run() + { + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + contactsDataBase->DeleteRecordInsert(store, queryValuesBucket); + } + +public: + AsyncDeleteContactsTask(std::shared_ptr &store, + std::vector &queryValuesBucket) + { + this->queryValuesBucket = queryValuesBucket; + this->store = store; + } + +public: + AsyncDeleteContactsTask() + { + } +}; +} // namespace Contacts +} // namespace OHOS + +#endif // CONTACTSDATAABILITY_ASYNC_TASK_H diff --git a/ability/common/utils/include/contacts_common_event.h b/ability/common/utils/include/contacts_common_event.h new file mode 100644 index 0000000..7e1245e --- /dev/null +++ b/ability/common/utils/include/contacts_common_event.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_COMMON_EVENT_H +#define CONTACT_COMMON_EVENT_H + +#include "common_event_manager.h" +#include "common_event_subscriber.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +constexpr const char *CONTACT_EVENT = "com.ohos.contactsdataability"; +constexpr const char *CALL_LOG_EVENT = "com.ohos.calllogability"; +constexpr const char *VOICEMAIL_EVENT = "com.ohos.voicemailability"; +constexpr int CONTACT_EVENT_CODE = 10000; +constexpr int CALL_LOG_EVENT_CODE = 20000; +constexpr int VOICEMAIL_EVENT_CODE = 30000; + +// action +constexpr int CONTACT_INSERT = 0; +constexpr int CONTACT_UPDATE = 1; +constexpr int CONTACT_DELETE = 2; + +class ContactsCommonEvent : public OHOS::EventFwk::CommonEventSubscriber { +public: + ContactsCommonEvent(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo) + : CommonEventSubscriber(subscriberInfo) + { + } + ~ContactsCommonEvent() = default; + static std::shared_ptr subscriber; + void OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data); + static bool PublishContactEvent(const OHOS::AAFwk::Want &want, int eventCode, const std::string &eventData); + static void UnregisterSubscriber(std::shared_ptr subscriber); + static void RegisterSubscriber(); + static void SendContactChange(int actionCode); + static void SendCallLogChange(int actionCode); + static void SendVoiceMailChange(int actionCode); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_COMMON_EVENT_H \ No newline at end of file diff --git a/ability/common/utils/include/contacts_json_utils.h b/ability/common/utils/include/contacts_json_utils.h new file mode 100644 index 0000000..3a992d6 --- /dev/null +++ b/ability/common/utils/include/contacts_json_utils.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_JSON_UTILS_H +#define CONTACT_JSON_UTILS_H + +#include + +#include "json.h" +#include "json_utils.h" +#include "rdb_errno.h" +#include "rdb_open_callback.h" +#include "result_set.h" + +namespace OHOS { +namespace Contacts { +class ContactsJsonUtils { +public: + ContactsJsonUtils(); + ~ContactsJsonUtils(); + std::string GetDeleteData(std::unique_ptr &resultSet); + void ConvertResultSet(Json::Value &arrayValue, std::unique_ptr &resultSet); + void GetValue(std::vector &columnNames, int &index, Json::Value &data, + std::unique_ptr &resultSet); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_JSON_UTILS_H diff --git a/ability/common/utils/include/contacts_path.h b/ability/common/utils/include/contacts_path.h new file mode 100644 index 0000000..4a66af5 --- /dev/null +++ b/ability/common/utils/include/contacts_path.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTSDATAABILITY_CONTACT_PATH_H +#define CONTACTSDATAABILITY_CONTACT_PATH_H + +#include + +namespace OHOS { +namespace Contacts { +class ContactsPath { +public: + ContactsPath(); + ~ContactsPath(); + static std::string RDB_PATH; + static std::string RDB_BACKUP_PATH; + static std::string DUMP_PATH; +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACTSDATAABILITY_CONTACT_PATH_H diff --git a/ability/common/utils/include/contacts_string_utils.h b/ability/common/utils/include/contacts_string_utils.h new file mode 100644 index 0000000..4f8df18 --- /dev/null +++ b/ability/common/utils/include/contacts_string_utils.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_STRING_UTILS_H +#define CONTACT_STRING_UTILS_H + +#include +#include + +namespace OHOS { +namespace Contacts { +class ContactsStringUtils { +public: + ContactsStringUtils(); + ~ContactsStringUtils(); + static std::string &Trim(std::string &str); + static std::vector SplitStr(std::string str, std::string spSymbol); +}; +} // namespace Contacts +} // namespace OHOS + +#endif // STRING_UTILS_H \ No newline at end of file diff --git a/ability/common/utils/include/file_utils.h b/ability/common/utils/include/file_utils.h new file mode 100644 index 0000000..a78b1a2 --- /dev/null +++ b/ability/common/utils/include/file_utils.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef FILE_UTILS_H +#define FILE_UTILS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace OHOS { +namespace Contacts { +class FileUtils { +public: + FileUtils(); + ~FileUtils(); + int IsFolderExist(std::string path); + void Mkdir(std::string path); + void WriteStringToFileAppend(std::string dirStr, const std::string str); +}; +} // namespace Contacts +} // namespace OHOS +#endif // FILE_UTILS_H \ No newline at end of file diff --git a/ability/common/utils/include/merge_utils.h b/ability/common/utils/include/merge_utils.h new file mode 100644 index 0000000..d8ec4fb --- /dev/null +++ b/ability/common/utils/include/merge_utils.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MERGE_UTILS_H +#define MERGE_UTILS_H + +#include "candidate.h" +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" +#include "rdb_errno.h" +#include "rdb_store.h" +#include "result_set.h" + +namespace OHOS { +namespace Contacts { +class MergeUtils { +public: + MergeUtils(); + ~MergeUtils(); + std::set QueryRawContactByType( + std::shared_ptr store, int rawId, int typeId); + std::set QueryDataDetailInfo( + std::shared_ptr store, std::set &rawIds, int typeId); + std::set QueryDataExecute( + std::shared_ptr store, std::set rawIds, int typeId); + std::vector QueryByDataName( + int rawId, std::set data, std::shared_ptr store); + bool SetEqual(std::set setLeft, std::set setRight); + void AddHasJudgeForRawId( + std::shared_ptr store, int rawId, OHOS::NativeRdb::ValuesBucket &value); + void GetRawIdsByRawId(std::shared_ptr store, int rawId, std::set &rawIds); +}; +} // namespace Contacts +} // namespace OHOS +#endif // MERGE_UTILS_H diff --git a/ability/common/utils/include/predicates_convert.h b/ability/common/utils/include/predicates_convert.h new file mode 100644 index 0000000..3a5d4b5 --- /dev/null +++ b/ability/common/utils/include/predicates_convert.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef PREDICATES_CONVERT_H +#define PREDICATES_CONVERT_H + +#include "data_ability_predicates.h" +#include "predicates_utils.h" +#include "rdb_predicates.h" + +namespace OHOS { +namespace Contacts { +class PredicatesConvert { +public: + PredicatesConvert(); + ~PredicatesConvert(); + OHOS::NativeRdb::RdbPredicates ConvertPredicates( + std::string tableName, OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates); + OHOS::NativeRdb::RdbPredicates CopyPredicates( + std::string tableName, OHOS::NativeRdb::RdbPredicates &oldRdbPredicates); +}; +} // namespace Contacts +} // namespace OHOS +#endif // PREDICATES_CONVERT_H \ No newline at end of file diff --git a/ability/common/utils/include/sql_analyzer.h b/ability/common/utils/include/sql_analyzer.h new file mode 100644 index 0000000..387b063 --- /dev/null +++ b/ability/common/utils/include/sql_analyzer.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef SQL_ANALYZER_H +#define SQL_ANALYZER_H + +#include + +#include "values_bucket.h" + +#include "common.h" + +namespace OHOS { +namespace Contacts { +class SqlAnalyzer { +public: + SqlAnalyzer(); + ~SqlAnalyzer(); + + bool CheckValuesBucket(const NativeRdb::ValuesBucket &value); + bool FindIllegalWords(std::string sql); + bool StrCheck(char &ch, std::size_t strlen, std::string sql, std::size_t &pos); + bool CharCheck(char &ch, std::string sql, std::size_t &pos); + +private: + inline bool IsNumber(char ch) + { + return (ch >= '0' && ch <= '9'); + } + inline bool IsLetter(char ch) + { + return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '_'); + } + inline bool IsLetterNumber(char ch) + { + return IsNumber(ch) || IsLetter(ch); + } + inline char PickChar(std::string str, std::size_t index) + { + if (index < str.length()) { + return str.at(index); + } + return '\0'; + } + inline int IsInStr(char ch, std::string str) + { + std::size_t pos = str.find(ch); + if (pos == std::string::npos) { + return OPERATION_ERROR; + } + return 0; + } +}; +} // namespace Contacts +} // namespace OHOS +#endif // SQL_ANALYZER_H diff --git a/ability/common/utils/include/uri_utils.h b/ability/common/utils/include/uri_utils.h new file mode 100644 index 0000000..dca8006 --- /dev/null +++ b/ability/common/utils/include/uri_utils.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef URI_UTILS_H +#define URI_UTILS_H + +#include "uri.h" + +#include +#include +#include + +namespace OHOS { +namespace Contacts { +class UriUtils { +public: + UriUtils(); + ~UriUtils(); + std::vector split(const std::string &str, const std::string &split); + std::map getQueryParameter(OHOS::Uri &uri); + int UriParse(OHOS::Uri &uri, std::map &keyMap); +}; +} // namespace Contacts +} // namespace OHOS +#endif // URI_UTILS_H diff --git a/ability/common/utils/src/contacts_common_event.cpp b/ability/common/utils/src/contacts_common_event.cpp new file mode 100644 index 0000000..cc7b5dc --- /dev/null +++ b/ability/common/utils/src/contacts_common_event.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2021 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 "contacts_common_event.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr ContactsCommonEvent::subscriber = nullptr; + +void ContactsCommonEvent::OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data) +{ + OHOS::AAFwk::Want want = data.GetWant(); + std::string action = data.GetWant().GetAction(); + HILOG_INFO("ContactsCommonEvent::OnReceiveEvent action = %{public}s", action.c_str()); + int msgCode = data.GetCode(); + std::string msgData = data.GetData(); + HILOG_INFO("ContactsCommonEvent::OnReceiveEvent msgData = %{public}s", msgData.c_str()); + HILOG_INFO("ContactsCommonEvent::OnReceiveEvent msgCode = %{public}d", msgCode); +} + +bool ContactsCommonEvent::PublishContactEvent( + const OHOS::AAFwk::Want &want, int eventCode, const std::string &eventData) +{ + OHOS::EventFwk::CommonEventData data; + data.SetWant(want); + data.SetCode(eventCode); + data.SetData(eventData); + OHOS::EventFwk::CommonEventPublishInfo publishInfo; + publishInfo.SetOrdered(true); + bool publishResult = OHOS::EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr); + HILOG_INFO("PublishContactEvent end publishResult = %{public}d", publishResult); + return publishResult; +} + +void ContactsCommonEvent::UnregisterSubscriber(std::shared_ptr subscriber) +{ + if (subscriber != nullptr) { + bool subscribeResult = OHOS::EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriber); + subscriber = nullptr; + HILOG_INFO("UnregisterSubscriber contacts end###subscribeResult = %{public}d", subscribeResult); + } +} + +void ContactsCommonEvent::RegisterSubscriber() +{ + OHOS::EventFwk::MatchingSkills matchingSkills; + matchingSkills.AddEvent(CONTACT_EVENT); + matchingSkills.AddEvent(CALL_LOG_EVENT); + matchingSkills.AddEvent(VOICEMAIL_EVENT); + OHOS::EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); + subscriber = std::make_shared(subscriberInfo); + bool subscribeResult = OHOS::EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber); + HILOG_INFO("RegisterSubscriber contacts end###subscribeResult = %{public}d", subscribeResult); +} + +void ContactsCommonEvent::SendContactChange(int actionCode) +{ + OHOS::AAFwk::Want want; + int32_t eventCode = CONTACT_EVENT_CODE; + want.SetParam("contactsActionCode", actionCode); + want.SetAction(CONTACT_EVENT); + std::string eventData("ContactChange"); + PublishContactEvent(want, eventCode, eventData); +} + +void ContactsCommonEvent::SendCallLogChange(int actionCode) +{ + OHOS::AAFwk::Want want; + int32_t eventCode = CALL_LOG_EVENT_CODE; + want.SetParam("contactsActionCode", actionCode); + want.SetAction(CALL_LOG_EVENT); + std::string eventData("CallLogChange"); + PublishContactEvent(want, eventCode, eventData); +} + +void ContactsCommonEvent::SendVoiceMailChange(int actionCode) +{ + OHOS::AAFwk::Want want; + int32_t eventCode = VOICEMAIL_EVENT_CODE; + want.SetParam("contactsActionCode", actionCode); + want.SetAction(VOICEMAIL_EVENT); + std::string eventData("voicemailChange"); + PublishContactEvent(want, eventCode, eventData); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/contacts_json_utils.cpp b/ability/common/utils/src/contacts_json_utils.cpp new file mode 100644 index 0000000..167eea3 --- /dev/null +++ b/ability/common/utils/src/contacts_json_utils.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 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 "contacts_json_utils.h" + +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +ContactsJsonUtils::ContactsJsonUtils(void) +{ +} + +ContactsJsonUtils::~ContactsJsonUtils() +{ +} + +std::string ContactsJsonUtils::GetDeleteData(std::unique_ptr &resultSet) +{ + Json::Value dataResult; + Json::Value arrayValue; + ConvertResultSet(arrayValue, resultSet); + dataResult[AliasName::DATA] = arrayValue; + Json::StreamWriterBuilder builder; + const std::string personal_ringtone = Json::writeString(builder, dataResult); + return personal_ringtone; +} + +void ContactsJsonUtils::ConvertResultSet( + Json::Value &arrayValue, std::unique_ptr &resultSet) +{ + int resultSetNum = resultSet->GoToFirstRow(); + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + Json::Value data; + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + GetValue(columnNames, i, data, resultSet); + } + arrayValue.append(data); + resultSetNum = resultSet->GoToNextRow(); + } +} + +void ContactsJsonUtils::GetValue(std::vector &columnNames, int &index, Json::Value &data, + std::unique_ptr &resultSet) +{ + std::string typeValue = columnNames[index]; + int columnIndex; + resultSet->GetColumnIndex(typeValue, columnIndex); + OHOS::NativeRdb::ColumnType columnType; + resultSet->GetColumnType(columnIndex, columnType); + if (columnType == OHOS::NativeRdb::ColumnType::TYPE_INTEGER) { + int intValue; + resultSet->GetInt(columnIndex, intValue); + data[typeValue] = intValue; + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_FLOAT) { + double doubleValue; + resultSet->GetDouble(columnIndex, doubleValue); + data[typeValue] = doubleValue; + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_STRING) { + std::string stringValue; + resultSet->GetString(columnIndex, stringValue); + if (!stringValue.empty()) { + data[typeValue] = stringValue; + } + } +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/contacts_path.cpp b/ability/common/utils/src/contacts_path.cpp new file mode 100644 index 0000000..7d7c86a --- /dev/null +++ b/ability/common/utils/src/contacts_path.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 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 "contacts_path.h" + +namespace OHOS { +namespace Contacts { +std::string ContactsPath::RDB_PATH = ""; +std::string ContactsPath::DUMP_PATH = ""; +std::string ContactsPath::RDB_BACKUP_PATH = ""; + +ContactsPath::ContactsPath(void) +{ +} + +ContactsPath::~ContactsPath() +{ +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/contacts_string_utils.cpp b/ability/common/utils/src/contacts_string_utils.cpp new file mode 100644 index 0000000..3554f8a --- /dev/null +++ b/ability/common/utils/src/contacts_string_utils.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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 "contacts_string_utils.h" + +namespace OHOS { +namespace Contacts { +ContactsStringUtils::ContactsStringUtils() +{ +} + +ContactsStringUtils::~ContactsStringUtils() +{ +} + +std::vector ContactsStringUtils::SplitStr(std::string str, std::string spSymbol) +{ + std::vector result; + std::string::size_type i = 0; + Trim(str); + std::string::size_type found = str.find(spSymbol); + if (found != std::string::npos) { + while (found != std::string::npos) { + std::string value = str.substr(i, found - i); + Trim(value); + if (!value.empty()) { + result.push_back(value); + } + i = found + spSymbol.size(); + found = str.find(spSymbol, i); + } + std::string lastv = str.substr(i, str.size() - i); + Trim(lastv); + if (!lastv.empty()) { + result.push_back(lastv); + } + } + return result; +} + +std::string &ContactsStringUtils::Trim(std::string &str) +{ + if (str.empty()) { + return str; + } + str.erase(0, str.find_first_not_of(" ")); + str.erase(str.find_last_not_of(" ") + 1); + return str; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/file_utils.cpp b/ability/common/utils/src/file_utils.cpp new file mode 100644 index 0000000..cbf61d7 --- /dev/null +++ b/ability/common/utils/src/file_utils.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021 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 "file_utils.h" + +#include "common.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +FileUtils::FileUtils(void) +{ +} + +FileUtils::~FileUtils() +{ +} + +int FileUtils::IsFolderExist(std::string path) +{ + DIR *dp; + if ((dp = opendir(path.c_str())) == NULL) { + HILOG_ERROR("FileUtils file NULL"); + return OPERATION_ERROR; + } + closedir(dp); + return OPERATION_OK; +} + +void FileUtils::Mkdir(std::string path) +{ + if (IsFolderExist(path) == OPERATION_ERROR) { + int isCreate = ::mkdir(path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO); + HILOG_INFO("FileUtils : mkdir = %{public}d", isCreate); + } +} + +void FileUtils::WriteStringToFileAppend(std::string dirStr, const std::string str) +{ + time_t backupTime = time(nullptr); + if (backupTime == 0) { + HILOG_ERROR("FileUtils : WriteStringToFileAppend time_t null"); + return; + } + dirStr.append("/").append(std::to_string(backupTime)).append(".log"); + std::ofstream OsWrite(dirStr, std::ofstream::app); + OsWrite << str; + OsWrite << std::endl; + OsWrite.close(); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/merge_utils.cpp b/ability/common/utils/src/merge_utils.cpp new file mode 100644 index 0000000..8b02c14 --- /dev/null +++ b/ability/common/utils/src/merge_utils.cpp @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2021 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 "merge_utils.h" + +#include "contacts_columns.h" +#include "contacts_database.h" + +namespace OHOS { +namespace Contacts { +MergeUtils::MergeUtils(void) +{ +} + +MergeUtils::~MergeUtils() +{ +} + +std::set MergeUtils::QueryRawContactByType( + std::shared_ptr store, int rawId, int typeId) +{ + std::string sql = "SELECT "; + sql.append(ContactPublicColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::CONTACT_ID) + .append(" = (SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ?") + .append(" AND is_deleted = 0 )"); + std::vector selectionArgs; + selectionArgs.push_back(std::to_string(rawId)); + std::unique_ptr rawIdsSet = store->QuerySql(sql, selectionArgs); + std::set rawIds; + int resultSetNum = rawIdsSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + rawIdsSet->GetInt(0, value); + rawIds.insert(value); + resultSetNum = rawIdsSet->GoToNextRow(); + } + rawIdsSet->Close(); + return QueryDataExecute(store, rawIds, typeId); +} + +std::set MergeUtils::QueryDataExecute( + std::shared_ptr store, std::set rawIds, int typeId) +{ + std::set result; + int size = rawIds.size(); + if (size <= 0) { + return result; + } + std::string query = "SELECT "; + query.append(ContactDataColumns::DETAIL_INFO) + .append(" FROM ") + .append(ContactTableName::CONTACT_DATA) + .append(" WHERE "); + for (auto rawId = rawIds.begin(); rawId != rawIds.end(); ++rawId) { + query.append(ContactDataColumns::RAW_CONTACT_ID) + .append(" = ") + .append(std::to_string(*rawId)) + .append(" AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ? "); + if (*rawId != *rawIds.rbegin()) { + query.append(" OR "); + } + } + std::vector selectionArgs; + selectionArgs.push_back(std::to_string(typeId)); + std::unique_ptr resultSet = store->QuerySql(query, selectionArgs); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string value; + resultSet->GetString(0, value); + if (!value.empty()) { + result.insert(value); + } + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return result; +} + +std::vector MergeUtils::QueryByDataName( + int rawId, std::set data, std::shared_ptr store) +{ + std::vector ids; + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + for (auto it = data.begin(); it != data.end(); it++) { + std::string query = "SELECT "; + query.append(ContactDataColumns::RAW_CONTACT_ID) + .append(" FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::DETAIL_INFO) + .append(" = '") + .append(*it) + .append("' AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(nameType)) + .append(" AND is_deleted = 0"); + std::unique_ptr resultSet = store->QuerySql(query); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + resultSet->GetInt(0, value); + if (value != rawId) { + ids.push_back(value); + } + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + } + return ids; +} + +bool MergeUtils::SetEqual(std::set setLeft, std::set setRight) +{ + if (setLeft.size() != setRight.size()) { + return false; + } + std::map, std::string> mTemp; + mTemp[setLeft] = "1"; + if (mTemp.find(setRight) == mTemp.end()) { + return false; + } + return true; +} + +void MergeUtils::AddHasJudgeForRawId( + std::shared_ptr store, int rawId, OHOS::NativeRdb::ValuesBucket &values) +{ + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + int phoneType = contactsDataBase->GetTypeId(ContentTypeData::PHONE); + int emailType = contactsDataBase->GetTypeId(ContentTypeData::EMAIL); + int groupType = contactsDataBase->GetTypeId(ContentTypeData::GROUP_MEMBERSHIP); + std::vector types; + types.push_back(nameType); + types.push_back(phoneType); + types.push_back(emailType); + types.push_back(groupType); + int size = types.size(); + for (int i = 0; i < size; i++) { + std::string sql = "SELECT 1 FROM contact_data WHERE type_id = " + std::to_string(types[i]); + sql.append(" AND raw_contact_id = " + std::to_string(rawId)).append(" LIMIT 1"); + std::unique_ptr resultSet = store->QuerySql(sql); + int resultSetNum = resultSet->GoToFirstRow(); + if (resultSetNum == 0) { + switch (i) { + case HAS_NAME: + values.Delete(ContactColumns::HAS_DISPLAY_NAME); + values.PutInt(ContactColumns::HAS_DISPLAY_NAME, 1); + break; + case HAS_PHONE: + values.Delete(ContactColumns::HAS_PHONE_NUMBER); + values.PutInt(ContactColumns::HAS_PHONE_NUMBER, 1); + break; + case HAS_EMAIL: + values.Delete(ContactColumns::HAS_EMAIL); + values.PutInt(ContactColumns::HAS_EMAIL, 1); + break; + case HAS_GROUP: + values.Delete(ContactColumns::HAS_GROUP); + values.PutInt(ContactColumns::HAS_GROUP, 1); + break; + default: + HILOG_ERROR("AddHasJudge switch code error"); + break; + } + } + } +} + +void MergeUtils::GetRawIdsByRawId(std::shared_ptr store, int rawId, std::set &rawIds) +{ + std::string queryMergeId = "SELECT "; + queryMergeId.append(ContactPublicColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::CONTACT_ID) + .append(" = ") + .append(" (SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ? ") + .append(" ) AND is_deleted = 0"); + std::vector selectionArgs; + selectionArgs.push_back(std::to_string(rawId)); + std::unique_ptr rawIdsSet = store->QuerySql(queryMergeId, selectionArgs); + int resultSetNum = rawIdsSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + rawIdsSet->GetInt(0, value); + if (value != rawId) { + rawIds.insert(value); + } + resultSetNum = rawIdsSet->GoToNextRow(); + } + rawIdsSet->Close(); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/predicates_convert.cpp b/ability/common/utils/src/predicates_convert.cpp new file mode 100644 index 0000000..1dcf3dc --- /dev/null +++ b/ability/common/utils/src/predicates_convert.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 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 "predicates_convert.h" + +namespace OHOS { +namespace Contacts { +PredicatesConvert::PredicatesConvert(void) +{ +} + +PredicatesConvert::~PredicatesConvert() +{ +} + +OHOS::NativeRdb::RdbPredicates PredicatesConvert::ConvertPredicates( + std::string tableName, OHOS::NativeRdb::DataAbilityPredicates &dataPredicates) +{ + OHOS::NativeRdb::RdbPredicates predicates(tableName); + OHOS::NativeRdb::PredicatesUtils::SetWhereClauseAndArgs( + &predicates, dataPredicates.GetWhereClause(), dataPredicates.GetWhereArgs()); + OHOS::NativeRdb::PredicatesUtils::SetAttributes(&predicates, dataPredicates.IsDistinct(), dataPredicates.GetIndex(), + dataPredicates.GetGroup(), dataPredicates.GetOrder(), dataPredicates.GetLimit(), dataPredicates.GetOffset()); + return predicates; +} + +OHOS::NativeRdb::RdbPredicates PredicatesConvert::CopyPredicates( + std::string tableName, OHOS::NativeRdb::RdbPredicates &oldRdbPredicates) +{ + OHOS::NativeRdb::RdbPredicates predicates(tableName); + OHOS::NativeRdb::PredicatesUtils::SetWhereClauseAndArgs( + &predicates, oldRdbPredicates.GetWhereClause(), oldRdbPredicates.GetWhereArgs()); + OHOS::NativeRdb::PredicatesUtils::SetAttributes(&predicates, oldRdbPredicates.IsDistinct(), + oldRdbPredicates.GetIndex(), oldRdbPredicates.GetGroup(), oldRdbPredicates.GetOrder(), + oldRdbPredicates.GetLimit(), oldRdbPredicates.GetOffset()); + return predicates; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/sql_analyzer.cpp b/ability/common/utils/src/sql_analyzer.cpp new file mode 100644 index 0000000..27d7026 --- /dev/null +++ b/ability/common/utils/src/sql_analyzer.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021 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 "sql_analyzer.h" + +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +constexpr int POS_ADD_TWO = 2; + +SqlAnalyzer::SqlAnalyzer() +{ +} + +SqlAnalyzer::~SqlAnalyzer() +{ +} + +bool SqlAnalyzer::CheckValuesBucket(const NativeRdb::ValuesBucket &value) +{ + std::map valuesMap; + value.GetAll(valuesMap); + for (auto it = valuesMap.begin(); it != valuesMap.end(); ++it) { + std::string key = it->first; + bool isKey = FindIllegalWords(key); + if (isKey) { + HILOG_ERROR("SqlAnalyzer CheckValuesBucket key is %{public}s error", key.c_str()); + return false; + } + NativeRdb::ValueObject value = it->second; + if (value.GetType() == NativeRdb::ValueObjectType::TYPE_STRING) { + std::string str; + value.GetString(str); + bool isValue = FindIllegalWords(str); + if (isValue) { + HILOG_ERROR("SqlAnalyzer CheckValuesBucket value is %{public}s error", str.c_str()); + return false; + } + } + } + return true; +} + +bool SqlAnalyzer::CharCheck(char &ch, std::string sql, std::size_t &pos) +{ + if (ch == '[') { + pos++; + std::size_t found = sql.find(']', pos); + if (found == std::string::npos) { + return true; + } + pos++; + } + if (ch == '-' && PickChar(sql, pos + 1) == '-') { + pos += POS_ADD_TWO; + std::size_t found = sql.find('\n', pos); + if (found == std::string::npos) { + return true; + } + pos++; + } + if (ch == '/' && PickChar(sql, pos + 1) == '*') { + pos += POS_ADD_TWO; + std::size_t found = sql.find("*/", pos); + if (found == std::string::npos) { + return true; + } + pos += POS_ADD_TWO; + } + if (ch == ';') { + return true; + } + pos++; + return false; +} + +bool SqlAnalyzer::StrCheck(char &ch, std::size_t strlen, std::string sql, std::size_t &pos) +{ + if (IsInStr(ch, "'\"`") == 0) { + pos++; + while (pos < strlen) { + std::size_t found = sql.find(ch, pos); + if (found == std::string::npos) { + return true; + } + if (PickChar(sql, pos + 1) != ch) { + break; + } + pos += POS_ADD_TWO; + } + } + return false; +} + +bool SqlAnalyzer::FindIllegalWords(std::string sql) +{ + if (sql.empty()) { + return false; + } + std::size_t pos = 0; + std::size_t strlen = sql.length(); + while (pos < strlen) { + char ch = PickChar(sql, pos); + if (IsLetter(ch)) { + std::size_t start = pos; + pos++; + while (IsLetterNumber(PickChar(sql, pos))) { + pos++; + } + std::size_t count = pos - start + 1; + sql.substr(start, count); + } + if (IsInStr(ch, "'\"`") == 0) { + if (StrCheck(ch, strlen, sql, pos)) { + return true; + } else { + continue; + } + } + if (CharCheck(ch, sql, pos)) { + return true; + } else { + continue; + } + } + return false; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/common/utils/src/uri_utils.cpp b/ability/common/utils/src/uri_utils.cpp new file mode 100644 index 0000000..00b727d --- /dev/null +++ b/ability/common/utils/src/uri_utils.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021 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 "uri_utils.h" +#include "common.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +UriUtils::UriUtils(void) +{ +} + +UriUtils::~UriUtils() +{ +} + +std::map UriUtils::getQueryParameter(OHOS::Uri &uri) +{ + std::map mapQuery; + std::string query = uri.GetQuery(); + if (query.empty()) { + return mapQuery; + } + std::vector tempVector = split(query, "&"); + int size = tempVector.size(); + for (int i = 0; i < size; i++) { + std::vector childTempVector = split(tempVector[i], "="); + size_t size = childTempVector.size(); + if (size != REQUEST_PARAMS_NUM) { + HILOG_ERROR("UriUtils uriParse getQueryParameter query parameter error"); + break; + } + std::string key = childTempVector[0]; + std::string value = childTempVector[1]; + mapQuery.insert(std::make_pair(key, value)); + } + return mapQuery; +} + +std::vector UriUtils::split(const std::string &str, const std::string &split) +{ + char *saveChar = nullptr; + char *token = strtok_r(const_cast(str.c_str()), split.c_str(), &saveChar); + std::vector result; + while (token != nullptr) { + result.emplace_back(token); + token = strtok_r(nullptr, split.c_str(), &saveChar); + } + return result; +} + +int UriUtils::UriParse(OHOS::Uri &uri, std::map &keyMap) +{ + std::string path = uri.GetPath(); + if (path.empty()) { + return OPERATION_ERROR; + } + std::map::iterator iterator = keyMap.find(path); + if (iterator != keyMap.end()) { + return iterator->second; + } + return OPERATION_ERROR; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/datadisasterrecovery/include/database_disaster_recovery.h b/ability/datadisasterrecovery/include/database_disaster_recovery.h new file mode 100644 index 0000000..7bbe38b --- /dev/null +++ b/ability/datadisasterrecovery/include/database_disaster_recovery.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef DATABASE_DISASTER_RECOVERY_H +#define DATABASE_DISASTER_RECOVERY_H + +#include + +#include "rdb_store.h" + +namespace OHOS { +namespace Contacts { +class DataBaseDisasterRecovery { +public: + static std::shared_ptr GetInstance(); + ~DataBaseDisasterRecovery(); + int SQLliteCheckDb(); + int BackDatabase(); + int BackDatabase(std::string dataBaseName); + std::string GetBackUpDatabase(const std::shared_ptr &store_); + int RecoveryDatabase(std::string dataBaseName); + +private: + DataBaseDisasterRecovery(); + static std::shared_ptr instance_; + static std::map> redbStoreMap; + int SQLliteCheckDb(std::shared_ptr rdbStore, std::string dataBaseName); + static const std::string BACKUP_LINK_SYMBOL; + static const std::string BACKUP_SUFFIX; + static const std::string DB_OK; +}; +} // namespace Contacts +} // namespace OHOS +#endif // DATABASE_DISASTER_RECOVERY_H diff --git a/ability/datadisasterrecovery/src/database_disaster_recovery.cpp b/ability/datadisasterrecovery/src/database_disaster_recovery.cpp new file mode 100644 index 0000000..0607dfe --- /dev/null +++ b/ability/datadisasterrecovery/src/database_disaster_recovery.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2021 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 "database_disaster_recovery.h" + +#include + +#include "calllog_database.h" +#include "contacts_database.h" +#include "file_utils.h" +#include "profile_database.h" + +namespace OHOS { +namespace Contacts { +namespace { +std::mutex mtx_; +} + +const std::string DataBaseDisasterRecovery::BACKUP_LINK_SYMBOL = "_"; +const std::string DataBaseDisasterRecovery::BACKUP_SUFFIX = ".db"; +const std::string DataBaseDisasterRecovery::DB_OK = "ok"; +std::shared_ptr DataBaseDisasterRecovery::instance_ = nullptr; +std::map> DataBaseDisasterRecovery::redbStoreMap; + +std::shared_ptr DataBaseDisasterRecovery::GetInstance() +{ + if (instance_ == nullptr) { + instance_.reset(new DataBaseDisasterRecovery()); + } + return instance_; +} + +DataBaseDisasterRecovery::DataBaseDisasterRecovery() +{ +} + +DataBaseDisasterRecovery::~DataBaseDisasterRecovery() +{ +} + +int DataBaseDisasterRecovery::SQLliteCheckDb() +{ + mtx_.lock(); + int ret = OPERATION_ERROR; + HILOG_INFO("DataBaseDisasterRecovery SQLliteCheck start."); + redbStoreMap.clear(); + if (redbStoreMap.empty()) { + HILOG_ERROR("DataBaseDisasterRecovery redbStoreMap init. nullptr"); + std::shared_ptr profile = ProfileDatabase::GetInstance(); + std::shared_ptr contacts = ContactsDataBase::GetInstance(); + redbStoreMap.insert(std::make_pair(PROFILE_DATABASE_NAME, profile->store_)); + redbStoreMap.insert(std::make_pair(CONTACT_DATABASE_NAME, contacts->contactStore_)); + } + if (redbStoreMap.empty()) { + HILOG_ERROR("DataBaseDisasterRecovery SQLliteCheck redbStoreMap is empty"); + return RDB_OBJECT_EMPTY; + } + for (auto &kv : redbStoreMap) { + std::shared_ptr store_ = kv.second; + ret = SQLliteCheckDb(store_, kv.first); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DataBaseDisasterRecovery SQLliteCheckDb ERROR."); + mtx_.unlock(); + return ret; + } + } + mtx_.unlock(); + HILOG_INFO("DataBaseDisasterRecovery SQLliteCheck end."); + return RDB_EXECUTE_OK; +} + +int DataBaseDisasterRecovery::SQLliteCheckDb( + std::shared_ptr rdbStore, std::string dataBaseName) +{ + // default switch + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("DataBaseDisasterRecovery SQLliteCheck %{public}s store_ is nullptr", dataBaseName.c_str()); + return RDB_OBJECT_EMPTY; + } + std::string result; + store_->ExecuteAndGetString(result, "PRAGMA quick_check(0)"); + HILOG_INFO("DataBaseDisasterRecovery check %{public}s result is %{public}s", dataBaseName.c_str(), result.c_str()); + if (result == DB_OK) { + return RDB_EXECUTE_OK; + } + return RDB_EXECUTE_FAIL; +} + +int DataBaseDisasterRecovery::BackDatabase() +{ + // Recovery + HILOG_INFO("entry DataBaseDisasterRecovery"); + FileUtils fileUtils; + fileUtils.Mkdir(ContactsPath::RDB_BACKUP_PATH); + redbStoreMap.clear(); + if (redbStoreMap.empty()) { + HILOG_ERROR("DataBaseDisasterRecovery redbStoreMap init. nullptr"); + std::shared_ptr profile = ProfileDatabase::GetInstance(); + std::shared_ptr contacts = ContactsDataBase::GetInstance(); + redbStoreMap.insert(std::make_pair(PROFILE_DATABASE_NAME, profile->store_)); + redbStoreMap.insert(std::make_pair(CONTACT_DATABASE_NAME, contacts->contactStore_)); + } + if (redbStoreMap.empty()) { + HILOG_ERROR("DataBaseDisasterRecovery SQLliteCheck redbStoreMap is empty"); + return RDB_OBJECT_EMPTY; + } + for (auto &kv : redbStoreMap) { + std::shared_ptr store_ = kv.second; + int version; + store_->GetVersion(version); + HILOG_INFO("backup version is %{public}d", version); + int ret = BackDatabase(kv.first); + HILOG_INFO("BackDatabase %{public}s status is %{public}d", kv.first.c_str(), ret); + } + return RDB_EXECUTE_OK; +} + +int DataBaseDisasterRecovery::BackDatabase(std::string dataBaseName) +{ + mtx_.lock(); + auto iter = redbStoreMap.find(dataBaseName); + HILOG_INFO("DataBaseDisasterRecovery BackDatabase redbStoreMap size is %{public}d", redbStoreMap.size()); + if (iter != redbStoreMap.end()) { + std::shared_ptr store_ = iter->second; + if (store_ == nullptr) { + HILOG_ERROR("DataBaseDisasterRecovery BackDatabase %{public}s store_ is nullptr", dataBaseName.c_str()); + return RDB_OBJECT_EMPTY; + } + std::string dbPath = ContactsPath::RDB_BACKUP_PATH + dataBaseName + BACKUP_SUFFIX; + int64_t outRowId = 0; + OHOS::NativeRdb::ValuesBucket values; + values.PutString(DatabaseBackupColumns::BACKUP_PATH, dbPath); + int ret = store_->Insert(outRowId, ContactTableName::DATABASE_BACKUP_TASK, values); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DataBaseDisasterRecovery Insert filed, status is %{public}d.", ret); + mtx_.unlock(); + return RDB_EXECUTE_FAIL; + } + OHOS::NativeRdb::RdbHelper::DeleteRdbStore(dbPath); + ret = store_->Backup(dbPath, std::vector()); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DataBaseDisasterRecovery Backup filed, status is %{public}d.", ret); + mtx_.unlock(); + return RDB_EXECUTE_FAIL; + } + } + mtx_.unlock(); + return RDB_EXECUTE_OK; +} + +std::string DataBaseDisasterRecovery::GetBackUpDatabase(const std::shared_ptr &store_) +{ + std::string sql = "select backup_path from "; + sql.append(ContactTableName::DATABASE_BACKUP_TASK).append(" order by backup_time desc limit 0,1"); + std::unique_ptr result = store_->QuerySql(sql, std::vector()); + int resultSetNum = result->GoToFirstRow(); + std::string currValue; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int currValueIndex; + result->GetColumnIndex(DatabaseBackupColumns::BACKUP_PATH, currValueIndex); + result->GetString(currValueIndex, currValue); + resultSetNum = result->GoToNextRow(); + break; + } + result->Close(); + return currValue; +} + +int DataBaseDisasterRecovery::RecoveryDatabase(std::string dataBaseName) +{ + if (dataBaseName == PROFILE_DATABASE_NAME) { + std::string buckupPath = ContactsPath::RDB_BACKUP_PATH + dataBaseName + BACKUP_SUFFIX; + ProfileDatabase::DestroyInstanceAndRestore(buckupPath); + } else if (dataBaseName == CONTACT_DATABASE_NAME) { + std::string buckupPath = ContactsPath::RDB_BACKUP_PATH + dataBaseName + BACKUP_SUFFIX; + ContactsDataBase::DestroyInstanceAndRestore(buckupPath); + } + return RDB_EXECUTE_OK; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/merge/include/candidate.h b/ability/merge/include/candidate.h new file mode 100644 index 0000000..3fbaf76 --- /dev/null +++ b/ability/merge/include/candidate.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CANDIDATE_H +#define CANDIDATE_H + +#include + +namespace OHOS { +namespace Contacts { +class Candidate { +public: + Candidate(); + ~Candidate(); + std::set autoIds_; + std::set manualIds_; + int mergeMode_ = 0; +}; +} // namespace Contacts +} // namespace OHOS +#endif // CANDIDATE_H diff --git a/ability/merge/include/candidate_status.h b/ability/merge/include/candidate_status.h new file mode 100644 index 0000000..4d6135f --- /dev/null +++ b/ability/merge/include/candidate_status.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CANDIDATESCORE_H +#define CANDIDATESCORE_H + +#include "rdb_errno.h" +#include "rdb_store.h" +#include "result_set.h" + +#include "candidate.h" + +namespace OHOS { +namespace Contacts { +class CandidateStatus { +public: + CandidateStatus(); + ~CandidateStatus(); + Candidate QueryAllForMerge(std::shared_ptr store, int rawId); + +private: + int PhoneMatch(std::shared_ptr store, std::set phones, int id); + bool IsMerged(std::shared_ptr store, int rawId); + bool IsNeedMerge(std::shared_ptr store, int rawId); + bool IsMergeStatus(std::shared_ptr store, int rawId); + bool JudgeDataDifferent(std::shared_ptr store, std::vector ids, int rawId); + void AddMergedStatus(Candidate &candidate); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CANDIDATESCORE_H diff --git a/ability/merge/include/match_candidate.h b/ability/merge/include/match_candidate.h new file mode 100644 index 0000000..16b298f --- /dev/null +++ b/ability/merge/include/match_candidate.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MATCHCANDIDATE_H +#define MATCHCANDIDATE_H + +#include "candidate_status.h" + +namespace OHOS { +namespace Contacts { +class MatchCandidate { +public: + MatchCandidate(); + ~MatchCandidate(); + int FindMatchContact(std::shared_ptr store, int rawId); + int Split(std::shared_ptr store, int rawId); + void AddHasByRawId(std::shared_ptr store, int rawId); + +private: + int UpdateSearch(std::shared_ptr store, int rawId, int contactsId); + int ExecuteUpdateMode(std::shared_ptr store, std::set Ids, int mode); + int UpdateMergeMode(std::shared_ptr store, Candidate candidate); + int64_t AddNewContact(std::shared_ptr store, int rawId); + int UpdateRawContact(std::shared_ptr store, int rawId, int64_t contactsId); + std::vector ResultSetToValuesBucket( + std::unique_ptr &resultSet); +}; +} // namespace Contacts +} // namespace OHOS +#endif // MATCHCANDIDATE_H diff --git a/ability/merge/include/merger_contacts.h b/ability/merge/include/merger_contacts.h new file mode 100644 index 0000000..4f4f265 --- /dev/null +++ b/ability/merge/include/merger_contacts.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MERGERCONTACT_H +#define MERGERCONTACT_H + +#include "data_ability_predicates.h" +#include "rdb_store.h" +#include "result_set.h" + +namespace OHOS { +namespace Contacts { +class MergerContacts { +public: + MergerContacts(); + ~MergerContacts(); + int ForceContactMerge(std::shared_ptr, std::set); + int ContactMerge(std::shared_ptr); + int ReContactMerge(std::shared_ptr, const OHOS::NativeRdb::DataAbilityPredicates &); + std::shared_ptr SelectCandidate(std::shared_ptr); + +private: + void UpdateIdsByName( + std::shared_ptr, std::set, std::set, std::vector> &); + std::vector> SelectIdsByName(std::shared_ptr, std::set); + void UpdateCandidate(std::shared_ptr, std::vector, std::vector> &); + int MergeCircle(std::shared_ptr, std::vector>); + std::vector> QueryMergeContacts(std::shared_ptr, int); + std::string QueryCandidateName(std::shared_ptr, int); + void UpdateRawContacts(std::shared_ptr, int, std::set); + void UpdateRawContactsExecute( + std::shared_ptr store, int minContactId, std::set Ids); + std::set HandleIds(std::shared_ptr, std::set); + int DeleteContacts(std::shared_ptr, int, std::set); + std::set QueryTargetName(std::shared_ptr, int, std::set); + bool isNameMatch(std::shared_ptr, std::set); + int ManualMergeOperation(std::shared_ptr store, int minId, std::set handledIds); +}; +} // namespace Contacts +} // namespace OHOS + +#endif // MERGERCONTACT_H \ No newline at end of file diff --git a/ability/merge/src/candidate.cpp b/ability/merge/src/candidate.cpp new file mode 100644 index 0000000..8cfc2ad --- /dev/null +++ b/ability/merge/src/candidate.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 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 "candidate.h" + +namespace OHOS { +namespace Contacts { +Candidate::Candidate() +{ +} + +Candidate::~Candidate() +{ +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/merge/src/candidate_status.cpp b/ability/merge/src/candidate_status.cpp new file mode 100644 index 0000000..dce0337 --- /dev/null +++ b/ability/merge/src/candidate_status.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2021 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 "candidate_status.h" + +#include "common.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "hilog_wrapper.h" +#include "merge_utils.h" + +namespace OHOS { +namespace Contacts { +CandidateStatus::CandidateStatus() +{ +} + +CandidateStatus::~CandidateStatus() +{ +} + +/** + * @brief Query operation for merge candidate + * + * @param store Conditions for query operation + * @param rawId Contacts's raw_contact_id to query + * + * @return Candidate contact raw_contact_id collection + */ +Candidate CandidateStatus::QueryAllForMerge(std::shared_ptr store, int rawId) +{ + Candidate candidate; + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + int phoneType = contactsDataBase->GetTypeId(ContentTypeData::PHONE); + MergeUtils mergeUtils; + std::set names = mergeUtils.QueryRawContactByType(store, rawId, nameType); + // query other name same raw_contact_id + std::vector nameIds = mergeUtils.QueryByDataName(rawId, names, store); + // query current phone + std::set phones = mergeUtils.QueryRawContactByType(store, rawId, phoneType); + std::set autoIds; + std::set manualIds; + int size = nameIds.size(); + for (int i = 0; i < size; i++) { + if (!IsNeedMerge(store, nameIds[i]) || !IsMergeStatus(store, nameIds[i])) { + continue; + } + std::set otherPhones = mergeUtils.QueryRawContactByType(store, nameIds[i], phoneType); + if (phones.empty() && otherPhones.empty()) { + autoIds.insert(nameIds[i]); + } + if (phones.empty() || otherPhones.empty()) { + manualIds.insert(nameIds[i]); + } + if (mergeUtils.SetEqual(phones, otherPhones)) { + autoIds.insert(nameIds[i]); + } else { + manualIds.insert(nameIds[i]); + } + } + candidate.autoIds_ = autoIds; + candidate.manualIds_ = manualIds; + AddMergedStatus(candidate); + HILOG_INFO("QueryAllForMerge mode is : %{public}d ", candidate.mergeMode_); + candidate.autoIds_.insert(rawId); + candidate.manualIds_.insert(rawId); + HILOG_INFO("QueryAllForMerge size is : %{public}d ", candidate.autoIds_.size()); + HILOG_INFO("QueryAllForMerge candidate.manualIds_ is : %{public}d ", candidate.manualIds_.size()); + return candidate; +} + +void CandidateStatus::AddMergedStatus(Candidate &candidate) +{ + if (!candidate.autoIds_.empty()) { + candidate.mergeMode_ = MERGE_MODE_AUTO; + } else if (!candidate.manualIds_.empty()) { + candidate.mergeMode_ = MERGE_MODE_MANUAL; + } else { + candidate.mergeMode_ = MERGE_MODE_DEFAULT; + } +} + +/** + * @brief Query operation for ensure if candidate need merge + * + * @param store Conditions for query operation + * @param rawId Contacts's raw_contact_id to query + * + * @return The result returned by the update operation + */ +bool CandidateStatus::IsNeedMerge(std::shared_ptr store, int rawId) +{ + std::string isNeedMergeSql = "SELECT "; + isNeedMergeSql.append(RawContactColumns::IS_NEED_MERGE) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawId)); + std::unique_ptr isNeedMergeSet = store->QuerySql(isNeedMergeSql); + bool isNeedMerge = false; + int resultSetNum = isNeedMergeSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + isNeedMergeSet->GetInt(0, value); + if (value == 1) { + isNeedMerge = true; + } else { + isNeedMerge = false; + } + resultSetNum = isNeedMergeSet->GoToNextRow(); + } + isNeedMergeSet->Close(); + return isNeedMerge; +} + +/** + * @brief Query operation for ensure if candidate has ture merge_status + * + * @param store Conditions for query operation + * @param rawId Contacts's raw_contact_id to query + * + * @return The result returned by the update operation + */ +bool CandidateStatus::IsMergeStatus(std::shared_ptr store, int rawId) +{ + std::string isMergeSwitchSql = "SELECT "; + isMergeSwitchSql.append(RawContactColumns::MERGE_STATUS) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawId)); + std::unique_ptr MergeSwitchSet = store->QuerySql(isMergeSwitchSql); + bool isMergeSwitch = false; + int resultSetNum = MergeSwitchSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + MergeSwitchSet->GetInt(0, value); + if (value == 1) { + isMergeSwitch = true; + } else { + isMergeSwitch = false; + } + resultSetNum = MergeSwitchSet->GoToNextRow(); + } + MergeSwitchSet->Close(); + return isMergeSwitch; +} + +/** + * @brief Query operation for ensure if candidate has merged + * + * @param store Conditions for query operation + * @param rawId Contacts's raw_contact_id to query + * + * @return The result returned by the update operation + */ +bool CandidateStatus::IsMerged(std::shared_ptr store, int rawId) +{ + std::string isNeedMergeSql = "SELECT "; + isNeedMergeSql.append(RawContactColumns::MERGE_MODE) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawId)); + std::unique_ptr isNeedMergeSet = store->QuerySql(isNeedMergeSql); + bool mergeMode = false; + int resultSetNum = isNeedMergeSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + isNeedMergeSet->GetInt(0, value); + if (value == 0) { + mergeMode = true; + } else { + mergeMode = false; + } + resultSetNum = isNeedMergeSet->GoToNextRow(); + } + isNeedMergeSet->Close(); + bool isMerged = mergeMode && !IsNeedMerge(store, rawId); + return isMerged; +} + +bool CandidateStatus::JudgeDataDifferent( + std::shared_ptr store, std::vector ids, int rawId) +{ + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + MergeUtils mergeUtils; + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + int phoneType = contactsDataBase->GetTypeId(ContentTypeData::PHONE); + std::set names = mergeUtils.QueryRawContactByType(store, rawId, nameType); + std::set phones = mergeUtils.QueryRawContactByType(store, rawId, phoneType); + int size = ids.size(); + for (int i = 0; i < size; i++) { + MergeUtils mergeIdUtils; + std::set idNames = mergeIdUtils.QueryRawContactByType(store, ids[i], nameType); + std::set idPhones = mergeIdUtils.QueryRawContactByType(store, ids[i], phoneType); + if (names != idNames || phones != idPhones) { + HILOG_INFO("CandidateStatus::JudgeDataDifferent is true"); + return true; + } + } + return false; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/merge/src/match_candidate.cpp b/ability/merge/src/match_candidate.cpp new file mode 100644 index 0000000..3471edd --- /dev/null +++ b/ability/merge/src/match_candidate.cpp @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2021 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 "match_candidate.h" + +#include "candidate.h" +#include "common.h" +#include "contacts.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "hilog_wrapper.h" +#include "merge_utils.h" + +namespace OHOS { +namespace Contacts { +MatchCandidate::MatchCandidate() +{ +} + +MatchCandidate::~MatchCandidate() +{ +} + +/** + * @brief Query operation for update candidate's merge_mode + * + * @param store Conditions for query operation + * @param rawId Contacts's raw_contact_id to query + * + * @return The result returned by the update operation + */ +int MatchCandidate::FindMatchContact(std::shared_ptr store, int rawId) +{ + CandidateStatus candidateStatus; + // Query candidates + Candidate candidate = candidateStatus.QueryAllForMerge(store, rawId); + if (candidate.autoIds_.size() > 1) { + int minAutoid = -1; + minAutoid = *candidate.autoIds_.begin(); + if (minAutoid != -1) { + std::string updateMergeTarget = "UPDATE "; + updateMergeTarget.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::IS_MERGE_TARGET) + .append(" = 1 ") + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(minAutoid)); + int code = store->ExecuteSql(updateMergeTarget); + if (code != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("update is_merge_target error code is : %{public}d ", code); + } + } + } + // update merge_mode + int retCode = UpdateMergeMode(store, candidate); + HILOG_INFO("MatchCandidate::FindMatchContact retCode : %{public}d ", retCode); + return retCode; +} + +/** + * @brief Split operation for already merged contacts + * + * @param store Conditions for split operation + * @param rawId Contacts's raw_contact_id to split + * + * @return The result returned by the split operation + */ +int MatchCandidate::Split(std::shared_ptr store, int rawId) +{ + if (store == nullptr) { + HILOG_ERROR("MatchCandidate::Split store is nullptr"); + return RDB_OBJECT_EMPTY; + } + std::set rawIds; + MergeUtils mergeUtils; + mergeUtils.GetRawIdsByRawId(store, rawId, rawIds); + if (rawIds.size() < 1) { + HILOG_ERROR("MatchCandidate::Split is error"); + return OPERATION_ERROR; + } + int code = RDB_EXECUTE_FAIL; + for (auto newRawId = rawIds.begin(); newRawId != rawIds.end(); ++newRawId) { + int contactsId = AddNewContact(store, *newRawId); + if (contactsId <= 0) { + continue; + } + code = UpdateRawContact(store, *newRawId, contactsId); + UpdateSearch(store, *newRawId, contactsId); + FindMatchContact(store, *newRawId); + } + AddHasByRawId(store, rawId); + return code; +} + +void MatchCandidate::AddHasByRawId(std::shared_ptr store, int rawId) +{ + MergeUtils mergeUtils; + OHOS::NativeRdb::ValuesBucket values; + values.PutInt(ContactColumns::HAS_DISPLAY_NAME, 0); + values.PutInt(ContactColumns::HAS_PHONE_NUMBER, 0); + values.PutInt(ContactColumns::HAS_EMAIL, 0); + values.PutInt(ContactColumns::HAS_GROUP, 0); + mergeUtils.AddHasJudgeForRawId(store, rawId, values); + Contacts contacts; + int contactsRet = contacts.UpdateContact(rawId, store, values); + HILOG_INFO("MatchCandidate::AddHasByRawId UpdateContact ret is : %{public}d", contactsRet); +} + +int MatchCandidate::UpdateSearch(std::shared_ptr store, int rawId, int contactsId) +{ + std::string sql = "UPDATE "; + sql.append(ContactTableName::SEARCH_CONTACT) + .append(" SET ") + .append(SearchContactColumns::CONTACT_ID) + .append(" = ") + .append(std::to_string(contactsId)) + .append(" WHERE ") + .append(SearchContactColumns::RAW_CONTACT_ID) + .append(" = ") + .append(std::to_string(rawId)); + int ret = store->ExecuteSql(sql); + return ret; +} + +int64_t MatchCandidate::AddNewContact(std::shared_ptr store, int rawId) +{ + MergeUtils mergeUtils; + std::string sql = "SELECT "; + sql.append(ContactColumns::PHOTO_ID) + .append(", ") + .append(ContactColumns::PHOTO_FILE_ID) + .append(", ") + .append(ContactColumns::PERSONAL_RINGTONE) + .append(", ") + .append(ContactColumns::COMPANY) + .append(", ") + .append(ContactColumns::POSITION) + .append(", ") + .append(ContactColumns::READ_ONLY) + .append(", ") + .append(ContactColumns::PERSONAL_NOTIFICATION_RINGTONE) + .append(", ") + .append(ContactColumns::IS_TRANSFER_VOICEMAIL) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawId)); + std::unique_ptr resultSet = store->QuerySql(sql); + std::vector value = ResultSetToValuesBucket(resultSet); + value[0].PutInt(ContactColumns::NAME_RAW_CONTACT_ID, rawId); + mergeUtils.AddHasJudgeForRawId(store, rawId, value[0]); + int64_t rawIdTemp = rawId; + int64_t contactsId = 0; + Contacts contacts; + int contactsRet = contacts.InsertContact(store, rawIdTemp, value[0], contactsId); + if (contactsRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("MatchCandidate AddNewContact is error %{public}d", contactsRet); + } + return contactsId; +} + +int MatchCandidate::ExecuteUpdateMode(std::shared_ptr store, std::set Ids, int mode) +{ + int ret = RDB_EXECUTE_FAIL; + if (Ids.size() < 1) { + HILOG_ERROR("MatchCandidate::ExecuteUpdateMode Ids.size() < 1"); + return ret; + } + std::string sql = "UPDATE "; + sql.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::MERGE_MODE) + .append(" = ") + .append(std::to_string(mode)) + .append(" WHERE "); + for (auto it = Ids.begin(); it != Ids.end(); it++) { + sql.append("id = ").append(std::to_string(*it)); + if (*it != *Ids.rbegin()) { + sql.append(" OR "); + } + } + ret = store->ExecuteSql(sql); + return ret; +} + +int MatchCandidate::UpdateMergeMode(std::shared_ptr store, Candidate candidate) +{ + HILOG_INFO("MatchCandidate::UpdateMergeMode is start mode :%{public}d ", candidate.mergeMode_); + int error = RDB_EXECUTE_FAIL; + switch (candidate.mergeMode_) { + case MERGE_MODE_DEFAULT: + error = ExecuteUpdateMode(store, candidate.manualIds_, MERGE_MODE_DEFAULT); + break; + case MERGE_MODE_MANUAL: + error = ExecuteUpdateMode(store, candidate.manualIds_, MERGE_MODE_MANUAL); + break; + case MERGE_MODE_AUTO: + error = ExecuteUpdateMode(store, candidate.autoIds_, MERGE_MODE_AUTO); + break; + default: + HILOG_ERROR("UpdateMergeMode mode error"); + break; + } + return error; +} + +int MatchCandidate::UpdateRawContact(std::shared_ptr store, int rawId, int64_t contactsId) +{ + std::string sql = "UPDATE "; + sql.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::CONTACT_ID) + .append(" = ") + .append(std::to_string(contactsId)) + .append(", ") + .append(RawContactColumns::MERGE_MODE) + .append(" = 0, ") + .append(RawContactColumns::IS_NEED_MERGE) + .append(" = 1") + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawId)); + int code = store->ExecuteSql(sql); + return code; +} + +std::vector MatchCandidate::ResultSetToValuesBucket( + std::unique_ptr &resultSet) +{ + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + std::vector vectorQueryData; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + OHOS::NativeRdb::ValuesBucket valuesBucketElement; + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + std::string typeValue = columnNames[i]; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + OHOS::NativeRdb::ColumnType columnType; + resultSet->GetColumnType(columnIndex, columnType); + if (columnType == OHOS::NativeRdb::ColumnType::TYPE_INTEGER) { + int intValue = 0; + resultSet->GetInt(columnIndex, intValue); + valuesBucketElement.PutInt(typeValue, intValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_FLOAT) { + double doubleValue = 0; + resultSet->GetDouble(columnIndex, doubleValue); + valuesBucketElement.PutDouble(typeValue, doubleValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_STRING) { + std::string stringValue; + resultSet->GetString(columnIndex, stringValue); + valuesBucketElement.PutString(typeValue, stringValue); + } + } + vectorQueryData.push_back(valuesBucketElement); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return vectorQueryData; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/merge/src/merger_contacts.cpp b/ability/merge/src/merger_contacts.cpp new file mode 100644 index 0000000..9527bae --- /dev/null +++ b/ability/merge/src/merger_contacts.cpp @@ -0,0 +1,631 @@ +/* + * Copyright (c) 2021 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 "merger_contacts.h" + +#include "common.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "hilog_wrapper.h" +#include "match_candidate.h" +#include "merge_utils.h" + +namespace OHOS { +namespace Contacts { +static int g_isNeedMergeNum[2] = {0, 1}; +static int g_isNeedMergeTargetNum[2] = {0, 1}; + +MergerContacts::MergerContacts() +{ +} + +MergerContacts::~MergerContacts() +{ +} + +/** + * @brief AutoMerge operation for candidate contacts + * + * @param store Conditions for split operation + * + * @return The result returned by the AutoMerge operation + */ +int MergerContacts::ContactMerge(std::shared_ptr store) +{ + if (store == nullptr) { + HILOG_ERROR("stroe is empty"); + return RDB_OBJECT_EMPTY; + } + HILOG_INFO("MergerContacts::ContactMerge is starting"); + // query all ids with merge_mode = 2 + std::vector> candidates = QueryMergeContacts(store, MERGE_MODE_AUTO); + int ret = RDB_EXECUTE_FAIL; + ret = MergeCircle(store, candidates); + return ret; +} + +int MergerContacts::MergeCircle(std::shared_ptr store, std::vector> candidates) +{ + if (candidates.empty()) { + HILOG_ERROR("Merge candidate is empty"); + return RDB_EXECUTE_FAIL; + } + bool isModeHasError = false; + for (auto it = candidates.begin(); it != candidates.end(); ++it) { + std::set ids = *it; + if (ids.size() == 1) { + HILOG_ERROR("MergeCircle continue "); + isModeHasError = true; + continue; + } + auto minIdPosition = ids.begin(); + int minId = *minIdPosition; + UpdateRawContacts(store, minId, ids); + std::string sql = "UPDATE "; + sql.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::IS_NEED_MERGE) + .append(" = ") + .append(std::to_string(g_isNeedMergeNum[1])) + .append(", ") + .append(RawContactColumns::IS_MERGE_TARGET) + .append(" = ") + .append(std::to_string(g_isNeedMergeTargetNum[0])) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(minId)); + int error = store->ExecuteSql(sql); + if (error != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("MergeCircle ExecuteSql error : %{public}d ", error); + return RDB_EXECUTE_FAIL; + } + MatchCandidate matchCandidate; + matchCandidate.AddHasByRawId(store, minId); + matchCandidate.FindMatchContact(store, minId); + } + if (isModeHasError) { + HILOG_ERROR("MergerContacts::MergeCircle only one candidate has auto_merge_mode"); + return RDB_EXECUTE_FAIL; + } else { + return RDB_EXECUTE_OK; + } +} + +int MergerContacts::DeleteContacts( + std::shared_ptr store, int minId, std::set handledIds) +{ + int ret = store->ExecuteSql("PRAGMA foreign_keys = OFF"); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteContacts foreign_keys close fail"); + return ret; + } + std::set ids; + std::string sql = "DELETE FROM "; + sql.append(ContactTableName::CONTACT).append(" WHERE "); + for (auto it = handledIds.begin(); it != handledIds.end(); ++it) { + if (*it != minId) { + ids.insert(*it); + } + } + for (auto id = ids.begin(); id != ids.end(); ++id) { + sql.append(ContactColumns::NAME_RAW_CONTACT_ID).append(" = ").append(std::to_string(*id)); + if (*id != *ids.rbegin()) { + sql.append(" OR "); + } + } + int code = store->ExecuteSql(sql); + ret = store->ExecuteSql("PRAGMA foreign_keys = ON"); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteContacts foreign_keys open fail"); + return ret; + } + return code; +} + +std::set MergerContacts::HandleIds(std::shared_ptr store, std::set ids) +{ + std::set rawIds; + for (auto id = ids.begin(); id != ids.end(); ++id) { + if (*id != *ids.rbegin()) { + std::string sqlBuilder = "SELECT "; + sqlBuilder.append(ContactPublicColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::CONTACT_ID) + .append(" = (SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(*id)) + .append(")"); + std::unique_ptr resultSet = store->QuerySql(sqlBuilder); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int rawId = 0; + resultSet->GetInt(0, rawId); + rawIds.insert(rawId); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + } else { + rawIds.insert(*id); + } + } + return rawIds; +} + +void MergerContacts::UpdateRawContacts( + std::shared_ptr store, int minRawId, std::set Ids) +{ + std::string sqlBuilder = "SELECT "; + sqlBuilder.append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(minRawId)) + .append(" AND ") + .append(RawContactColumns::IS_DELETED) + .append(" = 0"); + std::unique_ptr resultSet = store->QuerySql(sqlBuilder); + int minContactId = 0; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + resultSet->GetInt(0, minContactId); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + UpdateRawContactsExecute(store, minContactId, Ids); + DeleteContacts(store, minRawId, Ids); +} + +void MergerContacts::UpdateRawContactsExecute( + std::shared_ptr store, int minContactId, std::set Ids) +{ + int size = Ids.size(); + if (size < 0) { + return; + } + std::string updateRawContact = "UPDATE "; + updateRawContact.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::CONTACT_ID) + .append(" = ") + .append(std::to_string(minContactId)) + .append(", ") + .append(RawContactColumns::MERGE_MODE) + .append(" = ") + .append(std::to_string(MERGE_MODE_DEFAULT)) + .append(", ") + .append(RawContactColumns::IS_NEED_MERGE) + .append(" = ") + .append(std::to_string(g_isNeedMergeNum[0])) + .append(" WHERE ( "); + std::string updateSearchSql = "UPDATE "; + updateSearchSql.append(ContactTableName::SEARCH_CONTACT) + .append(" SET ") + .append(RawContactColumns::CONTACT_ID) + .append(" = ") + .append(std::to_string(minContactId)) + .append(" WHERE "); + for (auto it = Ids.begin(); it != Ids.end(); ++it) { + updateRawContact.append("id = ").append(std::to_string(*it)); + updateSearchSql.append("id = ").append(std::to_string(*it)); + if (*it != *Ids.rbegin()) { + updateRawContact.append(" OR "); + updateSearchSql.append(" OR "); + } + } + updateRawContact.append(" ) AND is_deleted = 0"); + int ret = store->ExecuteSql(updateRawContact); + int code = store->ExecuteSql(updateSearchSql); + if (ret != RDB_EXECUTE_OK || code != RDB_EXECUTE_OK) { + return; + } +} + +std::string MergerContacts::QueryCandidateName(std::shared_ptr store, int id) +{ + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + std::string sqlBuilder = "SELECT "; + sqlBuilder.append(ContactDataColumns::DETAIL_INFO) + .append(" FROM ") + .append(ContactTableName::CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(" = ") + .append(std::to_string(id)) + .append(" AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(nameType)); + std::unique_ptr resultSet = store->QuerySql(sqlBuilder); + std::string candidateName; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + resultSet->GetString(0, candidateName); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return candidateName; +} + +std::set MergerContacts::QueryTargetName( + std::shared_ptr store, int rawId, std::set data) +{ + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + std::set ids; + for (auto it = data.begin(); it != data.end(); it++) { + std::string query = "SELECT "; + query.append(ContactDataColumns::RAW_CONTACT_ID) + .append(" FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::DETAIL_INFO) + .append(" = '") + .append(*it) + .append("' AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(nameType)) + .append(" AND is_deleted = 0"); + std::unique_ptr resultSet = store->QuerySql(query); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = 0; + resultSet->GetInt(0, value); + if (value != rawId) { + ids.insert(value); + } + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + } + return ids; +} + +std::vector> MergerContacts::QueryMergeContacts( + std::shared_ptr store, int mode) +{ + std::string sqlBuilder = "SELECT "; + sqlBuilder.append(ContactPublicColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::IS_MERGE_TARGET) + .append(" = ") + .append(std::to_string(g_isNeedMergeTargetNum[1])) + .append(" AND ") + .append(RawContactColumns::IS_DELETED) + .append(" = 0") + .append(" AND ") + .append(RawContactColumns::MERGE_MODE) + .append(" = ") + .append(std::to_string(mode)); + std::vector currentIds; + std::unique_ptr resultSet = store->QuerySql(sqlBuilder); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int currentId = 0; + resultSet->GetInt(0, currentId); + currentIds.push_back(currentId); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + HILOG_INFO("QueryMergeContacts currentIds' size = %{public}d", currentIds.size()); + std::vector> candidates; + UpdateCandidate(store, currentIds, candidates); + return candidates; +} + +void MergerContacts::UpdateCandidate(std::shared_ptr store, std::vector currentIds, + std::vector> &candidates) +{ + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + int phoneType = contactsDataBase->GetTypeId(ContentTypeData::PHONE); + MergeUtils mergeUtils; + for (auto rawId : currentIds) { + std::set names = mergeUtils.QueryRawContactByType(store, rawId, nameType); + std::set phones = mergeUtils.QueryRawContactByType(store, rawId, phoneType); + if (names.empty()) { + HILOG_ERROR("MergerContacts::UpdateCandidate target names is empty"); + break; + } + std::set nameIds = QueryTargetName(store, rawId, names); + std::set rawIds; + rawIds.insert(rawId); + for (auto nameId = nameIds.begin(); nameId != nameIds.end(); nameId++) { + std::set otherPhones = mergeUtils.QueryRawContactByType(store, *nameId, phoneType); + bool isMatch = mergeUtils.SetEqual(phones, otherPhones); + if (isMatch) { + rawIds.insert(*nameId); + } + } + HILOG_INFO("rawIds' size = %{public}d", rawIds.size()); + candidates.push_back(rawIds); + } + HILOG_INFO("candidates' size = %{public}d", candidates.size()); +} + +std::shared_ptr MergerContacts::SelectCandidate( + std::shared_ptr store) +{ + std::unique_ptr resultSet; + if (store == nullptr) { + HILOG_ERROR("MergerContacts SelectCandidate store is nullptr"); + return resultSet; + } + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + int phoneType = contactsDataBase->GetTypeId(ContentTypeData::PHONE); + std::string sql = "SELECT "; + sql.append(ContactDataColumns::RAW_CONTACT_ID) + .append(", ") + .append(RawContactColumns::CONTACT_ID) + .append(", ") + .append(ContentTypeColumns::CONTENT_TYPE) + .append(", ") + .append(ContactDataColumns::TYPE_ID) + .append(", ") + .append(RawContactColumns::DISPLAY_NAME) + .append(", ") + .append(RawContactColumns::PHOTO_FIRST_NAME) + .append(", ") + .append(ContactDataColumns::DETAIL_INFO) + .append(" FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(" IN(SELECT ") + .append(RawContactColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::IS_DELETED) + .append(" = 0") + .append(" AND ") + .append(RawContactColumns::MERGE_MODE) + .append(" = ") + .append(std::to_string(MERGE_MODE_MANUAL)) + .append(") AND ( ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(phoneType)) + .append(" OR ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(nameType)) + .append(" ) GROUP BY ") + .append(RawContactColumns::CONTACT_ID); + resultSet = store->QuerySql(sql); + return resultSet; +} + +/** + * @brief ManualMerge operation for candidate contacts + * + * @param store Conditions for split operation + * @param predicates Conditions for update operation + * + * @return The result returned by the ManualMerge operation + */ +int MergerContacts::ReContactMerge( + std::shared_ptr store, const OHOS::NativeRdb::DataAbilityPredicates &predicates) +{ + HILOG_INFO("MergerContacts::ReContactMerge is starting"); + std::vector whereArgs = predicates.GetWhereArgs(); + std::set ids; + for (auto value : whereArgs) { + ids.insert(atoi(value.c_str())); + } + if (ids.size() == 0) { + return RDB_EXECUTE_FAIL; + } + std::vector> selectedIds = SelectIdsByName(store, ids); + int minId = 0; + bool isModeHasError = false; + std::set currentIds; + for (auto it = selectedIds.begin(); it != selectedIds.end(); ++it) { + currentIds = *it; + std::set handledIds = HandleIds(store, currentIds); + HILOG_INFO("ReContactMerge size = :%{public}d", handledIds.size()); + if (handledIds.size() == 1) { + HILOG_ERROR("MergeCircle continue "); + isModeHasError = true; + continue; + } + auto minIdPosition = handledIds.begin(); + minId = *minIdPosition; + int ret = ManualMergeOperation(store, minId, handledIds); + if (ret != RDB_EXECUTE_OK) { + return RDB_EXECUTE_FAIL; + } + MatchCandidate matchCandidate; + matchCandidate.FindMatchContact(store, minId); + } + if (isModeHasError) { + HILOG_ERROR("MergerContacts::MergeCircle only one candidate has manual_merge_mode"); + return RDB_EXECUTE_FAIL; + } else { + return RDB_EXECUTE_OK; + } +} + +int MergerContacts::ManualMergeOperation( + std::shared_ptr store, int minId, std::set handledIds) +{ + UpdateRawContacts(store, minId, handledIds); + DeleteContacts(store, minId, handledIds); + std::string sql = "UPDATE "; + sql.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::IS_NEED_MERGE) + .append(" = ") + .append(std::to_string(g_isNeedMergeNum[1])) + .append(", ") + .append(RawContactColumns::IS_MERGE_TARGET) + .append(" = ") + .append(std::to_string(g_isNeedMergeTargetNum[0])) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(minId)); + int error = store->ExecuteSql(sql); + if (error != RDB_EXECUTE_OK) { + HILOG_ERROR("MergerContacts::ReContactMerge errorcode :%{public}d", error); + return error; + } + return RDB_EXECUTE_OK; +} + +std::vector> MergerContacts::SelectIdsByName( + std::shared_ptr store, std::set ids) +{ + HILOG_INFO("MergerContacts::SelectIdsByName is starting"); + std::vector> selectedIds; + std::set names; + std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int nameType = contactsDataBase->GetTypeId(ContentTypeData::NAME); + for (auto id : ids) { + std::string sql = "SELECT "; + sql.append(ContactDataColumns::DETAIL_INFO) + .append(" FROM ") + .append(ContactTableName::CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(" = ") + .append(std::to_string(id)) + .append(" AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(nameType)); + std::unique_ptr resultSet = store->QuerySql(sql); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string name; + resultSet->GetString(0, name); + names.insert(name); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + } + UpdateIdsByName(store, names, ids, selectedIds); + return selectedIds; +} + +void MergerContacts::UpdateIdsByName(std::shared_ptr store, std::set names, + std::set ids, std::vector> &selectedIds) +{ + for (auto name : names) { + std::string sqlBuilder = "SELECT "; + sqlBuilder.append(ContactDataColumns::RAW_CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::DETAIL_INFO) + .append(" = '") + .append(name) + .append("' AND ") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(" IN("); + for (auto id = ids.begin(); id != ids.end(); ++id) { + if (*id == *ids.rbegin()) { + sqlBuilder.append(std::to_string(*id)).append(")"); + } else { + sqlBuilder.append(std::to_string(*id)).append(", "); + } + } + std::set currentIds; + std::unique_ptr resultSet = store->QuerySql(sqlBuilder); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int id = 0; + resultSet->GetInt(0, id); + currentIds.insert(id); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + selectedIds.push_back(currentIds); + } +} + +bool MergerContacts::isNameMatch(std::shared_ptr store, std::set ids) +{ + std::set names; + for (auto it : ids) { + std::string name = QueryCandidateName(store, it); + names.insert(name); + } + if (names.size() == 1) { + return true; + } else { + return false; + } +} + +/** + * @brief Force contact merge for candidate contacts + * + * @param store Conditions for split operation + * @param ids Conditions for update operation + * + * @return The result returned by the ForceContactMerge operation + */ +int MergerContacts::ForceContactMerge(std::shared_ptr store, std::set ids) +{ + if (store == nullptr) { + HILOG_ERROR("stroe is empty"); + return RDB_OBJECT_EMPTY; + } + int minId = 0; + if (isNameMatch(store, ids)) { + std::set handledIds = HandleIds(store, ids); + HILOG_INFO("ForceContactMerge size = %{public}d", handledIds.size()); + auto minIdPosition = handledIds.begin(); + minId = *minIdPosition; + UpdateRawContacts(store, minId, handledIds); + DeleteContacts(store, minId, handledIds); + } else { + HILOG_ERROR("Invalid parameter passed"); + return RDB_EXECUTE_FAIL; + } + std::string sql = "UPDATE "; + sql.append(ContactTableName::RAW_CONTACT) + .append(" SET ") + .append(RawContactColumns::IS_NEED_MERGE) + .append(" = ") + .append(std::to_string(g_isNeedMergeNum[1])) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(minId)); + int error = store->ExecuteSql(sql); + if (error != RDB_EXECUTE_OK) { + HILOG_ERROR("MergerContacts::ForceMerge errorcode :%{public}d", error); + return error; + } + return RDB_EXECUTE_OK; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/sinicization/include/character_transliterate.h b/ability/sinicization/include/character_transliterate.h new file mode 100644 index 0000000..1f18d26 --- /dev/null +++ b/ability/sinicization/include/character_transliterate.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CHARACTER_TRANSLITERATE_H +#define CHARACTER_TRANSLITERATE_H + +#include +#include + +namespace OHOS { +namespace Contacts { +struct ChineseTable { + // The first letter of Pinyin + std::string initials; + // Pinyin + std::string nameFullFight_; + std::string chineseCharacters_; +}; + +struct Container { + // The container of first letter + std::vector> initialsContainer_; + // Pinyin container + std::vector> nameFullFightContainer_; +}; + +class CharacterTransliterate { +public: + CharacterTransliterate(); + ~CharacterTransliterate(); + static ChineseTable chineseTable_[]; + bool IsChineseCharacter(wchar_t chineseCharacter); + Container GetContainer(std::wstring wChinese); + std::wstring Join(std::vector> strVector, std::wstring split); + void GetCommonPronunciation( + std::wstring &chineseCharacter, std::vector &initials, std::vector &nameFullFights); + std::vector> GetCombinedVector(std::vector> sourceVector); + std::wstring StringToWstring(std::string str); + std::string WstringToString(std::wstring str); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CHARACTER_TRANSLITERATE_H \ No newline at end of file diff --git a/ability/sinicization/include/construction_name.h b/ability/sinicization/include/construction_name.h new file mode 100644 index 0000000..a76fe46 --- /dev/null +++ b/ability/sinicization/include/construction_name.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONSTRUCTION_NAME_H +#define CONSTRUCTION_NAME_H + +#include "common.h" + +namespace OHOS { +namespace Contacts { +class ConstructionName { +public: + ConstructionName(); + ~ConstructionName(); + int sortFirstLetterCode_ = 0; + // The first letter + std::string initials_; + // Full-Pinyin + std::string nameFullFight_; + std::string sortFirstLetter_; + std::string disPlayName_; + std::string photoFirstName_; + static std::string local; + ConstructionName GetConstructionName(std::string &chineseCharacter, ConstructionName &constructionName); + ConstructionName GetPhotoFirstName(ConstructionName &constructionName); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONSTRUCTION_NAME_H diff --git a/ability/sinicization/src/character_transliterate.cpp b/ability/sinicization/src/character_transliterate.cpp new file mode 100644 index 0000000..bfdf3ef --- /dev/null +++ b/ability/sinicization/src/character_transliterate.cpp @@ -0,0 +1,2080 @@ +/* + * Copyright (c) 2021 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 "character_transliterate.h" + +#include +#include + +#include "common.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +ChineseTable CharacterTransliterate::chineseTable_[411] = {{"a", "a", "吖阿呵啊腌锕錒嗄厑"}, + {"a", "ao", + "凹柪梎軪熬爊敖厫隞蔜遨廒嗷嗸獓" + "嶅滶獒摮璈磝螯聱翱翶謷謸鳌翺嚣" + "鏖鷔鰲鼇艹夭芺抝拗袄镺媪媼襖岙" + "岰垇坳傲奡奥奧骜嫯慠懊墺澳嶴擙" + "鏊驁澚鱜"}, + {"a", "ang", "肮骯卬仰岇昂昻枊盎醠"}, + {"a", "ai", + "哎哀诶唉娭挨埃溾嗳锿鎄捱皑啀凒" + "溰敱敳嘊皚癌騃佁毐昹欸娾矮蔼躷" + "噯濭藹譪霭靄艾阨伌爱砹硋隘嗌嫒" + "塧碍愛叆暧瑷僾噫壒懓嬡薆鴱餲璦" + "曖懝皧瞹馤礙譺鑀靉閊魞﨟鱛鱫"}, + {"a", "an", + "厂广安侒峖桉氨庵偣谙菴萻葊媕腤" + "痷鹌誝蓭鞍鞌諳盦馣鮟盫鵪鶕韽玵" + "啽雸儑垵俺唵埯铵晻揞罯銨屵犴岸" + "按洝荌胺豻案婩隌堓暗貋錌闇黯"}, + + {"b", "bai", + "挀掰白犤百伯佰陌柏栢捭絔摆擺襬" + "庍呗拝败拜敗猈稗粺薭贁韛瓸竡粨" + "兡"}, + {"b", "ba", + "丷八仈巴叭朳玐吧岜扷芭夿疤柭釟" + "蚆粑笆捌哵羓豝鲃叐茇妭拔炦胈癹" + "菝軷詙跋颰魃鼥把钯鈀靶伯弝坝爸" + "杷垻罢耙跁鲅罷鮁覇矲霸壩灞" + "欛抜鎺鯐"}, + {"b", "ban", + "扳肦攽班般颁斑斒搬頒鳻瘢螌褩癍" + "辬阪岅坂板版昄瓪钣粄舨鈑蝂魬闆" + "办半伴扮拌姅绊坢怑柈秚絆湴鉡靽" + "辦瓣螁"}, + {"b", "bang", + "邦帮垹梆捠浜邫幇幚縍幫鞤绑綁榜" + "牓膀玤挷旁蚌棒棓傍谤蒡搒塝稖蜯" + "镑磅艕謗鎊"}, + {"b", "bao", + "勹包苞孢炮枹胞剥剝笣龅煲裦褒蕔" + "襃闁齙窇雹薄宝饱怉鸨保宲珤葆堡" + "堢媬寚飽飹褓駂鳵鴇緥賲寳寶靌勽" + "刨报抱铇豹趵蚫菢袌報鉋鲍骲髱暴" + "虣鮑曓儤瀑爆犦曝忁鑤佨藵"}, + {"b", "ben", + "奔泍贲犇锛錛本苯奙畚翉楍夯坌倴" + "逩桳笨捹渀撪"}, + {"b", "bei", + "陂卑杯柸背盃桮椑揹悲鹎碑藣鵯北" + "鉳贝狈孛邶貝牬昁苝备郥钡被倍俻" + "狽悖梖偝偹鄁珼琲惫軰備僃棓辈焙" + "蓓蛽碚愂禙犕褙誖鞁骳鋇輩糒憊鞴" + "鐾唄"}, + {"b", "beng", + "伻祊奟崩绷閍絣痭嵭嘣綳繃甭甮埄" + "埲菶琫琣鞛迸泵蚌逬揼塴甏镚蹦鏰"}, + {"b", "bi", + "皀屄偪逼毴楅榌豍鵖螕鲾鎞鰏荸鼻" + "匕比朼夶吡妣沘佊疕彼毞柀秕笔粃" + "舭俾啚筆鄙箄聛貏币必毕闭庇佖诐" + "芘邲迊坒怭怶苾妼咇泌畀畁哔荜陛" + "贲毖柲珌疪秘铋毙狴畢袐粊笓閉閇" + "婢庳萆萞梐敝赑堛愊愎皕禆弼弻湢" + "詖筚賁貱蜌裨辟跸閟飶鉍滗滭嗶彃" + "蓖蓽腷睥睤痹痺煏熚碧蔽弊鄪獙幣" + "綼箅箆馝髲駜襅幤潷罼獘壁廦嬖避" + "薜篦篳縪觱鮅蹕髀濞斃臂奰鏎饆鄨" + "璧繴襣襞鞸魓韠躄躃驆鷝鐴贔朇鷩" + "鼊萙蛯嬶"}, + {"b", "bian", + "边炞砭笾萹编猵煸牑甂箯蝙糄編鞕" + "鍽鳊獱邉邊鞭鯿鯾籩贬扁窆匾貶惼" + "褊稨碥鴘藊卞弁抃汳汴苄釆忭玣变" + "変昪便覍徧遍缏揙閞辡諚緶艑辨辩" + "辧辫辮辯變峅"}, + {"b", "biao", + "杓标飑骉髟彪淲猋脿颮滮摽骠蔈幖" + "墂麃標熛膘镖瘭磦飙飚儦颷謤藨瀌" + "爂鏢贆臕穮镳飆飇飈飊鑣驫嫑表婊" + "裱諘錶褾檦俵鳔鋲"}, + {"b", "bie", + "憋瘪蟞鳖癟鱉鼈虌龞别別莂蛂徶襒" + "蹩彆"}, + {"b", "bin", + "邠玢宾彬梹椕傧斌滨缤賓賔豩槟瑸" + "镔儐濒頻豳濱濵虨璸檳瀕霦繽蠙鑌" + "顮摈殡膑髩鬂擯殯臏髌鬓髕鬢"}, + {"b", "bing", + "冫仌氷并冰兵屏栟掤槟丙邴陃苪怲" + "抦秉昞昺炳柄饼绠眪蛃偋寎棅鈵禀" + "稟鉼餅餠鞞幷並併庰倂栤竝病窉傡" + "摒誁鮩靐垪鞆"}, + {"b", "bo", + "卜癶癷波拨玻饽钵盋砵哱剥般趵缽" + "紴袰菠啵溊碆鉢鲅僠蕃嶓播撥餑礡" + "蹳驋鱍仢伯驳孛肑瓝泊狛帛郣勃侼" + "胉柏袯瓟秡钹铂浡挬亳萡淿脖袹舶" + "鹁渤葧博猼馎愽搏鈸鉑鲌魄馛駁艊" + "箔牔煿膊僰镈踣鋍馞駮鮊薄謈襏簙" + "餺鵓鎛嚗懪髆髉糪襮欂礴鑮跛簸孹" + "檗擘譒蘗畓蔔"}, + {"b", "bu", + "逋庯峬钸晡鈽誧餔錻鳪轐醭卜卟补" + "哺捕堡補鵏鸔不布吥佈步歨歩怖咘" + "钚柨悑部勏捗埔埗荹埠瓿鈈蔀廍踄" + "郶餢篰簿巭"}, + {"c", "ca", "拆擦攃嚓礤礸遪乲"}, + {"c", "cai", + "偲猜才财材財裁纔毝采倸啋寀婇彩" + "採埰棌睬跴綵踩宷菜蔡縩"}, + {"c", "can", + "参參叄骖飡湌叅喰傪嬠餐驂残蚕惭" + "殘慚蝅慙蠺蠶惨朁慘憯穇篸黪黲" + "灿掺孱粲薒澯燦璨謲儏爘"}, + {"c", "cang", + "仓仺伧苍沧鸧舱倉傖凔滄蒼獊嵢" + "螥艙鶬臧藏鑶賶濸"}, + {"c", "cao", + "撡操糙曺曹蓸嘈嶆漕慒槽褿螬艚鏪" + "艸草愺懆騲肏鄵襙鼜"}, + {"c", "ce", + "测撡操糙曺曹蓸嘈嶆漕慒槽褿螬艚鏪" + "艸草愺懆騲肏鄵襙鼜"}, + {"c", "cen", "参嵾岑涔埁笒梣"}, {"c", "ceng", "噌层曾層嶒竲驓蹭"}, + {"c", "cha", + "叉扱扠杈臿差挿偛馇插揷嗏喳锸碴" + "銟艖疀嚓鍤餷茬茶垞查査秅猹嵖搽" + "靫詧楂槎察檫衩蹅镲鑔奼汊岔刹侘" + "诧剎姹咤紁詫"}, + {"c", "chai", + "芆肞钗拆差釵犲侪柴豺祡喍儕茝虿" + "訍袃瘥蠆囆"}, + {"c", "chan", + "辿觇梴掺搀覘裧摻鋓幨襜攙苂单谗" + "婵馋湹孱棎禅煘缠蝉獑僝誗鋋儃廛" + "嬋潺潹緾澶磛鄽螹毚蟬瀍酁儳蟾劖" + "壥嚵瀺巉欃纏纒躔镵艬讒鑱饞产刬" + "旵丳斺浐剗谄阐铲產産蒇剷摌滻蕆" + "幝諂閳骣燀簅冁醦繟鏟譂闡囅灛讇" + "忏硟摲懴颤懺羼韂顫"}, + {"c", "chang", + "伥昌倡倀菖阊娼猖淐琩锠裮錩閶鲳" + "鯧鼚长仧仩场兏肠苌镸長尝倘偿萇" + "徜常瓺場腸甞裳塲嫦嘗膓瑺嚐償鲿" + "鱨厂昶惝敞厰僘廠氅鋹怅玚畅鬯唱" + "悵焻暢畼誯韔椙蟐"}, + {"c", "che", + "车伡車俥砗莗唓硨蛼尺扯偖撦屮彻" + "迠坼烢聅硩掣頙撤澈徹瞮勶爡"}, + {"c", "chao", + "吵抄弨怊欩钞绰訬超鈔焯剿窼牊晁" + "巢巣朝鼌鄛漅潮樔嘲窲罺鼂轈謿炒" + "眧焣煼麨巐仦仯耖觘"}, + {"c", "chen", + "抻郴捵棽琛嗔綝賝諃瞋謓尘臣辰忱" + "沉陈迧茞莀莐宸陳栕桭谌訦軙敐晨" + "鈂愖煁蔯樄塵敶瘎霃諶螴薼麎曟鷐" + "趻硶碜墋夦踸磣鍖贂衬疢称龀趁趂" + "榇齓齔儭谶嚫櫬襯讖烥"}, + {"c", "cheng", + "阷泟爯柽棦称秤浾琤偁铛碀蛏晿牚" + "赪靗憆稱摚撑撐噌樘緽頳赬瞠橕檉" + "竀罉蟶穪鏿鐣饓丞成朾呈郕诚枨承" + "荿宬娍峸洆城乗乘埕挰珹珵窚掁脭" + "铖盛程揨堘裎絾筬惩椉棖誠塍塖溗" + "酲鋮畻澄澂憕橙檙瀓懲騬侱徎逞骋" + "悜庱睈騁鯎"}, + {"c", "chi", + "吃妛彨哧胵鸱蚩粚笞眵瓻喫訵絺嗤" + "媸摛痴瞝殦噄誺螭鴟鵄魑癡齝攡彲" + "黐弛驰池迟迡茌坻竾荎持匙蚳赿貾" + "遅筂遟馳箎墀漦遲踟篪鍉謘尺叺伬" + "呎肔齿侈卶垑胣蚇耻恥豉袳歯欼袲" + "裭鉹齒褫彳叱斥杘赤饬灻抶侙勅恜" + "炽勑翅翄敕烾湁啻飭雴傺腟痸鉓銐" + "翤瘈遫憏瘛慗翨熾趩懘鶒鷘麶"}, + {"c", "chong", + "冲充沖忡茺涌浺珫翀舂嘃摏憧衝憃" + "罿艟蹖虫种重隀崇崈漴褈蝩緟蟲爞" + "宠埫寵铳揰銃"}, + {"c", "chou", + "抽紬搊篘瘳犨犫仇俦帱栦菗绸惆" + "絒椆畴愁皗稠筹詶酬酧裯踌綢雔儔" + "薵懤幬嬦檮燽雠疇籌醻躊讎讐雦丑" + "丒吜杻杽偢瞅醜矁魗臭臰遚殠鮘"}, + {"c", "chua", "欻"}, + {"c", "chu", + "出岀初摴樗貙齣刍处助除芻厨蒢豠" + "滁锄雏鉏趎蒭媰蜍耡犓鋤篨廚橱櫉" + "幮躇雛蹰櫥鶵躕杵础處椘楮储禇楚" + "褚濋儲檚礎齭齼亍処竌豖绌怵泏竐" + "欪畜俶敊埱絀珿傗鄐滀搐触閦諔儊" + "嘼憷斶黜臅歜觸矗榋璴蟵"}, + {"c", "chuan", + "巛川氚穿瑏传舡舩船剶遄椽傳暷篅" + "輲舛荈喘歂僢踳汌玔串钏釧猭賗鶨"}, + {"c", "chuang", + "刅创疮窓窗牎摐牕瘡窻床牀幢噇闯" + "傸磢闖怆刱剏剙創愴"}, + {"c", "chuai", "揣搋膗啜嘬膪踹"}, + {"c", "chui", + "吹炊龡垂埀陲倕桘菙捶搥棰椎圌腄" + "锤槌箠錘鎚顀"}, + {"c", "chun", + "旾杶春萅媋堾椿槆暙瑃蝽箺輴橁" + "櫄鶞鰆纯陙莼唇浱純脣淳湻犉鹑滣" + "蒓蓴漘醇醕錞鶉鯙偆萶惷睶賰蠢"}, + {"c", "cong", + "匆苁囱囪忩茐枞怱悤棇葱楤蔥蓯骢" + "漗聡聪聦熜潨樅樬暰瑽璁瞛蟌聰篵" + "鍯繱鏦鏓騘驄从丛徔従從徖婃淙悰" + "孮琮潀漎賨賩誴錝樷藂叢灇欉爜愡" + "憁謥"}, + {"c", "ci", + "刺差呲玼疵趀偨跐骴縒髊蠀齹词珁" + "茈茨垐柌祠兹瓷辝詞辞慈甆鹚磁雌" + "餈飺糍辤薋嬨濨鴜礠辭鷀鶿此佌泚" + "皉鮆朿次伺佽刾庛茦栨莿赐蛓絘賜" + "螆閊"}, + {"c", "chuo", + "逴趠踔戳繛辶辵哾娖娕婼婥啜涰绰" + "惙辍酫踀綽輟龊擉餟磭歠嚽齪鑡"}, + {"c", "cu", + "怚粗觕麁麄橻麤徂殂卒促脨猝酢媨" + "瘄蔟趗誎醋憱趣踧噈瘯踿縬簇鼀蹙" + "蹴蹵顣"}, + {"c", "cou", "凑湊辏楱腠輳"}, + {"c", "cun", + "邨村皴踆澊墫竴膥存侟拵蹲刌忖寸" + "籿"}, + {"c", "cuan", + "汆撺镩蹿攛躥鑹菆攒櫕巑欑穳窜殩" + "熶篡簒竄爨"}, + {"c", "cui", + "崔脺嵟凗催缞墔慛榱獕摧槯磪縗鏙" + "漼璀趡皠伜忰疩脆脃倅粋紣翆萃啐" + "啛淬悴焠毳琗瘁翠綷粹膵膬竁襊濢" + "顇臎"}, + {"c", "cuo", + "搓遳瑳磋撮醝蹉鎈虘嵯嵳睉痤蒫矬" + "蔖瘥鹾酂鹺脞剉剒莝莡厝挫夎措逪" + "锉错蓌銼錯"}, + {"d", "da", + "咑哒耷笚答嗒搭褡撘墶噠鎝鎉打达" + "迏迖迚怛呾妲沓荙荅炟羍畗畣惮匒" + "剳逹笪詚達跶靼瘩薘鞑蟽鐽韃龖龘" + "大亣汏垯眔畓繨躂鶎"}, + {"d", "dang", + "当珰裆铛筜當儅噹澢璫襠蟷艡簹鐺" + "闣挡党谠擋譡黨攩灙欓讜氹凼圵宕" + "砀荡垱档菪婸逿愓瓽雼嵣潒碭瞊趤" + "蕩壋檔璗盪礑簜蘯"}, + {"d", "dan", + "丹妉担单単眈砃耽耼郸聃躭酖單殚" + "媅瘅匰鄲頕褝箪勯儋殫擔甔襌簞聸" + "刐伔抌瓭玬胆衴紞疸掸赕亶馾撣撢" + "賧黕膽黮黵旦石帎但诞狚泹沊柦唌" + "疍蛋弹惮啖啗淡萏啿弾氮蜑腅觛誕" + "窞蓞僤噉髧嘾彈憚憺禫澹駳鴠餤癉" + "癚繵贉嚪饏霮"}, + {"d", "dai", + "呆呔待獃懛歹歺逮傣大代轪甙侢迨" + "帒骀岱绐垈贷带玳殆柋怠軑貣帯帶" + "埭蚮紿軚袋軩貸瑇跢廗叇曃蝳緿鴏" + "黛艜戴簤瀻霴黱襶靆"}, + {"d", "de", "的嘚恴得淂棏惪悳锝徳德鍀地底"}, + {"d", "dao", + "刀刂叨忉朷氘舠釖鱽魛螩捯导岛陦" + "島捣倒祷禂搗隝嶋嶌導隯嶹擣壔蹈" + "禱辺到帱悼焘菿盗盜道翢稲稻噵艔" + "衜衟檤燾翿軇瓙纛乭﨩椡槝"}, + {"d", "dei", "嘚得"}, + {"d", "deng", + "灯登豋僜噔嬁燈璒竳簦蹬等戥邓鄧" + "隥凳嶝澄墱镫瞪磴櫈覴鐙艠"}, + {"d", "den", "扥扽"}, {"d", "dia", "嗲"}, + {"d", "di", + "氐仾低彽奃岻秪袛隄羝埞啲堤提趆" + "滴嘀镝磾鞮廸狄苖迪的籴唙荻涤敌" + "梑啇笛靮觌滌髢馰頔翟嫡蔋蔐樀敵" + "藡嚁豴蹢鏑覿糴鸐厎邸阺诋坘坻弤" + "底呧抵拞柢牴砥掋菧軧觝詆骶聜鯳" + "地坔杕旳弟玓苐枤怟埅帝俤娣递逓" + "埊焍谛梊祶菂偙眱珶第釱睇揥媂蒂" + "棣缔楴禘遞僀腣鉪碲蝃摕遰蔕墬墑" + "甋蝭締慸諦踶嶳螮嚸"}, + {"d", "die", + "爹跌褺苵迭咥峌挕绖垤恎昳胅瓞眣" + "耊谍眰戜絰臷镻詄趃跕畳喋耋惵堞" + "揲殜叠楪牃牒跮碟褋蜨嵽蝶艓諜蹀" + "鴩疂螲鲽蹛曡疉鰈疊氎哋幉"}, + {"d", "diao", + "刁叼汈刟虭凋彫奝弴蛁貂琱鳭碉鮉" + "瞗錭鲷雕簓鼦鯛鵰鸟扚屌弔吊伄钓" + "盄窎訋调铞铫掉釣鈟竨蓧銱銚雿魡" + "調窵瘹鋽藋鑃"}, + {"d", "dian", + "敁掂厧傎嵮滇槇槙瘨颠蹎顛顚巅癫" + "巓攧巔癲齻典奌点婰敟碘蒧蕇踮點" + "电甸阽佃店坫垫扂玷钿惦婝淀琔奠" + "殿鈿蜔電墊壂澱橂靛磹癜簟驔椣"}, + {"d", "diu", "丢丟铥颩銩"}, + {"d", "ding", + "丁仃帄叮玎钉盯疔町虰耵酊釘靪艼" + "奵顶頂鼎鼑嵿濎薡鐤订饤忊矴定訂" + "飣铤萣啶椗腚锭碇碠錠顁磸"}, + {"d", "du", + "厾剢都阇督嘟醏闍独毒读渎牍椟犊" + "裻読錖獨凟匵嬻瀆殰犢櫝牘瓄皾騳" + "黩髑韣讀贕豄鑟韇韥黷讟肚笃堵赌" + "琽睹賭覩篤芏杜妒妬度荰秺靯渡镀" + "螙鍍殬斁蠧蠹叾獤"}, + {"d", "dou", + "吺剅都唗兜兠蔸橷篼唞斗阧抖枓钭" + "陡蚪鈄吋豆郖读荳逗饾浢鬥渎酘毭" + "梪脰痘閗窦鬦餖斣闘竇鬪鬬鬭乧"}, + {"d", "dong", + "东冬東咚苳岽昸氡鸫倲菄崬崠涷埬" + "娻笗氭蝀鮗鼕鯟鶇董蕫嬞懂箽諌动" + "冻侗垌恫栋胨迵姛峒挏洞凍胴戙動" + "硐湩腖棟働駧霘鶫"}, + {"d", "dui", + "垖堆塠痽磓鴭鐜鐓頧队对兊兌対兑" + "祋怼陮隊敦碓綐對憞憝錞镦薱濧懟" + "瀩譈譵轛"}, + {"d", "duan", + "耑偳媏端褍鍴短段断葮缎塅煅瑖腶" + "椴锻碫緞毈簖鍛斷躖籪"}, + {"d", "duo", + "多夛咄哆剟掇毲敠敪裰嚉夺度铎敚" + "敓剫喥痥奪凙澤踱鐸驮朵朶杕饳剁" + "沲哚挆柮柂垛垜埵缍舵崜惰媠椯躲" + "躱趓跺綞亸鬌軃嚲奲刴陊陏挅尮桗" + "堕跥飿墮憜墯鵽﨣鈬鯲"}, + {"d", "dun", + "吨惇敦蜳撴墩墪噸撉犜镦礅蹲蹾驐" + "盹趸躉伅庉沌囤炖逇钝盾砘顿鈍遁" + "頓楯遯潡燉踲碷壿"}, + {"e", "e", + "阿妸妿娿婀屙讹迗吪囮俄峉峨峩涐" + "恶娥莪哦珴訛鈋皒锇睋鹅蛾誐磀噁" + "鋨頟魤额額鵝鵞譌厄阸苊呃扼轭枙" + "垩砨饿胺阏鄂谔萼遌遏崿愕頋腭锷" + "鹗頞餩噩鳄騀戹岋呝砐砈咹咢姶匎" + "蚅軛硆悪卾偔堊堨堮湂惡軶豟鈪琧" + "廅搤搹僫蝁蕚遻餓颚閼擜諤覨鍔顎" + "歞礘櫮鶚鰐鰪齃讍齶鑩鱷仒厑蛯旕" + "鵈襨欕"}, + {"e", "en", "奀恩蒽煾峎摁"}, {"e", "ei", "欸誒"}, {"e", "eng", "鞥椧"}, + {"e", "er", + "乻儿而児陑侕荋耏峏洏栭胹唲鸸袻" + "聏輀鲕髵隭鴯鮞臑轜尔尒尓耳迩饵" + "洱毦栮珥铒鉺餌爾駬薾邇二弍弐佴" + "刵咡贰貮貳衈誀髶樲粫趰"}, + {"f", "fa", + "发冹沷発發酦彂乏伐姂坺垡茷阀疺" + "罚栰笩筏傠瞂罰閥罸墢橃藅佱法峜" + "砝灋珐琺髪髮蕟浌鍅"}, + {"f", "fang", + "匚方邡芳汸坊枋牥钫蚄淓趽鈁錺鴋" + "防妨房肪鲂魴访仿彷纺昉昘瓬眆紡" + "舫旊倣訪髣鶭放堏"}, + {"f", "fan", + "帆忛畨番勫蕃幡噃嬏憣旙旛繙翻藩" + "轓颿飜籓鱕凡凣凢匥杋柉钒矾籵舤" + "舧袢烦笲釩棥煩緐墦樊璠膰薠燔襎" + "繁羳蹯鐇礬蘩瀿蠜鷭反払仮返橎" + "犯氾汎奿饭泛贩范畈軓訉販笵盕梵" + "軬飯飰滼嬎範輽瀪"}, + {"f", "feng", + "丰风凨仹凬妦沣凮枫盽疯砜封風峰" + "峯偑桻烽堼葑崶渢猦锋犎楓蜂碸瘋" + "篈僼鄷鋒檒豐鎽鏠酆蘴寷灃蠭靊飌" + "麷冯夆沨浲逢溄堸馮艂漨缝摓綘縫" + "讽覂唪諷凤奉俸湗焨煈赗鳯鳳鴌賵" + "琒"}, + {"f", "fen", + "分芬帉吩纷氛昐玢衯紛翂躮訜酚棻" + "梤鈖雰馚餴朆饙妢岎汾坟炃朌枌羒" + "蚠蚡焚棼蒶隫魵蕡幩獖墳濆燌燓橨" + "豮鼢羵鼖豶轒鐼馩黂粉黺份弅坋忿" + "奋秎偾粪愤僨憤膹奮糞鲼瀵鱝竕瞓"}, + {"f", "fei", + "飞妃非飛菲啡婓婔渄绯扉猆暃靟" + "裶蜚緋鲱霏馡餥騑騛鯡飝肥淝腓蜰" + "朏胐匪诽奜悱棐斐翡榧蕜誹篚发芾" + "吠狒沸怫杮废肺胇昲费厞剕陫俷疿" + "萉屝廃費痱镄廢曊癈鼣蟦濷櫠鐨靅"}, + {"f", "fou", "紑缶否妚缻缹雬殕鴀"}, {"f", "fo", "仏佛坲梻"}, + {"f", "fu", + "夫伕邞孚呋妋姇玞肤胕砆衭怤柎荂荴" + "尃娐旉麸趺紨跗鈇稃綒筟鄜孵粰膚鳺" + "麩敷麬糐麱懯乀巿弗凫伏甶佛刜芾芙" + "芣扶拂泭岪绂绋咈帗苻茀枎怫服韨氟" + "祓玸枹柫炥畐畉罘茯郛鳬俘垘洑浮哹" + "莩蚨袚栿砩翇桴烰琈袱虙艴紱紼符笰" + "菔匐涪幅葍絥罦棴鳧艀鉘鉜颫辐福蜉" + "綍箙稪榑韍豧髴鴔蝠幞澓輻踾鮄諨黻" + "襆癁鮲襥鵩鶝阝父甫抚拊弣府斧郙俛" + "俌俯釜釡捬脯辅腑盙焤蜅滏腐輔頫嘸" + "撫鬴簠鯱黼讣付妇负附彿咐驸坿竎阜" + "訃負赴复祔峊袝蚥蚹副婦婏冨偩傅復" + "萯媍富赋蛗秿覄詂鲋腹椱缚赙複褔蝮" + "蝜緮蕧賦駙鮒輹嬔縛賻鳆鍑鍢馥覆鰒" + "酜﨓椨禣"}, + + {"g", "ga", + "夹旮伽呷咖嘎嘠轧钆釓尜噶錷玍尕尬" + "魀乫凩軈"}, + {"g", "gai", + "侅该陔郂荄姟峐垓赅晐祴畡絯隑賅賌" + "豥該忋改絠丐乢匃匄芥钙盖鈣摡溉葢" + "蓋戤概槩漑槪瓂"}, + {"g", "gang", + "冈冮刚扛纲岗杠肛疘矼牨岡钢缸" + "罡剛堈掆釭犅棡摃堽罁綱鋼鎠崗港焵" + "焹筻槓戆戅戇"}, + {"g", "gan", + "干甘迀奸忓杆攼玕肝姏泔苷坩矸竿柑" + "酐疳粓凲尴尲筸鳱漧尶尷魐仠芉皯衦" + "秆赶笴桿敢稈感澉趕橄澸擀簳鳡鱤汵" + "旰盰绀凎倝淦紺詌骭幹榦檊贑赣贛灨"}, + {"g", "gao", + "羔皋高羙髙皐臯膏睾槔槹橰糕篙餻韟" + "櫜鼛鷎鷱夰杲菒稁搞缟槁槀暠稿稾镐" + "縞藁藳檺鎬告郜勂诰峼祮祰锆筶誥禞" + "鋯吿"}, + {"g", "gei", "给給"}, + {"g", "ge", + "戈仡犵扢纥圪戓肐牫疙饹咯哥胳格鸽" + "袼搁割滒歌戨鴚鴿謌擱鎶呄匌佮茖阁" + "挌革鬲敋葛隔裓蛤蛒臵愅觡嗝滆塥搿" + "槅膈閤閣鞈骼韐镉獦諽輵鮯鎘韚騔鞷" + "轕个合各哿盖舸嗰虼個铬硌箇鉻乬巪" + "叾唟彁櫊"}, + {"g", "geng", + "更刯庚畊耕浭菮赓焿絚鹒縆緪賡羮鶊" + "羹郠莄哽峺挭绠埂耿颈梗綆鲠骾鯁堩" + "暅椩"}, + {"g", "gen", "根跟哏艮亘亙茛揯搄"}, + {"g", "gu", + "估杚姑沽泒孤苽咕呱轱柧骨鸪罛唂唃" + "家菰菇蛄笟軱軲觚辜酤蓇鈲毂稒箍箛" + "篐嫴橭鴣鮕鹘夃古诂汩谷股苦牯羖贾" + "钴罟蛊啒淈愲尳詁鹄馉鈷榾嗀鼓鼔榖" + "嘏皷穀縎糓薣濲臌皼餶轂盬瞽瀔鶻蠱" + "固故顾凅牿梏崮崓堌棝雇祻锢痼僱錮" + "鲴鯝顧逧脵傦"}, + {"g", "gou", + "勾句沟佝枸钩痀袧鈎缑鉤溝褠緱篝簼" + "鞲韝芶苟狗岣耇耉玽蚼笱耈豿诟坸购" + "构姤垢冓够夠啂訽詬雊遘彀媾搆煹觏" + "構撀購覯"}, + {"g", "gong", + "工弓公厷功共红杛攻供侊肱糼糿宫" + "宮恭蚣躬龚匑幊愩塨觥躳慐匔碽髸觵" + "龏龔廾巩汞拱栱拲珙輁鞏贡唝貢嗊" + "熕赣"}, + {"g", "guai", "乖摑叏拐柺枴罫箉夬怪恠"}, + {"g", "gua", + "瓜刮呱胍栝桰鸹歄煱趏劀緺踻颳鴰騧" + "冎叧剐剮寡卦诖坬挂掛啩罣絓詿褂颪"}, + {"g", "guan", + "关观纶官冠矜覌倌莞蒄棺窤関瘝癏観" + "闗鳏關鰥鱞觀馆琯筦痯管輨錧館璭舘" + "鳤卝毌丱串贯泴掼涫惯悺貫悹祼慣潅" + "摜遦樌盥罆雚躀鏆灌瓘爟矔鹳礶罐鑵" + "鸛鱹欟"}, + {"g", "gui", + "归圭妫龟邽规茥闺皈胿珪帰亀硅袿規" + "廆椝媯郌瑰摫閨鲑嫢嬀槻槼龜璝瞡鮭" + "歸雟鬶嶲騩瓌鬹蘬宄氿轨庋匦陒佹诡" + "姽垝恑攱癸軌鬼祪庪匭晷湀蛫觤詭厬" + "簋蟡攰昋刿刽炅炔柜贵桂桧椢猤筀貴" + "跪蓕瞆螝撌劌劊槶樻檜禬瞶癐襘櫃鐀" + "鳜鞼鑎鱖鱥櫷"}, + {"g", "guang", + "光灮炗炚炛茪咣姯洸垙烡桄珖胱輄" + "僙銧黆广広犷廣獷臩俇逛臦"}, + {"g", "gun", + "丨衮袞绲惃辊棍蓘滚滾蔉緄緷輥鲧磙" + "鮌鯀睔謴"}, + {"g", "guo", + "过呙咶涡埚郭堝啯猓崞锅楇聒鈛瘑墎" + "濄蝈彉嘓鍋彍蟈懖囯国囶囻圀國帼掴" + "腘漍聝幗蔮慖虢膕馘簂果菓馃淉惈褁" + "椁槨蜾粿綶裹輠餜過腂鐹"}, + {"h", "han", + "犴佄顸哻蚶酣頇谽嫨憨馠魽鼾邗汗邯" + "含函凾虷唅娢浛圅焓梒晗琀涵崡嵅寒" + "韩甝筨蜬鋡澏韓罕浫喊蔊豃厈" + "汉屽扞闬旱垾悍猂莟捍涆菡焊晘釬閈" + "皔睅蛿傼馯感颔漢撖蜭熯銲鋎暵頷憾" + "螒翰撼顄駻雗譀瀚鶾兯爳"}, + {"h", "hai", + "咍咳嗨还孩骸海胲烸酼醢亥妎骇害氦" + "餀嗐駭駴饚塰"}, + {"h", "ha", "呵哈紦铪鉿虾蛤奤乤扖溌噺鎺鱩"}, + {"h", "hao", + "茠蒿薅薧嚆乚毜皋蚝毫椃嗥獆貉豪獔" + "噑嘷獋儫濠壕嚎蠔籇譹好郝号昊昦侴" + "秏悎耗哠浩恏晧淏傐皓鄗聕號滈暤暭" + "皞皜澔镐薃皡曍皥颢顥鰝灏灝竓"}, + {"h", "hang", + "夯炕行苀迒吭斻杭肮绗桁珩蚢航笐颃" + "貥裄絎筕頏魧沆巷垳"}, + {"h", "hen", "拫痕鞎佷很哏狠詪恨"}, {"h", "hei", "黒黑嗨嘿潶"}, + {"h", "he", + "诃呵抲欱牙合訶喝嗬蠚禾纥何和咊郃" + "劾姀河盇柇狢峆饸阂曷籺紇釛荷核敆" + "盍盉害涸渮盒菏萂啝龁訸颌惒楁澕毼" + "阖鲄詥貉貈鉌閡餄麧熆鹖頜魺螛翮篕" + "餲鞨齕闔礉覈鶡皬鑉龢吓佫贺垎哬袔" + "寉焃鹄猲賀碋嗃煂熇褐赫鹤翯癋謞壑" + "嚇燺爀鶴鶮鸖靍粭遤靎靏"}, + {"h", "hong", + "叿吽呍灴轰哄訇烘軣焢硡揈渹谾薨輷" + "鍧嚝轟仜弘妅屸红纮玒汯吰闳宏宖苰" + "泓玜垬沗虹紅洪娂荭羾翃浤紘耾竑鸿" + "硔紭谹鈜閎粠竤渱葓葒綋谼翝鉷鞃魟" + "潂鋐篊黉霐彋蕻霟鴻黌唝晎讧訌閧銾" + "撔澒闂鬨闀"}, + {"h", "heng", + "亨哼涥悙脝行恒恆姮珩胻烆桁鸻撗横" + "橫衡鴴蘅鑅鵆啈"}, + {"h", "hu", + "乎匢戏虍芴苸呼泘垀昒忽曶恗烀轷匫" + "唿惚淴虖軤雽雐滹嘑寣幠糊歑膴謼抇" + "囫狐弧和瓳胡核壶隺壷斛焀鹄絗壺猢" + "搰湖喖葫媩煳楜瑚鹘鹕蔛嘝蝴箶槲魱" + "衚頶醐螜縠鍸餬觳鵠鬍瀫鶘鶦鰗乕汻" + "虎浒俿萀唬虝琥滸錿互弖户戶戸冱芐" + "护沪沍帍戽岵怙枑昈祜怘笏瓠扈婟楛" + "雇綔嗀嗀鄠嫭嫮蔰滬摢槴熩鳸鍙豰簄" + "嚛鹱護鳠頀鸌鱯粐"}, + {"h", "hua", + "化华花哗砉錵蘤划呚骅姡華铧釫釪猾" + "滑嘩搳撶劃磆鲑螖鋘蕐譁鏵驊鷨夻话" + "杹枠画桦崋婳畫畵嬅觟話摦樺槬澅嫿" + "諙諣黊舙繣譮婲埖椛硴蒊糀誮"}, + {"h", "huan", + "欢犿狟歓鴅鵍酄嚾孉獾懽歡讙貛驩还" + "郇环荁峘洹桓萑萈寏堚雈絙綄貆獂羦" + "锾圜澴缳寰嬛還阛鍰環豲镮鹮糫繯轘" + "鐶闤鬟瓛缓睆緩幻肒奂奐宦唤换涣浣" + "眩烉焕梙逭患嵈喛喚渙換愌痪豢瑍煥" + "瘓漶鲩槵澣擐藧鯇攌鯶鰀"}, + {"h", "huai", + "怀徊淮槐褢踝褱懐懷瀤櫰耲蘹坏壊壞" + "蘾"}, + {"h", "hou", + "齁侯矦鄇葔帿喉猴睺瘊銗篌骺糇翭翵" + "鍭餱鯸吼犼后郈厚茩後逅洉垕候堠豞" + "鲎鲘鮜鱟"}, + {"h", "hun", + "昏昬荤阍婚涽惛殙棔葷睧睯蔒閽轋忶" + "浑珲混馄渾魂琿餛鼲诨俒圂溷慁倱婫" + "掍焝睴觨尡諢"}, + {"h", "huang", + "巟肓荒衁宺朚塃慌皇隍凰偟黄黃葟徨" + "遑喤媓崲揘湟堭惶煌楻瑝锽墴潢獚熿" + "蝗璜艎篁諻穔癀磺蟥簧餭鳇鍠韹趪騜" + "鐄鰉鱑鷬怳恍炾晃晄谎奛幌詤熀縨謊" + "兤櫎滉愰榥曂皝鎤皩"}, + {"h", "huo", + "吙秴耠锪劐嚄豁騞攉佸和活秮秳灬火" + "邩伙钬鈥煷漷夥沎货或咟俰获捇眓閄" + "貨掝祸喐剨湱禍惑旤蒦窢鍃霍濩獲奯" + "擭檴雘謋穫镬矆彟瀖嚯藿蠖耯艧嚿曤" + "臛矐癨鑊韄靃彠"}, + {"h", "hui", + "戏灰灳炜诙咴挥拻洃恢袆虺珲烣晖豗" + "堕婎媈揮隓辉翚暉禈睢煇楎詼睳褘幑" + "噅噕撝翬輝麾徽隳瀈蘳鰴囘回囬佪廻" + "廽茴迴恛洄蚘烠逥痐蛔蛕蜖鮰虫悔毁" + "毀毇燬檓譭卉屶屷汇讳会泋浍绘哕诲" + "荟芔贿烩桧恚恵晦彗秽絵翙廆惠喙缋" + "阓湏滙匯會彚彙賄詯誨瘣僡嘒蔧蕙" + "潓寭圚憓槥暳慧橞諱嬒獩濊薈薉徻頮" + "餯藱篲檅燴璯繢穢瞺蟪嚖懳繪翽譓櫘" + "鏸儶闠靧鐬譿顪颒璤"}, + {"j", "ji", + "几讥叽击刉饥圾机刏乩芨玑肌鸡矶奇" + "其枅咭唧剞姬屐积畟笄飢基庴喞嵇嵆" + "幾赍犄筓缉朞稘畸嗘跻鳮銈僟綨緁箕" + "毄稽鹡觭躸諆緝畿嘰槣齑錤機禨墼激" + "隮襀積璣磯羁賷簊擊櫅耭雞韲鶏譏譤" + "鐖饑躋鷄鞿魕癪羇虀鑇鑙齏覉羈鸄覊" + "亼亽及伋彶吉汲岌级忣极即亟郆佶卽" + "姞叝急皍級笈革觙揤疾堲楖焏偮卙谻" + "集殛戢棘極湒塉嵴楫辑愱蒺嫉蝍趌銡" + "耤膌槉嶯潗濈蕺蕀瘠箿踑踖輯螏檝藉" + "磼襋蹐鍓艥籍鏶霵轚鶺齎躤雧己丮妀" + "犱纪泲虮济给挤脊掎鱾戟麂魢撠橶穖" + "擠蟣彑计旡记伎齐系忌坖际芰妓技剂" + "季迹垍既紀荠茤茍洎哜計記剤紒觊继" + "绩悸梞旣祭偈徛寄寂済葪蔇惎臮跡鬾" + "魝裚痵継蓟際兾勣漈漃禝穊稩暨魥鲚" + "霁跽誋諅鲫暩稷穄曁冀劑薊髻覬薺嚌" + "濟檕績罽繋璾檵蹟鵋鯽齌鯚懻癠穧骥" + "蘎蘮瀱繼鱀鰶鰿鷑霽蘻鱭驥﨤樭撃鯲" + "廭"}, + {"j", "jiang", + "江茳将姜浆畕豇將葁畺摪翞僵螀漿薑" + "缰壃殭橿螿鳉礓疅疆繮韁鱂讲奖桨蒋" + "傋塂奨奬蔣槳獎膙耩講顜匞匠弜夅降" + "洚绛弶强絳酱勥滰嵹摾犟糡醤醬糨謽" + "櫤"}, + {"j", "jie", + "节阶疖皆结階接掲秸痎街揭嗟喈喼媘" + "嫅堦椄湝脻楷煯稭鞂蝔擑謯癤鶛卩卪" + "孑尐讦刧劫岊刦杢昅杰疌衱劼刼诘狤" + "洁拮迼桔桀訐莭倢偈偼菨婕崨捷掶袺" + "蛣絜結媫傑颉鉣嵥搩滐節睫詰蜐楬楶" + "榤截鲒碣竭蓵潔镼鞊頡誱踕羯幯嶻擮" + "鮚礍鍻巀蠞蠘蠽毑姐媎解觧飷檞丯介" + "价芥岕庎吤戒届屆玠疥砎界畍衸诫借" + "蚧悈徣唶堺楐琾骱蛶誡犗褯魪鎅藉桝"}, + {"j", "jiao", + "艽交郊茭茮骄娇姣峧浇胶教焦椒蛟" + "跤虠鲛僬蕉澆憍嶕嶣嬌膠膲徼鮫穚鹪" + "礁鵁簥轇蟭鐎驕鷦鷮矫嚼臫角侥佼狡" + "饺挢绞烄晈捁笅皎脚铰搅湫絞筊賋勦" + "剿腳敫煍暞僥摷踋鉸餃撟撹儌徺劋敽" + "缴憿敿矯曒璬蟜皦繳譑孂灚攪鱎龣叫" + "呌挍峤觉訆珓校轿较敎窌窖較滘漖嘄" + "嘂嘦斠酵嶠噍潐嬓獥噭藠轎醮趭譥皭" + "釂"}, + {"j", "jian", + "戋尖幵奸间歼坚浅戔冿玪肩艰姦姧兼" + "监笺豜菅菺猏惤渐堅缄溅湔葌間雃犍" + "牋瑊椷椾睷碊蒹搛缣煎蔪箋鲣緘鹣樫" + "蕑蕳熞鳽熸縑鋻餰馢鞬艱鞯鳒瀐鵑鵳" + "殱礛瀸鰔鰜鶼殲櫼譼韀礷鰹囏虃韉鑯" + "暕囝枧拣俭茧柬笕倹捡挸湕帴减剪检" + "梘趼詃検锏睑硷裥堿減揃揀谫弿瑐絸" + "筧简戬戩碱儉翦篯撿藆襇襉檢謇蹇謭" + "簡繭礆瞼鬋鹸鰎蠒鐧鐗瀽鹻譾籛襺鹼" + "见件見建饯贱洊荐剑牮珔舰剣健俴涧" + "栫剱谏徤袸毽臶腱践跈寋楗旔賎鉴键" + "監槛榗漸僭劎劍澗箭糋諓賤踺踐趝餞" + "諫鍵薦劒劔鍳瞷磵礀繝濺檻擶瀳譛鏩" + "覵覸艦轞鐱鑑鑒鑬鑳豣彅墹麉"}, + {"j", "jia", + "加夹夾伽抸拁泇佳茄迦珈浃毠枷浹家" + "痂耞笳袈梜葭傢跏猳腵筴鉫犌嘉镓豭" + "貑鴐鎵麚甲扴圿忦郏郟荚莢唊恝脥铗" + "戛戞裌蛱颊蛺跲頬鋏頰鴶鵊岬叚玾胛" + "钾贾斚假婽徦斝椵賈鉀槚榎嘏瘕檟价" + "驾架嫁幏榢價駕稼嗧糘"}, + {"j", "jiu", + "丩勼纠朻牞鸠究糺糾赳阄萛啾揪揂湫" + "鳩揫摎樛鬏鬮九久乆乣氿汣奺灸玖舏" + "韭紤镹酒韮匛旧臼疚咎柩柾桕倃匓厩" + "救就廄廐舅廏僦慦殧舊鹫鯦麔匶齨鷲" + "杦欍"}, + {"j", "ju", + "车凥且抅拘泃匊狙岨苴驹居陱毩捄挶" + "眗疽砠罝梮蛆掬据涺崌娵婮毱趄跔跙" + "椐琚腒锔裾雎蜛艍躹諊踘鋦駒鴡鮈鞠" + "檋鞫鶋局泦侷狊桔郹焗菊啹婅淗湨椈" + "輂犑閰跼粷趜橘駶鵙繘鵴蹫鶪鼰巈" + "蘜鼳驧弆咀沮柜枸举莒矩挙椇筥龃榉" + "榘蒟聥舉踽擧櫸齟欅襷籧巨句讵苣邭" + "姖岠拒洰怇炬歫拠具昛秬钜剧俱倨倶" + "袓蚷耟粔詎距埧埾惧犋鉅飓虡豦锯窭" + "寠聚愳駏鮔踞屦劇勮遽據澽懅窶壉鋸" + "颶屨貗簴醵躆鐻懼﨔"}, + {"j", "jiong", + "冂冋坰扃埛駉駫蘏蘔囧冏迥泂炅炯逈" + "侰浻烱絅颎煚窘綗僒煛熲褧澃顈燛"}, + {"j", "jing", + "巠坕坙泾茎京径经亰荆荊秔涇婛猄惊" + "旌旍菁経稉葏晶腈睛經粳精綡聙兢" + "鲸麖鶄鶁鯨鼱驚麠井丼阱刭宑汫坓汬" + "肼穽剄殌景儆頚幜澋憬璄璟璥憼暻頸" + "蟼警劲妌迳弪净浄俓婙胫莖弳逕倞徑" + "凈竞痉竟竫淨桱梷婧脛靓敬竧痙傹靖" + "静獍誩踁境靚靜镜曔瀞鵛鏡競竸橸"}, + {"j", "jin", + "巾今仐斤钅金釒觔矜衿荕津珒紟矝琎" + "惍釿堻筋禁璡黅鹶襟仅尽卺侭巹紧堇" + "菫厪谨僅锦嫤馑漌蓳廑緊槿瑾儘錦謹" + "饉伒劤妗劲进近枃浕勁荩浸赆烬晋晉" + "祲進唫煡缙溍寖搢靳盡墐瑨歏殣凚僸" + "觐縉賮噤濅濜嚍藎嬧燼璶覲贐齽兓砛" + "琻壗"}, + {"j", "jun", + "军君汮均龟袀軍姰钧莙蚐桾菌皲鈞碅" + "筠覠銞皸皹銁鲪頵麇鍕鮶麏麕呁郡陖" + "俊骏峻馂捃浚埈隽焌晙珺葰竣畯棞雋" + "蜠箘箟賐儁寯懏餕燇駿濬鵔鵕鵘攈攟"}, + {"j", "juan", + "姢娟捐涓圈焆朘鹃裐勬镌鋑鎸鐫蠲呟" + "卷帣埍菤捲锩踡錈臇奆劵巻狷勌倦桊" + "绢悁隽眷鄄淃瓹腃睊罥絭絹睠慻蔨餋" + "獧羂讂"}, + {"j", "jue", + "噘撅撧屩屫亅孓孒决刔诀氒角芵弡決" + "抉泬玦玨珏觉疦砄虳绝挗捔倔蚗欮脚" + "桷斍覐觖訣赽掘崛崫趹鈌焳傕厥趉覚" + "絶絕阙劂谲瑴駃鴃鴂瘚爴觮獗噊蕨蕝" + "熦憰嶡嶥噱憠橛橜镢臄爵櫭蟩蟨譎爑" + "蹶蹻蹷鐍鐝矍鳜嚼匷覺觼爝灍戄攫玃" + "彏鷢矡貜躩钁"}, + + {"k", "ka", + "咖咔喀卡佧咯胩鉲凧垰桛裃閊綛聢鯑" + "鶍"}, + {"k", "kai", + "开奒開揩锎鐦凯剀闿恺垲铠慨剴蒈凱" + "嘅嵦愷楷塏輆锴暟鍇鎧闓颽忾炌烗欬" + "勓愾鎎"}, + {"k", "ken", "肎肯肻垦恳啃豤貇錹墾懇掯硍裉褃"}, + {"k", "kao", + "尻嵪髛丂考攷拷洘烤栲铐熇犒銬鲓靠" + "鮳鯌廤"}, + {"k", "kan", + "刊看栞龛勘嵁堪戡龕凵冚坎侃砍莰偘" + "惂欿歁槛輡顑轗竷衎崁墈阚磡瞰闞" + "鬫矙"}, + {"k", "ke", + "匼苛坷呵牱牁珂科轲柯钶疴砢趷蚵痾" + "軻颏棵萪稞犐搕鈳窠颗薖榼樖頦瞌蝌" + "磕顆髁醘礚壳咳殻殼翗揢可岢炣渇渴" + "敤嵑嶱克刻勀勊客峇恪娔课骒氪堁衉" + "愘缂溘愙锞嗑碦緙艐課錁騍礊厼迲硛" + "嵙兡穒鯑"}, + {"k", "kang", + "忼砊粇康閌嫝嵻漮慷槺穅糠躿鏮鱇扛" + "亢匟邟伉闶犺抗囥炕钪鈧"}, + {"k", "kua", "夸咵姱誇侉垮銙挎胯趶跨骻舿"}, + {"k", "ku", + "刳郀矻枯桍哭堀圐跍窟骷鮬苦狜楛库" + "绔俈秙庫焅袴裤絝喾瘔酷褲嚳萙鶎"}, + {"k", "kou", + "芤抠眍剾摳彄瞘口劶叩扣怐敂宼冦寇" + "釦窛筘蔻蔲滱瞉簆鷇"}, + {"k", "kong", "空倥崆涳埪悾硿箜躻錓鵼孔恐控鞚"}, {"k", "keng", "阬劥吭妔坑挳硁牼铿硜硻誙摼銵鍞鏗"}, + {"k", "kuan", "宽寛寬臗髋髖梡欵款歀窽窾鑧"}, + {"k", "kuai", + "蒯擓巜凷会块快侩郐浍哙狯脍欳塊" + "筷鲙墤鄶儈廥澮獪噲膾糩旝鱠圦"}, + {"k", "kui", + "亏岿刲悝盔窥聧窺虧顝闚巋奎晆隗鄈" + "逵馗揆葵喹骙暌戣楏楑魁睽蝰頯鍨鍷" + "櫆藈騤夔蘷虁巙犪躨傀煃跬頍磈蹞" + "归尯匮蒉喟媿馈溃愦愧匱蕢嬇嘳憒潰" + "聩聭篑謉殨膭餽簣聵籄饋"}, + {"k", "kuang", + "匡邼劻诓哐洭恇匩硄筐筺軭誆狂狅抂" + "忹诳軖軠誑鵟夼儣懭邝纩圹况旷岲況" + "矿昿贶眖砿框絋眶絖貺軦鉱鋛鄺壙黋" + "爌曠懬穬矌礦纊鑛"}, + {"k", "kun", + "坤昆晜裈堃菎猑崑崐焜琨髠髡锟鹍裩" + "褌蜫髨醌瑻熴錕鲲騉鵾鯤鶤捆悃阃壸" + "梱祵稇硱裍綑稛壼閫閸困涃睏堒潉"}, + {"k", "kuo", + "扩拡括挄栝蛞筈萿葀阔廓頢髺韕鞟闊" + "擴濶霩鞹鬠"}, + {"l", "lan", + "兰岚拦栏惏婪嵐阑葻蓝谰澜褴斓儖篮" + "镧闌藍襕懢燷燣璼襤幱譋繿籃蘭蘫瀾" + "灆攔欄斕襴灡囒籣讕躝欗襽鑭韊览浨" + "揽缆榄漤罱醂覧壈懒擥懶嬾孄覽孏攬" + "爦欖顲纜烂滥燗濫嚂爁爛瓓灠爤糷钄"}, + {"l", "la", + "拉垃柆菈啦喇搚邋旯剌砬揦磖嚹藞翋" + "落腊楋揧蜡蝋辣辢瘌蝲臈癞鬎臘攋爉" + "瓎櫴镴鯻蠟鑞凩溂鞡鮱"}, + {"l", "lai", + "来俫莱徕崃涞梾铼來倈郲徠逨庲唻婡" + "猍崍淶萊赉棶琜睐筙赖箂錸濑癞騋麳" + "鶆鯠籁襰睞賫賚賴頼顂鵣藾瀨瀬癩籟" + "萙"}, + {"l", "lang", + "啷勆郎郞郎欴莨狼桹蓈廊嫏琅斏稂锒" + "硠瑯榔蜋艆筤郒躴螂樃鋃鎯朗朖烺蓢" + "塱誏朤阆崀浪埌蒗閬"}, + {"l", "lao", + "捞撈劳労牢窂涝浶唠哰崂勞铹痨僗嶗" + "潦憥癆磱蟧簩醪鐒顟髝耂老佬荖咾姥" + "狫恅栳珯铑銠獠轑络烙閖落嗠酪耢嫪" + "嘮澇憦躼橯耮軂硓粩朥"}, + {"l", "leng", "棱唥塄楞稜碐薐冷倰堎愣睖踜"}, + {"l", "le", + "肋嘞仂阞忇艻叻扐氻乐玏泐竻砳勒楽" + "餎韷樂簕鳓鰳鱳朰榁"}, + {"l", "li", + "哩刕丽厘骊剓荲狸离梨梸犁琍悡菞喱" + "犂棃鹂缡蜊艃筣漓蓠剺嫠孷樆璃盠貍" + "鋫鲡黎褵犛蔾縭篱罹錅謧醨蟍釐離藜" + "嚟邌斄瓈鏫鵹鯬蟸黧蠡蠫灕囄蘺孋廲" + "劙鑗籬穲纚驪鱺鸝礼礼里李俚峛峢峲" + "逦娌理锂裡裏裏豊鋰鲤澧禮鯉醴鳢邐" + "鱧鱱欚力历厉屴立朸吏呖励利叓苈坜" + "沥沴岦枥苙例戾疠隶疬砅赲俪俐荔茘" + "郦栎栃轹猁悧珕栗栛涖浰莉莅娳砺砾" + "秝鬲蛎蚸粝粒笠婯唳脷悷棙傈凓厤跞" + "詈蛠痢雳鳨睙鉝厯蒞蒚搮溧塛慄暦歴" + "瑮厲綟蜧蝷篥鴗隷勵歷曆巁濿檪隸鬁" + "磿癘犡爄蠇櫔曞禲擽儮嚦攊藶瓅櫟瀝" + "壢礪麗礫蠣爏糲盭櫪瓑皪酈儷癧礰麜" + "鷅轢觻躒囇攦欐讈轣靂瓥攭靋唎甅睝" + "粴魞聢竰糎鯏鯐"}, + {"l", "lei", + "勒累傫雷蔂缧嫘畾樏擂儡縲攂镭礌櫑" + "瓃羸礧罍纍蘲鐳轠鑘靁虆欙纝鼺厽耒" + "诔洡垒絫塁誄漯蕌磊磥蕾藟壘癗櫐礨" + "蠝灅蘽讄儽壨鑸鸓肋泪类涙淚酹銇頛" + "頪錑檑颣類纇蘱禷矋"}, + {"l", "lia", "俩"}, + {"l", "lian", + "连奁怜帘涟連莲梿裢联廉慩蓮亷漣溓" + "嗹匲奩槤熑覝鲢聨聫磏褳憐匳劆噒嫾" + "濂濓薕螊聮縺翴聯謰蹥燫櫣臁镰鎌簾" + "蠊瀮鬑鰱鐮籢籨敛琏脸裣摙璉蔹嬚鄻" + "斂歛臉襝羷蘞蘝练炼恋殓堜僆萰媡湅" + "链煉楝瑓潋練澰錬鍊殮鏈鰊瀲戀纞"}, + {"l", "liang", + "良俍莨凉凉梁涼椋辌量粮粱踉墚樑輬" + "駺糧両两兩俩倆唡啢掚脼裲蜽緉魉魎" + "亮谅哴悢倞辆晾喨湸靓輌諒輛鍄"}, + {"l", "liao", + "撩蹽辽疗聊尞憀膋僚寥嵺漻潦缭嘹嶚" + "嶛寮嫽獠遼敹暸璙膫燎橑療鹩竂蟟繚" + "簝賿豂蹘廫藔屪爎爒飂髎飉鷯了钌釕" + "鄝蓼憭瞭镽尥尦炓料廖撂窷镣鐐"}, + {"l", "lie", + "裂列劣劽冽挒茢迾咧姴洌浖埒埓烈哷" + "烮栵捩猎猟蛚聗趔煭巤颲鴷鮤儠獵" + "擸犣躐鬛鬣鱲挘"}, + {"l", "lin", + "拎厸邻阾林临冧啉崊淋晽粦琳碄粼箖" + "鄰隣隣遴潾嶙獜暽辚燐斴璘霖瞵磷疄" + "臨繗翷麐轔鏻鳞瀶壣驎麟鱗菻亃僯凛" + "凜撛澟懔懍廪廩檩檁癛癝吝恡悋赁焛" + "賃蔺橉甐膦閵蹸藺躏躙躪轥"}, + {"l", "liu", + "溜熘澑蹓刘畄浏斿流留琉旈畱裗硫遛" + "旒蒥蓅骝媹嵧馏飗榴瑠镏瘤瑬劉磂駠" + "鹠橊疁镠璢癅蟉駵麍鎏鎦嚠瀏懰藰鏐" + "飀騮鐂飅鶹鰡驑柳栁桞珋桺绺锍綹鋶" + "罶熮橮羀嬼六陆翏廇塯碌鹨磟餾霤雡" + "飂鬸鷚"}, + {"l", "ling", + "令伶刢灵坽囹夌苓彾呤姈狑泠柃朎昤" + "瓴玲皊秢铃竛鸰砱陵羐凌菱淩崚掕婈" + "棂琌蛉聆紷衑翎舲笭绫羚詅軨跉祾棱" + "裬蓤龄鈴閝零綾蔆輘霊駖鹷鴒魿霗鲮" + "錂蕶澪燯霛霝齢鯪酃孁齡櫺醽麢欞爧" + "龗岭岺袊领領嶺另炩蘦靈"}, + {"l", "long", + "龙茏咙泷栊昽珑胧竜眬砻聋笼隆湰滝" + "漋槞嶐窿篭龍癃鏧霳巃巄瀧嚨蘢爖櫳" + "瓏曨襱朧矓礱礲龒龓籠豅躘聾蠪蠬靇" + "鑨驡鸗陇拢垄垅篢隴儱壟壠攏竉弄哢" + "梇徿贚"}, + {"l", "lou", + "搂瞜娄婁偻蒌溇喽楼漊慺蔞遱廔嘍熡" + "樓蝼耧耬艛螻軁謱髅髏鞻鷜嵝嶁摟塿" + "甊篓簍陋屚漏镂瘘瘺瘻鏤露"}, + {"l", "lu", + "噜撸謢擼嚕卢芦庐泸垆炉枦栌胪鸬舮" + "舻玈颅鲈馿魲盧璷壚瀘蘆廬嚧獹攎爐" + "櫨曥瓐臚矑艫籚蠦罏纑鑪髗顱鱸鸕黸" + "卤虏掳鹵鲁硵虜蓾滷塷澛樐魯磠橹擄" + "穞镥瀂氌櫓艣鏀鐪艪鑥六圥甪陆侓录" + "彔坴峍赂辂陸勎娽逯菉渌淕淥硉绿鹿" + "椂禄祿琭勠僇剹稑盝睩碌賂輅路粶箓" + "蓼蔍廘漉摝塶辘戮熝樚膔踛醁趢録錄" + "錴穋潞蕗璐簏螰鴼蹗騄轆簶鹭簬簵鏕" + "鵦鵱麓鯥騼鏴露籙鷺虂轳焒閊鈩氇轤"}, + {"l", "lv", + "驴闾榈閭膢氀櫚藘驢吕呂郘侣侶挔捛" + "捋旅梠祣偻铝稆絽屡缕僂屢膂褛鋁履" + "褸膐縷儢穭律垏虑绿率氯葎嵂滤綠緑" + "慮膟箻繂勴濾爈櫖鑢"}, + {"l", "luan", + "娈峦孪栾挛脟鸾脔滦銮鵉巒孌奱孿圝" + "攣灓欒曫羉臠圞虊灤鑾癴癵鸞卵乱釠" + "亂"}, + {"l", "lue", "寽畧稤鋝鋢"}, {"l", "lve", "掠略锊圙"}, + {"l", "lun", + "抡掄仑伦论芲沦纶囵侖轮倫陯圇淪菕" + "婨崘崙棆腀碖蜦耣綸輪踚錀鯩埨惀稐" + "溣論嗧磮"}, + {"l", "luo", + "捋啰落頱囉罗萝逻猡脶腡椤锣骡箩镙" + "螺羅覶鏍騾覼蠡儸邏蘿玀攞欏驘鸁籮" + "鑼饠囖剆倮蓏裸躶瘰蠃臝曪癳泺洛咯" + "骆峈荦络烙洜珞硌硦絡跞笿詻雒犖摞" + "漯駱鵅鮥濼纙鮱"}, + {"m", "m", "呒呣姆"}, + {"m", "mai", + "埋薶霾买荬買嘪鷶劢迈麦佅売卖脉脈" + "麥衇勱賣邁霡霢蕒"}, + {"m", "ma", + "亇妈孖抹蚂麻媽嫲摩吗嗎痲痳蔴犘蟆" + "马犸玛码馬獁溤瑪碼螞鎷鷌鰢杩祃骂" + "閁唛傌睰嘜禡榪罵駡鬕唜嘛魸蟇"}, + {"m", "man", + "埋嫚颟顢悗蛮谩蔓馒摱慲樠瞒瞞鞔謾" + "饅鳗鬘鬗鰻蠻娨屘満满滿螨蟎鏋矕曼" + "鄤僈蔄幔獌漫缦墁慢熳槾镘澷縵鏝襔"}, + {"m", "mang", + "邙牤芒吂汒忙尨杧杗氓盲盳笀恾茫厖" + "庬哤娏狵浝牻釯铓硭痝蛖鋩駹蘉莽莾" + "硥茻壾漭蟒蠎"}, + {"m", "mao", + "猫貓毛矛枆茆茅牦旄罞軞酕渵堥楙" + "锚髦鉾蝥氂髳錨蟊鶜冇夘卯戼峁泖昴" + "铆笷鉚蓩冃芼皃茂冐冒贸柕眊耄覒袤" + "貿鄚萺帽媢毷暓瑁愗鄮貌瞀蝐懋毟"}, + {"m", "mei", + "没沒坆苺枚玫栂眉脄莓郿脢梅珻睂堳" + "湄湈葿媒猸嵋腜瑂禖楣楳煤酶槑镅鹛" + "塺鋂霉鎇徾糜攗鶥黴毎每美凂挴浼羙" + "嵄渼媄媺镁嬍燘躾鎂黣妹抺沬袂昧祙" + "眛谜寐媚跊鬽痗煝魅韎睸蝞篃"}, + {"m", "me", "乄么匁扖庅嚒濹嚜嚰"}, + {"m", "men", + "闷门们扪汶玧钔門閅們菛捫璊穈鍆亹" + "虋焖悶暪燜懑懣椚"}, + {"m", "meng", + "掹蒙擝尨甿氓虻莔萌溕盟鄳甍蝱鄸儚" + "蕄瞢橗幪濛懞檬曚氋朦鹲礞鯍矇艨矒" + "饛霿靀顭鸏黾勐冡猛锰蜢艋錳獴懵蠓" + "鯭鼆孟梦夢夣懜霥"}, + {"m", "mi", + "咪眯瞇弥祢迷猕谜蒾詸謎醚糜縻麋麊" + "麿藌彌擟禰靡麛瀰獼蘪镾蘼戂攠瓕爢" + "醾醿鸍釄米芈羋侎沵洣弭敉脒渳葞蔝" + "銤濔孊灖冖糸汨沕泌怽宓觅祕峚宻秘" + "覔覓密淧幂谧蓂幎覛塓蜜榓鼏蔤滵漞" + "嘧熐冪樒幦濗謐簚櫁羃鼡袮粎裃椧嚸" + "欕"}, + {"m", "mian", + "宀芇杣眠绵婂媔棉綿臱蝒緜嬵檰櫋矈" + "矊矏丏汅沔免勉俛眄娩渑偭勔冕葂喕" + "湎睌缅愐腼緬澠靦鮸靣面麪麫糆麺麵"}, + {"m", "miao", + "喵苗媌描瞄鹋緢嫹鶓劰杪秒眇渺缈淼" + "緲篎藐邈妙庙竗玅庿缪廟"}, + {"m", "min", + "民玟苠姄岷怋旻旼盿砇珉罠崏捪缗琘" + "琝瑉碈痻鈱緍緡錉鴖鍲皿冺刡忟闵黾" + "抿泯忞敃勄闽悯敏笢閔黽惽湣敯暋愍" + "閩僶潣憫慜簢鳘蠠鰵垊笽"}, + {"m", "mie", + "乜吀咩哶孭灭烕搣滅蔑薎鴓幭篾瀎懱" + "櫗礣蠛衊鑖鱴旀"}, + {"m", "ming", + "名明鸣眀洺茗冥眳朙铭鄍蓂溟嫇猽詺" + "銘鳴榠暝瞑螟覭佲姳凕慏酩命掵"}, + {"m", "miu", "谬缪謬"}, + {"m", "mo", + "摸嚤无尛谟嫫馍模摹膜麽麼摩橅磨糢" + "謨謩嬷嬤擵饃蘑髍魔劘饝万抹懡末圽" + "没沫陌妺茉帓殁歾歿枺昩脉帞冒莫莈" + "皌秣砞眜眿袜絈眽貃蛨貊塻蓦嗼漠寞" + "獏銆靺魩黙嫼嘿墨瞐瞙瘼镆默貘蟔鏌" + "藦爅癦驀纆礳耱丆匁乮裃酛魹囕"}, + {"m", "mou", + "哞牟劺侔呣恈谋眸蛑缪踎謀鍪麰鴾繆" + "某"}, + {"m", "mu", + "毪氁模母牡亩姆畂拇畆畒姥峔牳胟砪" + "畝畞畮鉧踇木目仫牟狇沐坶苜牧炑毣" + "莫莯蚞钼雮募慔幕幙墓鉬睦楘慕暮暯" + "艒霂縸穆鞪厼榁"}, + {"n", "na", + "那南拏拿嗱搻镎鎿乸哪雫内呐吶妠纳" + "肭郍娜钠衲袦納笝軜豽捺貀鈉靹蒳魶" + "凪魸噺"}, + {"n", "nai", + "腉孻乃艿奶氖疓廼迺哪倷釢嬭佴奈柰" + "耐萘渿鼐褦螚錼"}, + {"n", "nan", + "囝囡男抩枏柟侽南莮畘难娚喃楠暔諵" + "難赧萳揇湳煵腩蝻戁婻遖"}, + {"n", "nao", + "孬呶怓挠峱铙硇蛲詉猱碙撓嶩憹蟯獶" + "譊夒鐃獿巎垴恼悩脑脳匘堖惱瑙嫐腦" + "碯闹淖閙鬧臑"}, + {"n", "nang", "囊囔乪嚢蠰馕欜饢擃曩攮灢儾齉"}, {"n", "ne", "哪疒那讷呐抐眲訥丆匁鼡縇"}, + {"n", "nei", "哪娞馁脮腇餒鮾鯘内內那氝氞錗"}, {"n", "nen", "恁嫩嫰"}, {"n", "neng", "能"}, {"n", "ng", "嗯唔"}, + {"n", "ni", + "妮尼泥兒呢坭怩籾秜铌郳倪屔淣婗" + "猊蚭埿棿跜鈮馜蜺聣輗觬貎鲵霓麑" + "鯢齯臡拟你伲伱苨妳狔抳柅掜旎晲" + "孴隬儗儞薿擬聻屰氼逆胒昵匿眤堄" + "惄腻愵溺嫟睨暱縌誽膩嬺嶷檷哛鳰"}, + {"n", "nian", + "拈蔫年秊秊哖姩秥粘鲇鲶鮎黏鯰涊" + "淰捻辇辗碾輦撵撚簐蹍攆蹨躎卄廿" + "念唸埝惗艌焾"}, + {"n", "niang", "娘嬢孃酿醸釀"}, {"n", "niao", "鸟茑袅鳥嫋裊蔦樢褭嬝嬲尿脲溺"}, + {"n", "nie", + "捏捻揑苶乜帇圼枿陧涅聂痆臬隉菍" + "啮湼敜嵲嗫踂踗踙摰镊镍噛槷嶭篞" + "臲錜颞蹑聶嚙鎳闑孽孼櫱蘖籋囁齧" + "鑈巕蠥糱糵囓躡讘鑷顳钀"}, + {"n", "nin", "囜您拰脌"}, + {"n", "ning", + "宁苧咛狞拧柠聍甯寍寕寗寜寧凝儜" + "橣擰獰嚀薴嬣檸聹鑏鬡鸋矃佞侫泞" + "倿澝濘"}, + {"n", "niu", + "妞牛牜汼狃扭纽忸炄杻钮紐莥鈕靵" + "拗"}, + {"n", "nou", "羺槈耨獳鎒檽鐞鯑"}, + {"n", "nong", + "农侬浓哝脓秾農辳儂蕽濃噥膿燶檂" + "禯穠襛譨醲欁鬞繷弄挊挵癑齈"}, + {"n", "nu", "奴伮驽孥笯駑努弩呶砮胬怒傉搙莻"}, {"n", "nv", "女钕籹釹沑衂恧朒衄"}, {"n", "nuan", "奻渜煗暖餪"}, + {"n", "nun", "黁"}, {"n", "nve", "疟虐"}, + {"n", "nuo", + "那娜挪梛傩橠儺诺逽喏掿愞搦锘榒" + "稬諾蹃鍩糑懧懦糥穤糯"}, + {"o", "ou", + "区讴沤欧殴瓯鸥塸熰歐鴎甌膒毆謳" + "藲櫙鏂鷗呕吘偶腢嘔蕅耦藕怄慪漚"}, + {"o", "o", "噢哦丆仒乯迲猠硛旕筽鳰縇穒纐"}, + {"p", "pa", + "叭汃妑苩派皅趴舥啪葩扒杷爬耙掱" + "琶筢潖帊帕怕袙巼"}, + {"p", "pai", + "拍俳徘猅排棑牌箄輫簰簲迫沠派哌" + "渒湃蒎鎃闏"}, + {"p", "pan", + "扳拌眅萠番潘攀丬爿洀柈胖般盘跘" + "蒰幋媻槃搫盤磐縏磻蹒蹣鎜蟠瀊鞶" + "坢冸判伴沜泮拚炍牉盼叛畔袢詊溿" + "頖鋬鵥襻鑻"}, + {"p", "pang", + "乓胮雱滂膀膖霶仿彷厐庞逄旁舽嫎" + "徬磅螃鳑龎龐鰟嗙耪覫髈炐肨胖眫"}, + {"p", "pao", + "抛拋泡脬萢刨庖咆狍垉炰炮爮袍匏" + "袌軳跑鞄麃麅奅疱皰砲靤麭礟礮喸" + "褜"}, + {"p", "pei", + "呸怌肧胚衃醅阫陪培赔毰锫裴裵賠" + "錇俖伂犻沛佩帔姵斾旆珮配浿辔馷" + "霈轡蓜"}, + {"p", "pen", "喷噴濆歕瓫盆葐湓呠翸喯"}, + {"p", "pi", + "丕伓伾批纰邳坯炋枈披抷狉狓岯砒" + "紕被秛秠铍悂旇耚翍豾鈚釽鉟銔髬" + "駓磇劈噼錃魾錍憵鎞礔礕霹皮阰陂" + "芘肶枇毗毘郫陴疲蚍蚾蚽豼埤啤崥" + "琵焷脾腗椑裨鈹鲏蜱罴膍隦魮鮍壀" + "篺螷鵧貔羆鼙蠯匹庀仳圮苉吡否脴" + "痞銢鴄諀嶏擗噽癖嚭屁淠揊媲嫓睥" + "辟稫潎僻澼甓疈譬闢鸊鷿迲"}, + {"p", "peng", + "匉抨泙怦恲砰硑烹梈軯閛剻漰嘭駍" + "磞芃朋竼莑倗捀堋弸袶彭棚椖搒塜" + "塳傰蓬稝鹏硼樥熢澎憉輣錋篷篣膨" + "韸髼鬅蟛蟚纄蘕韼鵬鬔騯鑝捧淎皏" + "掽椪碰槰踫輧"}, + {"p", "pian", + "片囨扁偏媥犏翩篇鶣便骈胼腁缏楄" + "楩賆跰褊骿駢蹁騈谝覑貵諞骗騙騗"}, + {"p", "piao", + "票剽勡嘌彯漂缥飘旚螵翲犥飄飃魒" + "朴嫖瓢薸闝莩殍瞟縹篻醥顠皫僄徱" + "骠慓驃鰾"}, + {"p", "pie", "氕覕撇暼撆瞥丿苤鐅嫳"}, + {"p", "ping", + "乒甹俜娉涄砯聠艵頩冯平评苹郱凭" + "呯坪枰玶胓屏洴帡荓瓶蚲萍帲淜幈" + "蓱蛢缾甁塀焩評鲆軿竮凴箳慿憑鮃" + "檘簈屛岼"}, + {"p", "pin", + "拚拼姘砏礗穦馪驞贫玭娦貧琕嫔频" + "嬪薲蘋嚬矉颦顰品榀牝汖娉聘朩"}, + {"p", "po", + "朴钋陂岥泊泼坡釙颇酦頗潑醗醱" + "鏺婆鄱蔢嘙皤繁櫇嚩叵尀钷笸鉕箥" + "駊廹迫岶洦敀昢珀破砶烞粕湐蒪魄" + "乶哛桲"}, + {"p", "pou", "剖娝抔抙捊垺掊裒箁咅哣婄犃"}, + {"p", "pu", + "仆攵攴扑抪炇陠铺痡鋪噗撲潽鯆圤" + "匍莆菩脯葡菐蒱蒲僕酺墣獛璞穙镤" + "瞨濮贌鏷纀朴浦埔圃烳普圑溥谱暜" + "諩樸擈氆檏镨譜蹼鐠堡舖舗暴瀑曝" + "巬哛"}, + {"q", "qi", + "七迉沏妻柒栖桤凄郪倛娸捿淒悽萋" + "戚桼棲敧欺欹期攲紪缉傶僛嘁墄漆" + "慽緀榿慼踦霋魌蹊鏚鶈丌亓祁齐圻" + "忯芪岐岓奇其亝祈祇斉肵歧疧俟荠" + "剘陭旂耆蚑蚔蚚脐斊竒颀畦軝跂釮" + "埼萁萕帺骐骑猉崎掑淇棋棊祺蛴琪" + "琦锜褀碕碁鬿頎愭﨑齊旗綥粸綦蜞" + "蜝璂禥蕲錡鲯藄鄿濝懠檱櫀鳍騏騎" + "臍鵸鶀鯕蘄麒鬐艩蠐騹鰭玂麡乞邔" + "企芑岂屺杞玘盀启呇唘豈起啓啟啔" + "婍绮棨晵綮綺稽諬闙气讫迄汔気汽" + "芞弃矵呮泣炁亟盵契咠砌訖栔氣欫" + "唭葺湆湇棄夡愒滊摖暣甈碶憇槭噐" + "器憩碛磜磧磩藒蟿罊鐑嵜褄螧簯簱" + "籏"}, + {"q", "qia", + "掐袷葜擖拤卡峠酠跒鞐圶冾帢洽恰" + "胢硈殎髂"}, + {"q", "qian", + "千阡仟芊迁扦奷汘圱圲汧岍杄茾佥" + "欦钎臤牵拪悭蚈铅谸釺婜牽孯掔谦" + "鈆鉛鹐签愆僉嗛骞撁搴慳遷厱諐褰" + "謙顅檶櫏攐攑簽鵮騫攓籖鬜鬝籤韆" + "仱岒扲忴拑乹前荨钤钱钳虔歬軡乾" + "偂掮揵亁媊葥鈐靬犍鉗銭墘榩箝蕁" + "潜潛羬黔橬錢黚騝騚濳灊鰬浅肷淺" + "遣膁蜸槏谴缱繾譴欠刋伣纤芡茜俔" + "倩悓堑椠棈傔嵌皘蒨慊塹蔳綪歉篏" + "儙槧篟輤縴壍嬱竏粁鎆鏲"}, + {"q", "qing", + "靑青轻氢郬卿倾寈清淸埥圊氫軽" + "傾蜻輕錆鲭鯖鑋夝甠剠勍啨情殑棾" + "葝氰晴暒擏樈檠擎黥苘顷请頃" + "庼廎漀請謦檾庆亲凊倩掅殸碃綮箐" + "靘慶磬罄濪儬硘櫦"}, + {"q", "qie", + "切癿伽茄聺且妾怯厒砌窃匧悏挈洯" + "惬淁笡蛪趄愜慊朅锲箧篋踥鍥穕鯜" + "竊"}, + {"q", "qin", + "侵亲钦衾骎媇嵚欽綅嵰誛嶔親顉駸" + "鮼寴芹芩庈肣矜秦蚙菦埐珡耹捦菳" + "禽覃鈙鈫雂琴琹溱勤靲嫀嗪廑慬嶜" + "擒噙鳹斳澿檎懄螓瘽懃蠄鵭坅昑笉" + "赾梫寑锓寝寢鋟螼吣吢抋沁唚菣揿" + "搇撳藽瀙"}, + {"q", "qiao", + "悄郻硗雀跷鄡鄥勪踍敲毃锹劁骹頝" + "墝墽燆橇幧缲磽鍫鍬繑繰趬蹺鐰乔" + "侨荞荍峤桥菬硚喬翘僑谯槗墧憔蕉" + "蕎嘺嫶鞒犞燋樵橋瞧癄礄翹譙趫櫵" + "藮鐈鞽顦巧釥愀髜壳陗俏诮帩峭窍" + "誚髚僺撬撽韒鞘鞩竅躈"}, + {"q", "qiang", + "羌呛抢斨枪戗戕玱羗将猐啌跄腔溬" + "嗴獇椌蜣锖锵羫槍牄瑲戧嶈摤篬謒" + "镪蹌蹡鎗鏘強强蔷嫱墙樯蔃漒薔彊" + "廧墻嬙檣牆艢蘠羟羥搶墏襁繈繦鏹" + "炝唴嗆熗羻"}, + {"q", "qiu", + "丘丠龟邱坵恘秋秌恷蚯媝湫萩楸湬" + "蓲鹙蝵緧篍趥穐鳅鞦鞧蟗鶖鰌鰍蠤" + "龝仇叴芁扏囚犰玌朹肍汓虬求虯泅" + "俅訄訅酋觓釚唒莍逑逎浗紌毬球梂" + "赇殏釻頄渞湭遒巯崷盚皳絿蛷煪裘" + "觩巰賕蝤璆銶醔鼽鮂鯄鰽搝糗蘒" + "蘒"}, + {"q", "qu", + "区曲匤阹佉伹诎驱岖岴屈抾坥浀胠" + "祛袪蛆紶躯區焌煀詘趋筁蛐粬趍駆" + "憈嶇敺駈誳麹魼髷麯趨軀覰麴鶌黢" + "驅鰸鱋佢劬斪朐胊菃鸲絇翑渠淭葋" + "軥蕖璖鴝磲螶蟝璩瞿鼩蘧忂灈戵爠" + "臞氍欋籧癯蠷衢欔躣鑺蠼鸜苣取竘" + "娶詓竬蝺龋齲去厺刞呿耝阒觑趣閴" + "麮鼁闃覷覻衐"}, + {"q", "que", + "炔缺缼蒛阙瘸芍却卻崅埆琷悫雀确" + "硞棤阕塙搉鹊皵碏榷愨慤碻確趞闋" + "燩闕礐鵲礭"}, + {"q", "qiong", + "銎邛卭宆穷穹茕桏筇笻赹惸焪焭" + "琼蛩蛬舼跫睘煢熍瞏窮憌橩璚儝藑" + "藭瓊竆瓗嬛"}, + {"q", "quan", + "奍弮悛圈圏棬椦箞鐉全权卷诠佺姾" + "荃峑洤恮泉牷辁拳铨痊硂惓埢婘啳" + "葲湶絟筌犈瑔輇觠詮搼跧銓蜷権踡" + "駩醛鳈鬈騡鰁巏權齤颧蠸顴犭犬犮" + "畎烇绻綣虇劝券牶勧韏縓勸楾闎"}, + {"q", "qun", "夋囷逡帬宭峮裙群羣裠麇"}, {"r", "rao", "荛娆饶桡嬈蕘橈襓饒扰隢擾绕遶繞"}, + {"r", "rang", + "嚷穣勷儴蘘獽瀼禳瓤穰躟鬤壌壤攘" + "爙让懹譲讓"}, + {"r", "ran", + "呥肰衻袇袡蚦蚺然髥髯嘫燃繎冄冉" + "苒姌染珃媣橪"}, + {"r", "re", "若喏惹热熱"}, {"r", "reng", "扔仍辸礽芿陾艿"}, + {"r", "ren", + "人亻仁壬朲忈任芢忎秂魜銋鵀忍荏" + "荵栠栣秹稔躵刃刄认讱仞仭纫屻饪" + "牣纴轫杒妊韧肕祍姙衽紉紝軔訒袵" + "梕葚腍絍鈓飪靭靱韌餁認"}, + {"r", "rong", + "戎肜栄茸荣茙狨绒毧峵容烿媶嵘搑" + "傛絨羢搈溶嵤嫆蓉榵榕榮熔穁瑢縙" + "镕褣蝾槦融螎駥嬫嶸爃鎔瀜曧蠑冗" + "宂坈傇軵氄穃"}, + {"r", "ri", + "日驲囸衵釰釼鈤馹乤乬乫乮乭乶乽" + "乼乺挘艝鑓虄"}, + {"r", "rou", + "厹禸柔粈脜葇媃揉渘楺瑈腬煣蝚糅" + "輮蹂鍒鞣騥瓇鶔鰇韖肉宍譳"}, + {"r", "ru", + "邚如侞帤茹挐桇铷袽渪筎蒘銣蝡蕠" + "儒鴑鴽嚅薷濡孺嬬曘襦蠕颥醹顬鱬" + "汝肗乳辱鄏擩入洳溽缛蓐嗕媷褥縟" + "扖杁嶿"}, + {"r", "rui", + "甤緌蕤桵蕊蕋橤繠蘂蘃壡芮汭枘蚋" + "锐蜹瑞睿鋭銳叡"}, + {"r", "ruan", + "堧撋壖阮软朊耎軟偄媆瑌腝碝緛輭" + "瓀礝"}, + {"r", "run", "闰润閏閠潤橍膶"}, + {"r", "ruo", + "挼捼叒若鄀偌弱婼渃焫楉蒻箬篛爇" + "鰙鰯鶸嵶"}, + {"s", "sang", "丧桒桑喪槡嗓搡磉褬颡鎟顙"}, + {"s", "san", + "三弎参叁毵毶厁毿犙鬖伞傘散糁馓" + "糝糣糤繖鏒鏾饊俕閐壭"}, + {"s", "sai", + "思毢愢揌塞腮毸嘥噻鳃顋鰓赛僿賽" + "簺嗮"}, + {"s", "sa", + "仨撒洒訯靸潵灑躠卅钑飒脎萨鈒馺" + "摋蕯颯薩櫒扨苆乷栍隡虄"}, + {"s", "sao", + "掻搔溞骚慅缫螦繅鳋颾騒騷鰠鱢扫" + "掃嫂埽瘙燥氉臊矂髞乺"}, + {"s", "seng", "僧鬙"}, {"s", "sen", "森椮槮襂"}, + {"s", "se", + "閪色洓涩栜啬渋铯雭歮嗇瑟塞摵歰" + "銫澁濇濏擌懎瘷穑璱澀瀒穡繬轖穯" + "鏼譅飋縇鱪"}, + {"s", "sha", + "杀杉沙纱刹砂殺莎唦猀粆紗挲铩桬" + "痧硰摋煞蔱裟榝樧噎鲨魦閷髿鯊鯋" + "鎩繺奢啥傻儍倽萐帹啑唼喢厦廈嗄" + "歃翜翣箑閯霎"}, + {"s", "shai", "筛酾篩簁簛籭色晒曬"}, + {"s", "shang", + "汤伤殇商觞禓傷蔏滳漡墒慯殤熵螪" + "觴謪鬺上垧扄晌赏樉賞鋿鏛贘鑜丄" + "尚尙恦绱緔鞝"}, + {"s", "shan", + "山彡邖删刪芟杉钐衫苫姗姍狦挻舢" + "珊栅柵脠痁扇軕掺笘釤傓跚剼搧煽" + "幓嘇潸澘鯅縿膻檆羴羶闪陕陝炶閃" + "晱睒煔熌覢讪汕疝单訕剡赸掸掞善" + "椫禅銏骟鄯僐缮墠墡樿敾歚擅" + "嬗禪膳磰赡謆繕蟮蟺鐥饍鳝騸贍譱" + "灗鱓鱔圸"}, + {"s", "she", + "奢猞赊畬畲畭輋賖賒檨舌佘折虵蛇" + "阇揲蛥舍捨叶厍设社舎厙拾涉射赦" + "設渉涻弽滠慑摄摂蔎慴歙蠂韘騇麝" + "懾灄攝欇"}, + {"s", "shao", + "莦弰捎烧梢稍焼萷旓蛸艄筲輎鞘燒" + "髾鮹勺芍杓苕柖玿韶少邵卲劭绍袑" + "哨娋紹睄綤潲蕱"}, + {"s", "shei", "谁"}, + {"s", "shen", + "申扟屾伸身籶侁参诜冞罙呻妽绅柛" + "氠穼珅姺籸娠峷莘眒甡砷深紳敒兟" + "訷棯裑葠蓡罧詵糁甧蔘糂鲹駪薓燊" + "曑鵢鯓鯵鰺什神甚鉮鰰邥弞沈矤审" + "哂矧谂谉婶訠渖諗審頣魫曋瞫瀋嬸" + "讅覾肾胂侺昚涁眘脤渗祳葚腎瘆慎" + "愼椹蜃蜄滲鋠瘮堔榊籡"}, + {"s", "shou", + "収收熟扌手守首垨艏寿受狩兽售授" + "涭绶痩膄壽夀瘦綬獣獸鏉"}, + {"s", "shi", + "尸失师呞邿诗鸤虱狮施屍浉師絁" + "釶葹湿湤溼溮蒒蓍鉇詩獅瑡酾鳲嘘" + "鳾箷蝨褷鲺鍦濕鯴鰤鶳襹釃十饣什" + "石时识实実旹飠食祏炻蚀拾姼峕埘" + "莳時遈寔湜溡塒鉐實榯蝕鲥鼫鼭識" + "鰣史矢乨豕使驶始屎宩兘笶鉂駛士" + "氏礻示市世丗仕似卋忕式戺亊事侍" + "势试呩饰视柹柿枾昰是贳恃恀眂峙" + "拭冟室适逝眎眡铈舐轼烒栻秲釈視" + "释貰弑谥徥揓崼嗜蒔勢弒軾筮睗觢" + "試鈰鉃飾鉽誓舓適奭餝餙銴諡諟澨" + "噬嬕遾螫謚簭釋襫乄辻佦竍嵵煶鮖" + "籂鰘籡鱰"}, + {"s", "sheng", + "升生阩呏声斘枡昇泩狌苼陞珄牲殅" + "陹笙湦焺甥鉎鍟聲鼪鵿渑绳憴縄繉" + "繩譝省眚偗渻圣胜晟晠乘剰盛貹剩" + "勝嵊琞聖墭榺蕂賸竔曻﨡橳"}, + {"s", "shu", + "书殳抒纾陎叔枢杸姝荼倏倐殊紓書" + "焂梳鄃菽婌掓軗淑疏疎舒琡綀毹毺" + "摅输跾踈蔬樞輸鮛橾儵攄鵨尗秫孰" + "赎塾熟璹贖属暑暏黍鼠蜀数署潻薯" + "薥曙癙藷襡襩屬术朮戍束沭述侸荗" + "咰树怷竖恕捒庶庻蒁絉術裋尌鉥腧" + "竪墅漱潄澍數豎錰霔濖樹鶐鏣虪瀭" + "糬蠴"}, + {"s", "shua", "刷唰耍誜"}, + {"s", "shuang", + "双泷爽霜雙骦孀孇騻欆鷞鹴礵艭驦" + "鸘漺慡縔塽灀﨎鏯"}, + {"s", "shuan", "闩拴閂栓涮腨"}, {"s", "shuai", "衰摔甩帅帥率蟀卛"}, {"s", "shui", "谁脽誰氵水氺说帨涗涚祱税稅裞睡"}, + {"s", "shun", "楯吮顺順舜蕣橓瞚瞤瞬鬊"}, + {"s", "song", + "忪松枀枩柗娀凇倯菘庺崧淞梥硹嵩" + "濍憽檧鬆怂悚耸竦愯楤傱嵷慫聳" + "駷讼宋诵送訟颂頌誦鎹餸"}, + {"s", "shuo", + "说説說妁烁朔铄硕欶矟蒴搠獡槊碩" + "箾鎙爍鑠"}, + {"s", "si", + "厶纟丝司糹私泀咝俬思恖鸶虒偲" + "缌媤蛳斯絲鉰楒禗飔凘厮禠蜤锶銯" + "罳鋖緦磃澌嘶噝撕蕬廝燍螄鍶颸蟖" + "蟴騦鐁鷥鼶死巳亖四似寺汜泤姒兕" + "伺佀祀孠杫価驷饲泗洠娰俟枱柶牭" + "食飤肂涘洍耜耛梩笥釲覗竢肆嗣貄" + "鈶鈻飼榹禩駟蕼儩瀃厑唜旕鯐鶍"}, + {"s", "sou", + "叟凁捜鄋搜蒐蓃廀廋嗖獀馊溲飕摉" + "摗锼螋艘醙鎪餿颼騪叜傁嗾瞍擞薮" + "藪櫢籔嗽瘶擻"}, + {"s", "su", + "苏甦酥窣稣穌鯂蘓蘇櫯囌俗玊夙诉" + "泝肃洬涑莤速珟素粛殐梀骕宿谡傃" + "粟訴肅鹔愫塑塐遡嫊嗉溯溸缩遬蔌" + "僳榡愬膆趚觫鋉餗碿樎樕憟潥潚縤" + "簌謖藗橚璛蹜驌鷫鱐苆"}, + {"s", "suan", "狻痠酸匴祘笇筭蒜算"}, + {"s", "sui", + "夊芕尿虽浽荾哸倠隋眭睢滖熣鞖濉" + "雖绥随遂遀綏隨髄瓍膸瀡髓亗岁砕" + "祟谇埣嵗煫歲歳碎睟粹隧澻穂嬘賥" + "誶燧檖禭璲穗穟邃襚繀繐繸旞譢鐆" + "鐩韢荽"}, + {"s", "sun", + "孙狲荪孫飧飱猻搎蓀槂蕵薞笋损隼" + "筍損榫箰簨鎨鶽潠"}, + {"s", "suo", + "莎莏唆娑挱桫梭挲傞睃嗍蓑羧摍缩" + "趖簑簔縮鮻所唢索琐惢锁嗩溑暛褨" + "瑣璅鎖鎻鎍鏁逤溹蜶琑嗦鱛"}, + {"t", "ta", + "他它她牠祂铊趿鉈溻塌榙禢褟踏溚" + "塔墖獭鮙鳎獺鰨拓沓挞闼狧粏崉" + "涾傝嗒遝阘搨漯毾榻澾撻誻錔橽嚃" + "鞜蹋濌鞳闒蹹闥嚺譶躢侤萙遢燵襨" + "鶎鱩"}, + {"t", "tan", + "坍贪怹痑啴舑貪滩摊嘽瘫潬擹攤灘" + "癱坛昙郯倓谈弹婒埮惔覃锬痰榃谭" + "潭憛墰墵談醈曇錟壇燂橝澹檀顃罈" + "藫壜譚醰貚譠罎忐坦钽袒菼毯僋鉭" + "嗿憳憻醓暺璮叹炭探湠嘆碳舕歎"}, + {"t", "tai", + "台囼孡苔胎邰旲坮骀抬炱炲菭跆鲐" + "颱臺箈駘鮐儓薹擡嬯檯籉呔太夳冭" + "汏汰汱忲肽态钛舦泰酞鈦溙態燤"}, + {"t", "tao", + "夲叨弢涛绦掏焘絛詜慆搯滔幍嫍槄" + "瑫韬飸縚縧轁濤謟鞱韜饕迯匋洮逃" + "咷陶桃梼萄淘绹啕祹裪蜪綯鞀鞉醄" + "鋾駣騊饀鼗讨討套"}, + {"t", "tang", + "汤铴湯嘡羰劏蝪趟薚镗蹚鏜鞺鼞坣" + "唐堂棠啺鄌傏蓎隚搪溏塘煻榶漟禟" + "瑭膅膛磄糃樘橖糖螗篖踼赯醣螳糛" + "鎕餹饄闛鶶伖帑倘偒淌惝傥耥躺镋" + "鎲儻戃爣曭矘钂烫摥燙鐋"}, + {"t", "te", "忑忒特铽慝鋱蟘朰扨脦罀"}, + {"t", "teng", + "膯鼟疼痋幐腾誊漛滕邆駦螣縢謄" + "儯藤騰鰧籐籘虅驣霯"}, + {"t", "tiao", + "旫佻庣挑恌祧聎芀条苕迢岧岹祒條" + "调萔笤蓚蓨龆樤蜩鋚鲦鞗髫鯈鎥齠" + "鰷宨晀朓脁窕誂窱斢嬥眺粜絩覜趒" + "跳糶"}, + {"t", "tian", + "天兲婖添酟靔黇靝田佃沺屇恬胋畋" + "畑畠钿甜甛菾湉填塡嗔阗搷碵緂窴" + "磌璳闐鷆鷏忝殄倎唺淟悿觍晪琠腆" + "睓痶舔餂瑱賟覥錪掭舚鴫"}, + {"t", "ti", + "体剔梯锑踢銻擿鷉鷈厗荑绨偍媞" + "崹提渧缇惿遆啼稊鹈罤题瑅綈嗁睼" + "褆碮漽蕛徲緹醍趧蹄蹏鍗鳀謕鮷題" + "鵜騠鶗鶙鯷禵鷤挮躰骵軆體戻屉洟" + "剃俶倜逖涕悌惕屜掦逷啑笹悐惖替" + "揥裼褅歒髰殢薙嚏鬀鬄瓋嚔籊趯"}, + {"t", "tie", + "帖怗贴萜聑貼铁蛈鉄銕僣鐡鐵驖呫" + "飻餮"}, + {"t", "tou", + "偷偸媮婾鋀鍮亠头投骰頭妵紏敨黈" + "蘣透"}, + {"t", "tu", + "凸宊秃禿怢突涋捸湥堗葖痜嶀鋵鵚" + "鼵図图凃荼徒途庩峹捈涂悇梌屠菟" + "揬稌瘏筡鈯嵞塗蒤腯廜潳瑹酴跿圖" + "圗馟駼鍎鵌鶟鷋鷵土圡吐钍唋釷兎" + "迌兔莵堍鵵汢溌"}, + {"t", "tong", + "恫炵通痌絧嗵蓪熥樋仝同彤佟侗庝" + "峂峒峝哃狪茼垌烔晍桐浵砼蚒秱铜" + "眮童粡赨詷酮鉖銅鉵餇鲖勭僮潼獞" + "橦犝曈朣膧燑氃穜瞳鮦统捅桶統筒" + "筩綂恸痛衕慟憅"}, + {"t", "ting", + "厅庁汀町听耓烃厛烴桯綎鞓聴聼廰" + "聽廳邒廷莛庭亭停葶婷嵉渟蜓筳楟" + "榳閮霆蝏聤諪鼮圢甼侹娗挺涏烶梃" + "珽脡铤艇颋誔鋌頲"}, + {"t", "tuan", + "猯湍圕煓貒团団抟剸摶漙團慱槫篿" + "檲鏄糰鷒鷻畽墥疃彖湪褖"}, + {"t", "tun", + "吞呑旽涒焞朜噋暾屯坉囤忳芚蛌軘" + "豚豘飩鲀魨黗霕臀臋氽褪饨"}, + {"t", "tui", + "忒推蓷藬弚颓隤尵橔頹頺頽魋蘈穨" + "蹪俀腿僓蹆骽侻退娧煺蜕蛻褪駾燵"}, + {"t", "tuo", + "乇仛讬饦托扡汑杔佗侂咜咃沰拖拕" + "说侻莌捝挩袥託飥涶脱脫馲魠鮵阤" + "驮陁陀驼狏岮沱坨柁鸵砣砤袉紽詑" + "酡跎堶馱碢槖駄駝駞橐鴕鮀鼧鵎騨" + "鼍驒驝鼉彵妥庹椭楕嫷橢鰖拓柝毤" + "萚唾跅毻箨嶞魄蘀籜鵇"}, + {"w", "wa", + "屲凹穵劸洼哇挖娲窊畖窐媧啘嗗瓾" + "蛙搲溛漥窪鼃韈攨娃瓦邷佤咓砙袜" + "聉嗢腽膃襪韤瓸甅"}, + {"w", "wai", "咼歪喎竵崴外顡"}, + {"w", "wei", + "厃危委威烓隈隇偎逶喴葳葨媙崴嵔" + "揻揋愄溦椳楲詴煨微蜲蝛覣縅薇燰" + "鳂癓鰃鰄巍霺囗为韦圩围囲闱违帏" + "沩洈峗峞為韋桅涠帷唯维惟琟嵬媁" + "圍喡幃違湋溈爲維潍鄬蓶潿潙醀鍏" + "闈鮠濰壝矀覹犩欈伟伪苇芛尾纬炜" + "玮洧浘娓荱诿隗偽偉萎崣梶痏硊骩" + "骫骪愇猥渨蒍葦徫廆椲暐煒艉痿瑋" + "韪腲鲔撱嶉僞寪蔿頠緯諉踓韑薳儰" + "濻鍡鮪颹韙瀢韡亹斖卫未位苿味胃" + "畏軎叞菋谓硙尉遗喂媦猬渭煟蔚碨" + "蜼蝟磑犚慰緭熭衛衞餧鮇懀謂罻螱" + "褽魏餵轊藯鏏鳚霨蘶饖讆躗躛讏捤" + "墛嶶"}, + {"w", "wang", + "尢尣尪汪尫尩亾兦亡王仼莣蚟罓罒" + "网彺往徃罔枉惘菵辋棢暀蛧蝄網輞" + "誷魍瀇妄迋忘旺徍望朢"}, + {"w", "wen", + "昷温溫辒殟榅瑥瘟榲緼蕰豱輼轀鳁" + "鞰鰛鰮文芠彣纹炆闻蚊蚉紋阌珳雯" + "駇馼聞瘒鳼鴍魰螡閿閺闅蟁鼤繧闦" + "刎伆吻呅抆呡肳紊桽脗稳穏穩问妏" + "免汶莬問渂揾搵絻顐璺塭鎾饂"}, + {"w", "wan", + "涴弯剜帵婠湾塆睕蜿豌潫彎壪灣丸" + "刓芄汍纨完岏抏玩紈捖顽貦烷頑翫" + "宛倇莞挽盌唍绾埦惋梚菀萖婉脘晚" + "晥晩晼琬皖椀碗畹綰綩輓踠鋔万卐" + "卍忨妧捥脕腕萬蔓輐澫鋄錽薍瞣蟃" + "贃鎫贎乛杤笂琓"}, + {"w", "weng", + "翁嗡滃鹟螉聬鎓鶲勜奣嵡蓊塕暡瞈" + "攚瓮蕹甕罋齆"}, + {"w", "wo", + "挝涡倭莴萵唩猧渦涹窝喔窩蜗蝸踒" + "我婑婐捰仴沃肟枂卧臥捾涴偓幄媉" + "渥握焥硪楃腛斡瞃龌臒瓁濣齷遤"}, + {"w", "wu", + "兀乌邬弙污汙汚圬呜巫杇於屋洿诬" + "钨恶烏剭窏鄔嗚誈誣歍箼螐鴮鎢鰞" + "亡无毋芜吾吴吳呉郚茣莁唔娪峿浯" + "洖梧祦珸铻鹀無蜈鋙蕪墲橆璑鵐蟱" + "鯃譕鼯鷡五午伍仵迕妩庑怃忤玝" + "武侮倵逜陚捂娒娬牾啎珷鹉碔摀熓" + "瑦舞憮潕廡嫵儛甒瞴鵡躌兀勿阢务" + "戊扤屼岉芴坞杌物忢旿矹卼敄俉误" + "務悟悮悞粅晤焐痦婺隖骛嵍靰雾雺" + "嵨奦溩塢鹜熃寤誤鋈窹霚鼿齀霧騖" + "蘁鶩厼朰鯲"}, + + {"x", "xi", + "夕兮邜吸汐忚西扸希卥析昔穸肸肹" + "矽怸饻恓郗茜俙徆莃奚娭唏浠狶悕" + "屖栖牺氥息悉硒琋赥釸欷晞桸惜烯" + "焁焈淅渓唽菥傒鄎焟焬犀晰晳翕翖" + "舾粞稀睎惁腊锡皙裼煕厀徯蒠溪嵠" + "僖熙熈熄榽蜥緆餏覡豨瘜磎膝潝嘻" + "噏嬉嬆凞樨橀暿歙熺熻熹螅螇窸羲" + "錫貕蹊豯蟋谿豀瞦燨犠巂繥糦鵗譆" + "醯觹鏭鐊隵酅巇嚱犧曦爔饎觽鼷鸂" + "蠵觿鑴习郋席觋習袭喺媳蓆蒵椺嶍" + "漝趘槢褶薂隰檄謵鎴鳛霫飁騱騽鰼" + "襲驨洗枲玺铣徙喜葸葈鈢鉨鉩蓰漇" + "屣憘歖禧憙諰謑縰壐蟢蹝璽鱚矖囍" + "躧匸卌戏饩屃系呬细郄怬忥盻恄郤" + "係咥屓绤欯阋細釳趇舄舃塈隙椞禊" + "慀隟綌赩熂墍犔稧潟澙戯蕮覤縘黖" + "戱戲磶虩餼鬩繫闟霼衋屭巪凩巼夞" + "莻唟裃硳喸聢噺橲礂鯐"}, + {"x", "xia", + "呷虾谺閕傄颬煆瞎蝦鰕匣狎侠俠狭" + "陜峡炠柙烚峽埉狹祫珨硖翈舺陿假" + "葭硤遐筪瑕舝敮暇辖碬磍蕸縖赮魻" + "霞鍜轄鎋黠騢鶷閜丅下吓疜夏唬厦" + "睱諕懗罅夓鎼鏬圷梺"}, + {"x", "xian", + "仚仙屳纤先奾忺佡氙杴秈苮祆枮籼" + "莶珗掀铦锨酰跹僊僲銛鲜嘕韯銽暹" + "薟憸嬐鍁韱鮮褼繊蹮馦孅攕廯纎鶱" + "躚襳纖鱻闲伭弦咁妶贤胘涎盷咸挦" + "娴娹婱蚿絃衔舷閑閒蛝鹇痫湺啣嗛" + "嫌甉銜誸賢羬稴澖憪嫻嫺撏諴醎輱" + "癇癎瞯藖礥鹹麙贒鷼鷳鷴冼狝险洗" + "显烍毨蚬崄険猃赻铣筅蜆跣禒搟尠" + "尟銑箲險獫嶮獮藓鍌燹顕幰攇蘚櫶" + "譣玁韅顯灦见县苋岘限现线臽県陥" + "宪姭娊峴陷莧哯涀垷埳現晛馅羡缐" + "睍絤腺粯塪献羨僩僴誢綫線鋧撊憲" + "橺橌錎餡縣豏壏麲臔瀗獻糮霰鼸咞" + "衘鑦"}, + {"x", "xiang", + "乡芗相香郷鄉鄊厢廂湘缃鄕葙萫薌" + "箱緗膷襄麘忀骧欀瓖镶纕鑲驤瓨降" + "佭详庠栙祥絴翔詳跭享亯响饷蚃晑" + "飨想銄餉鲞鮝蠁鯗響饗饟鱶向姠" + "巷项珦象項缿衖勨像嶑橡曏襐蟓嚮" + "鐌鱌"}, + {"x", "xiao", + "灱灲肖枭呺哓削侾骁枵绡庨烋宵宯" + "逍消鸮虓婋猇萧梟焇销痚痟翛硝硣" + "窙蛸綃揱箫嘐潇踃歊銷霄獢撨嘵憢" + "膮蕭彇颵魈鴞鴵簘蟏蟂藃穘嚣瀟蟰" + "簫髇櫹囂嚻髐鷍驍蠨毊虈洨郩崤淆" + "訤殽誵小晓暁筱筿皛篠謏曉皢孝効" + "恔咲哮涍俲笑校效啸傚敩詨誟嘨嘋" + "嘯熽歗斆斅﨧"}, + {"x", "xing", + "兴狌星垶骍猩惺煋瑆腥觪篂箵鮏興" + "觲騂曐皨鯹刑邢饧行陉形侀郉陘荥" + "洐型钘娙铏硎鈃蛵滎銒鉶鋞餳省睲" + "醒擤杏性幸姓荇莕倖婞悻涬葕緈﨨" + "嬹臖哘謃"}, + {"x", "xin", + "忄心邤辛芯妡忻炘杺欣昕盺莘俽" + "惞訢鈊锌歆新廞鋅噷嬜薪馨鑫馫枔" + "镡襑鐔伈阠伩囟孞信軐訫脪衅焮馸" + "顖舋釁"}, + {"x", "xie", + "些娎猲揳楔歇蝎蠍叶邪劦协旪胁協" + "奊垥恊峫挟拹挾脇脋脅衺斜谐偕絜" + "翓綊瑎愶嗋携熁膎鲑鞋蝢緳缬撷擕" + "縀勰諧燲嚡擷鞵襭攜孈讗龤写血冩" + "寫藛伳灺绁泄泻祄缷洩炧炨契卸卨" + "屑烲禼徢偰偞焎紲械絏絬亵谢屟媟" + "渫塮僁解靾榭榍褉暬緤噧屧獬嶰澥" + "懈廨邂薤薢糏韰謝褻燮夑瀉鞢齘繲" + "蟹蠏瀣爕齛齥纈齂躞"}, + {"x", "xiong", + "匂凶兄兇匈讻芎忷汹洶恟哅胸胷訩" + "詾賯雄熊熋焸焽诇詗夐敻楿"}, + {"x", "xu", + "吁圩戌盱疞砉欨胥须顼訏許裇虚虗" + "偦谞媭揟湑欻虛須綇楈需魆墟嘘噓" + "蕦嬃歔縃緰蝑諝歘燸譃魖繻驉鬚鑐" + "俆徐冔禑蒣许诩呴姁浒栩珝喣暊詡" + "稰鄦糈諿醑盨旭旴伵芧序汿侐卹怴" + "沀恤昫叙洫晇殈烅珬垿欰畜酗烼绪" + "续敍敘勖勗溆婿壻聓訹絮朂続賉頊" + "滀蓄慉煦槒漵潊銊聟緒盢瞁稸魣緖" + "獝藇藚續鱮﨏蓿"}, + {"x", "xiu", + "休俢修庥咻脩烌羞脙鸺臹貅馐髤銝" + "樇髹鵂鎀鏅饈鱃飍苬朽宿滫潃糔秀" + "岫峀绣珛袖臭琇锈綉溴嗅璓褏褎銹" + "螑繍嚊繡鏥鏽齅鮴"}, + {"x", "xue", + "削疶蒆靴薛辥辪鞾穴斈乴茓峃学泶" + "鸴袕踅學嶨壆噱燢澩觷鷽彐雪鳕鱈" + "吷狘岤坹桖谑趐謔瞲瀥樰膤轌"}, + {"x", "xuan", + "吅轩昍宣弲晅軒梋谖萱萲喧媗揎塇" + "愃愋煖煊蓒暄瑄睻蝖禤箮翧儇鋗鞙" + "蕿嬛懁諠諼駽鍹翾蠉矎蘐藼譞玄县" + "玹痃悬琁旋蜁嫙漩璇暶檈璿懸咺选" + "烜選癣癬券泫怰炫昡绚眩铉袨琄眴" + "衒渲絢楦楥鉉碹蔙镟颴縼繏鏇贙"}, + {"x", "xun", + "坃勋荤埙焄勛塤熏窨勲勳薫薰壎獯" + "曛臐燻蘍矄纁爋壦醺廵巡寻旬杊郇" + "询畃荨荀浔洵峋恂紃珣栒桪毥偱循" + "尋揗詢鲟鄩噚潭潯駨璕攳燖燅樳蟳" + "鱏鱘灥卂讯训迅伨驯汛侚狥逊迿巺" + "徇殉訊訓訙浚奞殾巽稄馴遜愻蕈噀" + "顨鑂嚑"}, + + {"y", "ya", + "ㄚ丫圧吖压厌呀庘押枒鸦哑鸭桠孲" + "铔雅椏鴉鴨錏壓鵶鐚牙伢芽岈厓玡" + "琊蚜笌堐猚崖崕涯釾睚衙漄齖疋厊" + "庌疨唖啞痖瘂蕥劜圠轧覀襾冴亚讶" + "迓亜犽亞軋砑挜娅垭俹氩掗訝埡婭" + "猰聐揠氬稏圔窫齾鯲鑓軈"}, + {"y", "yan", + "咽恹烟殷珚胭焉淹淊阏阉崦湮腌硽" + "煙歅鄢傿嫣漹嶖醃閹燕懨嬮篶懕臙" + "黫讠延闫妍芫严阽言訁郔岩沿炎炏" + "昖狿埏莚姸娫研铅盐娮阎啱琂硏訮" + "閆蜒綖筵嵒嵓喦塩揅楌詽碞蔅颜虤" + "閻厳檐顔顏簷壛巌嚴櫩巖巗壧鹽礹" + "麣夵抁沇奄乵兖兗匽弇俨衍剡眼酓" + "偃掩郾厣萒遃隒嵃揜渰渷扊棪愝晻" + "琰罨裺椼演嵼褗蝘魇戭噞躽縯黡檿" + "厴黤甗鶠鰋龑黭黬儼孍顩鼴鼹魘巘" + "巚曮齴黶厌妟觃牪砚姲彦彥烻唁验" + "宴艳晏覎偐谚隁焔焰焱堰喭雁敥猒" + "硯椻鳫滟溎墕熖厭酽暥鴈谳嬊餍燄" + "赝鬳諺鴳曕嚈酀騐験艶贋嚥嬿爓" + "曣騴醶齞鷃贗灔囐鷰驗醼讌觾饜艷" + "釅驠灎灧讞豓豔灩剦樮軅"}, + {"y", "yao", + "幺夭吆约妖殀祅要訞喓葽楆腰鴁鴢" + "徼邀爻尧尭肴侥荛姚峣轺垚烑陶倄" + "珧窑铫堯揺傜谣軺滧徭遥遙嗂媱猺" + "摇搖愮摿榣暚飖瑶瑤餆窯窰磘嶢嶤" + "餚繇謡謠鎐鳐颻蘨邎顤鰩鱙仸宎岆" + "抭杳枖狕苭咬柼眑窅窈舀偠婹崾溔" + "蓔榚闄騕齩鷕疟穾药钥袎窔葯筄詏" + "靿覞熎鹞獟鼼薬藥燿曜艞矅耀纅鷂" + "讑"}, + {"y", "yang", + "央姎抰泱殃胦秧眏鸯鉠雵鞅鴦鍈阳" + "阦扬羊飏炀杨旸钖疡氜劷佯徉洋" + "垟昜羏珜烊陽眻蛘揚崵崸煬楊敭瑒" + "暘瘍輰諹鍚鴹颺鰑霷鸉卬仰佒咉岟" + "坱炴柍养氧痒紻軮楧傟慃氱飬蝆養" + "駚懩攁瀁癢怏恙样羕詇漾様樣礢"}, + {"y", "ye", + "吔耶倻掖椰暍歋潱噎擨蠮邪爷捓揶" + "铘爺瑘鋣鎁ㄝ也冶野埜嘢漜壄业叶" + "曳页曵邺抴夜枼拽亱咽頁捙枽烨晔" + "液谒葉腋殗業煠馌墷璍僷燁曅曄皣" + "瞱擛鄴靥餣謁嶪嶫澲擫瞸曗鍱鎑饁" + "擪礏爗鵺鐷靨驜鸈丆亪"}, + {"y", "yi", + "一弌衤伊衣医吚壱依祎洢咿郼渏悘" + "铱猗蛜壹揖椅禕漪稦銥嫛嬄撎夁噫" + "瑿鹥繄檥檹醫毉黟譩鷖黳乁义匜仪" + "夷圯宐诒冝杝沂沶侇迤宜狋怡饴拸" + "姨恞贻峓迻荑瓵珆咦訑貤胰栘桋巸" + "眙袘宧扅萓蛇痍移椬蛦貽詒羠遗媐" + "颐飴頉誃跠椸暆疑熪遺儀彛彜嶬螔" + "頤頥顊鴺鮧簃嶷寲彝彞謻鏔籎觺讉" + "乙已以迆钇攺矣苡佁尾苢迱庡舣蚁" + "釔笖酏扆逘倚偯旑崺鈘鉯鳦裿蛾旖" + "踦輢螘敼嬟礒蟻艤顗轙齮乂亿弋刈" + "艺忆艾阣仡议肊伇芅亦异忔屹抑坄" + "呓劮役苅佚译耴杙邑枍炈易衪秇诣" + "佾呹呭驿泆怿怈绎峄浂帟帠俋弈奕" + "疫羿昳玴轶枻食栧欭袣益谊唈浥浳" + "挹悒垼埸埶逸勚萟殹翊翌悥豙豛異" + "訲訳隿釴羛鈠軼骮跇詍晹敡殔棭焲" + "蛡鄓湙幆嗌溢缢兿義亄睪獈竩痬意" + "詣肄裔裛駅榏瘗膉蜴蓺勩廙嫕潩億" + "鹝鹢毅镒瘞槸熠熤熼篒誼黓艗燚曀" + "殪瘱瞖穓螠褹縊劓薏澺嬑嶧墿圛懌" + "憶寱翳翼臆斁歝曎燡燱檍賹貖鮨鎰" + "贀镱癔藝藙繹繶豷霬鯣鶂鶃饐醷醳" + "譯議蘙瀷囈鐿鷊鷁懿襼鷧驛鷾鸃虉" + "齸讛辷匇凧弬夞畩鶍鶎"}, + {"y", "yin", + "囙因阴阥侌茵骃姻洇垔音栶氤殷陰" + "隂陻凐秵铟裀絪筃堙愔喑婣溵蔭蒑" + "禋慇瘖銦鞇磤緸諲霒駰霠闉噾濦齗" + "韾冘乑吟犾圻烎斦泿垠圁狺峾荶珢" + "訚訔訡银淫寅婬崟崯鈝龂滛碒鄞蔩" + "夤銀龈誾璌殥噖嚚蟫檭霪齦鷣廴引" + "尹饮吲蚓隐赺鈏飲淾隠飮靷輑朄趛" + "瘾檃隱嶾濥螾檼蘟櫽癮讔印茚荫洕" + "胤垽堷湚猌廕窨酳癊慭憖憗鮣懚" + "岃粌"}, + + {"y", "ying", + "应応英莺珱偀渶绬婴媖瑛煐朠锳碤" + "嫈嘤缨撄甇緓蝧罂賏樱璎鹦噟霙罃" + "褮鴬韺嬰膺應鹰甖鶑鶧罌譍孆嚶攖" + "蘡孾瀴櫻瓔礯譻鶯鑍鷪蠳纓鷹鸎鸚" + "迎盁茔荥荧盈莹萤营萦蛍営萾溁溋" + "滢蓥塋楹僌颖熒蝇潆蝿禜瑩螢營嬴" + "縈覮謍赢濙濚濴藀瀅蠅鎣巆攍瀛瀯" + "瀠贏櫿灐籝灜籯郢矨浧梬颍颕摬影" + "潁穎瘿頴鐛廮巊癭映暎硬媵膡鱦栍" + "桜愥闏"}, + {"y", "yo", "育哟唷喲罀"}, + {"y", "yong", + "佣拥邕痈庸傭嗈鄘雍嫞滽墉慵牅壅" + "澭擁噰镛郺臃癕雝鳙鏞灉廱饔鷛鱅" + "癰喁颙顒鰫永甬咏泳勇勈俑栐柡悀" + "涌埇恿惥愑湧詠硧蛹塎嵱彮愹慂踊" + "鲬踴鯒用苚蒏醟怺砽"}, + {"y", "you", + "优忧攸怮呦泑幽峳浟逌悠麀羪滺憂" + "鄾優瀀嚘懮櫌耰纋尢尤由甴沋邮犹" + "油怞肬怣疣柚庮郵莜莸秞铀蚰訧偤" + "逰遊猶游鱿鲉鈾楢猷輏駀魷蝤蝣蕕" + "鮋輶繇友有酉丣卣苃羑莠栯梄铕" + "聈湵蜏禉銪槱牖牗黝又右幼佑侑狖" + "峟囿牰祐迶哊宥姷诱唀蚴亴釉貁酭" + "誘褎鼬櫾孧"}, + {"y", "yue", + "曰曱约約箹矱哕噦月乐戉刖妜岄抈" + "礿玥泧岳说恱栎钥钺蚏蚎阅軏悦悅" + "捳跃跀鈅越粤粵鉞閲閱篗樾嬳嶽龠" + "籆蘥瀹黦躍爚禴籥鑰鸑籰鸙"}, + {"y", "yuan", + "囦肙鸢剈冤鸳眢寃涴渊渁渆渕淵葾" + "惌蒬棩鹓裷蜎箢鳶駌蜵鴛鵷嬽灁鼘" + "鼝元円邧贠沅园芫员茒杬垣爰貟笎" + "蚖袁圆原員厡媛猨援圎湲鼋缘鈨源" + "溒園圓塬猿嫄媴蒝辕榞榬緣魭縁褤" + "蝯蝝螈黿羱薗橼圜轅謜鎱櫞邍騵鶢" + "鶰厵远盶逺遠鋺夗苑妴院怨衏垸傆" + "掾禐瑗愿裫褑噮願"}, + {"y", "yu", + "込迂迃吁扝扜纡於穻陓紆盓菸淤唹" + "瘀箊与于亐予邘伃余妤扵杅欤玙玗" + "盂衧臾鱼舁竽虶禺茰俞兪谀娱娛娯" + "馀狳桙酑雩魚渔萸隅隃萮渝湡揄堣" + "堬嵎嵛崳逾喁楰愉腴畬骬虞艅觎愚" + "瑜歈榆楡牏舆窬睮褕漁蕍蝓歶雓餘" + "諛羭踰覦嬩澞璵歟螸輿鍝謣髃鮽騟" + "籅旟轝蘛鰅鷠鸆齵屿宇伛羽妪雨" + "俣俁语挧禹圄祤圉敔匬鄅偊庾萭斞" + "铻瘐楀與瑀傴寙語窳頨龉貐懙噳嶼" + "斔穥麌齬肀驭玉聿芋芌圫饫汩忬谷" + "欥育郁茟狱秗昱浴峪彧俼预钰砡粖" + "袬谕逳菀尉阈淯淢惐悆欲域堉棫棛" + "棜琙焴寓媀喻喅喩庽御遇馭飫粥鹆" + "硲硢矞裕鈺誉罭預蓣蒮煜滪愈稢戫" + "蔚僪隩嶎獄嫗緎蜮蜟毓瘉銉輍豫鋊" + "鳿遹薁蓹熨潏稶慾澦燠燏蕷鴥鴪鴧" + "錥諭閾礇禦鹬魊儥鵒礜癒醧篽饇櫲" + "蘌霱譽鐭雤鬻驈欎鷸鱊籞鸒欝龥鬰" + "鬱籲灪爩礖軉"}, + {"y", "yun", + "晕蒀缊蒕煴氲氳熅奫蝹赟馧贇匀勻" + "云伝芸员妘沄纭囩昀秐眃畇郧涢耺" + "耘紜雲鄖蒷溳愪筠筼熉澐蕓鋆篔縜" + "橒允阭狁抎夽陨荺殒隕喗鈗馻殞磒" + "賱霣齫齳孕运郓枟恽酝鄆傊運愠惲" + "慍暈韫腪韵褞熨蕴薀縕醖醞餫韞韗" + "藴蘊韻抣"}, + {"z", "za", + "帀扎匝沞咂拶桚鉔魳臜臢杂沯砸韴" + "雑襍雜囃囋雥咋乽橴"}, + {"z", "zan", + "兂糌橵篸簪簮鵤鐟鐕咱偺喒拶昝寁" + "揝撍噆儧攅攒儹攢趱趲暂暫賛赞錾" + "鄼酂濽蹔鏨贊瓉瓒酇囋灒讃瓚禶襸" + "讚饡"}, + {"z", "zao", + "傮遭糟醩蹧凿鑿早枣蚤棗澡璪薻藻" + "灶皂皁造唣唕梍慥煰喿艁簉噪燥竃" + "竈譟趮躁栆"}, + {"z", "zang", + "匨赃牂脏羘賍賘臧贓髒贜驵駔奘弉" + "塟葬蔵銺藏臓臟欌"}, + {"z", "zai", + "灾災甾哉烖栽渽溨睵賳仔宰载崽再" + "扗在洅傤載酨儎縡岾"}, + {"z", "ze", + "则沢泽泎责迮咋择則帻啧啫舴笮責" + "矠滜溭箦嘖嫧幘蔶赜樍歵諎擇瞔皟" + "簀賾礋襗謮蠌齚齰鸅仄庂汄昃昗侧" + "捑崱択硳"}, + {"z", "zeng", + "曽曾増鄫缯增憎橧璔磳矰罾繒譄综" + "锃鋥赠熷甑鬵贈囎"}, + {"z", "zen", "怎谮譖"}, {"z", "zei", "贼戝賊鲗蠈鰂鱡"}, + {"z", "zha", + "扎吒咋抯挓查柤奓紥哳偧紮渣溠喳" + "猹揸楂劄摣皶觰樝皻譇齄齇轧札闸" + "炸铡蚻喋牐閘箚耫鍘譗厏苲拃眨砟" + "鲊鲝鮓鮺乍诈灹咤栅柞痄宱蚱詐搾" + "槎榨蜡霅醡蓙"}, + {"z", "zhai", + "侧夈捚斋斎摘榸齋宅择翟檡窄鉙责" + "柴债砦祭債寨粂瘵"}, + {"z", "zhan", + "占沾枬毡旃栴蛅粘飦趈詀惉詹閚谵" + "薝邅噡嶦霑氊氈瞻鹯旜譫饘鳣魙驙" + "鸇鱣讝斩飐盏展崭斬琖盞搌辗嶄嶃" + "榐颭醆嫸橏輾黵佔战栈桟站绽偡菚" + "湛棧戦綻輚嶘戰虥虦襢覱轏譧驏蘸"}, + {"z", "zhao", + "佋钊妱招巶昭釗着啁朝鉊鼌駋嘲鍣" + "皽爫爪找沼瑵召兆诏枛炤狣垗赵笊" + "肁棹旐詔罩照肇肈箌趙曌燳鮡瞾櫂" + "羄罀"}, + {"z", "zhang", + "仉张張章鄣傽蔁遧粻嫜獐彰漳慞樟" + "暲璋餦蟑騿麞鱆长涨掌漲礃丈仗扙" + "帐杖胀账涱帳脹障痮幛嶂墇賬瘴瘬" + "瞕粀幥鏱"}, + {"z", "zhe", + "折蜇遮嗻嫬螫厇歽矺砓虴籷袩埑哲" + "啠辄晢晣悊喆詟蛰谪摺輒輙銸磔辙" + "蟄鮿謫謺嚞轍讁讋者锗褚赭踷鍺褶" + "襵这柘這浙淛蔗樜鹧蟅鷓粍"}, + {"z", "zhei", "这"}, + {"z", "zhong", + "中伀汷彸刣忪妐炂忠泈终钟柊盅衳" + "舯衷終鈡蜙锺幒蔠銿鴤螤螽鍾鼨蹱" + "鐘籦肿种冢喠尰煄腫歱塚種瘇徸踵" + "众仲妕狆祌衶重茽蚛眾偅堹媑筗衆" + "諥"}, + {"z", "zheng", + "丁正争佂诤征姃怔爭糽埩炡政挣狰" + "峥烝脀钲眐症聇睁铮掙崝崢猙揁媜" + "筝踭鉦睜徰蒸錚箏篜鲭鬇癥鏳氶抍" + "拯掟晸愸撜整证郑証幁塣諍靕鄭" + "鴊證"}, + {"z", "zhi", + "之氏支只卮汁芝汦汥吱巵知肢泜织" + "枝栀祗胝胑秓衼疷隻脂祬栺倁梔椥" + "臸綕禔稙搘馶蜘榰憄鳷鴲織鼅蘵执" + "侄妷直姪值値聀釞职淔埴執殖戠植" + "犆禃跖絷瓡馽摭潪嬂漐慹踯膱樴縶" + "蹢蹠職蟙軄躑夂止阯劧旨帋芷扺沚" + "纸址坁坧抧茋祉秖恉轵枳砋衹咫指" + "洔淽茝紙疻訨趾黹軹酯徴墌徵藢襧" + "芖至豸扻伿识忮志炙质治垁郅迣厔" + "制帜帙挃庢庤陟峙洷栉柣祑挚桎晊" + "歭秩贽轾徏娡狾致袟紩畤窒痔痓铚" + "鸷貭翐觗袠猘徝掷乿剬偫秷梽智滞" + "崻傂骘痣彘蛭置锧跱輊筫雉寘搱廌" + "滍稚滯墆銍製覟誌瘈疐觯踬質鋕熫" + "稺膣摯摨幟擳隲璏旘瀄鴙駤緻螲懥" + "櫛穉儨劕擿擲懫贄觶騭鯯櫍瓆豑礩" + "騺驇鷙躓鑕豒俧潌"}, + {"z", "zhou", + "州舟诌侜周洲诪炿烐珘调郮辀婤淍" + "啁週徟鸼矪粥喌赒輈銂輖賙霌鵃謅" + "盩嚋騆譸妯轴軸肘疛帚菷晭睭箒鯞" + "纣伷咒呪绉宙冑祝昼咮荮紂胄" + "皱酎粙舳晝葤詋甃僽駎皺縐噣" + "骤繇籀籕籒驟碡駲"}, + {"z", "zhua", "抓挝撾檛膼簻髽爪"}, + {"z", "zhu", + "朱邾侏诛茱洙诸珠株猪秼铢硃袾蛛" + "絑誅跦銖槠蝫潴蕏橥諸豬駯鴸鮢鼄" + "藸瀦鯺櫫櫧蠩术竹竺笁柚茿炢烛" + "逐窋笜逫蓫瘃篴燭蠋躅鱁劚孎灟爥" + "斸欘曯蠾钃丶主劯宔拄柱罜陼帾渚" + "煮煑属詝褚濐嘱燝麈瞩囑鸀矚宁伫" + "住佇芧苎助纻坾贮驻迬杼拀注祝柷" + "炷殶壴莇祩竚眝疰砫蛀紵紸著庶羜" + "铸筑貯軴註跓嵀鉒筯飳馵箸翥樦鋳" + "駐麆築篫簗鑄墸"}, + {"z", "zhen", + "贞针侦帧浈胗珍珎貞針祯桢真眞砧" + "帪偵酙葴幀寊湞遉斟溱嫃獉搸蓁蒖" + "甄椹楨禎鉁禛瑧榛碪殝潧箴臻樼澵" + "薽錱轃鍼籈鱵诊枕抮轸昣弫姫屒眕" + "疹畛袗聄紾裖軫覙診缜駗稹縝縥辴" + "鬒黰阵圳纼甽鸩陣侲挋振栚朕紖眹" + "赈塦揕絼賑誫镇震鴆鎭鎮鋴"}, + {"z", "zhuai", "拽转跩"}, + {"z", "zhui", + "隹追骓椎锥錐騅鵻沝坠笍娷缀缒甀" + "腏惴畷膇硾墜綴赘縋諈醊錣礈贅鑆"}, + {"z", "zhuang", + "庄妆妝庒荘莊娤桩梉粧装湷裝樁糚" + "奘壮壯状狀壵焋僮幢撞戆"}, + {"z", "zhuan", + "专叀専砖專鄟嫥塼甎瑼膞磗颛磚諯" + "顓蟤鱄转孨竱轉传沌灷啭転堟蒃瑑腞" + "赚僎馔撰篆篹襈縳賺譔饌籑囀"}, + {"z", "zhun", "屯迍宒肫窀谆啍諄衠准埻凖準綧訰稕"}, + {"z", "zhuo", + "拙炪捉倬桌棁梲涿棳焯槕穛擢鐯穱" + "彴犳汋圴灼妰卓叕茁浊斫烵浞诼丵酌" + "娺啄啅着椓晫斮斱琢琸硺罬窡禚斲撯" + "擆劅諑諁鋜篧缴濁濯斵斀謶镯櫡鵫躅" + "蠗灂鐲鷟籗蠿籱窧"}, + {"z", "zou", + "邹驺陬郰诹菆掫棷棸鄒緅箃諏鲰鄹黀" + "鯫騶齱齺赱走奏揍"}, + {"z", "zong", + "宗枞倧骔综堫惾腙葼猣嵏嵕棕椶朡稯" + "嵸潈綜緃翪踪踨緵熧蝬磫繌鍐鬃騌蹤" + "騣鯮鬉鬷鯼鑁总倊偬捴揔搃惣焧傯蓗" + "摠総縂緫燪總纵昮疭猔碂粽糉瘲縦縱" + "豵糭"}, + {"z", "zi", + "仔孖孜吱甾茊茲兹姿姕咨赀资玆栥紎" + "赼缁秶崰淄谘菑葘鄑滋湽嵫椔粢辎嗞" + "孳孶锱禌趑觜訾資貲緇緕龇鈭稵镃輜" + "鼒鲻髭輺錙諮趦澬鍿鎡頾頿齍鶅鯔鰦" + "纃齜蓻子吇杍姊姉胏秄矷虸耔籽秭呰" + "茈笫釨梓啙紫滓訿榟字芓自荢茡剚倳" + "牸恣眦眥渍胾胔漬嗭魸鯑"}, + {"z", "zu", + "苴租菹葅蒩卆足卒哫崒崪族椊箤踤" + "镞鏃阻诅组祖珇爼俎唨組詛靻鼡乼"}, + {"z", "zun", "尊嶟遵樽罇繜鐏鳟鷷鱒僔噂撙譐捘銌"}, + {"z", "zui", + "咀厜脧嗺樶蟕纗觜嶊嘴噿璻栬冣絊酔" + "晬祽最稡罪辠酻槜醉蕞嶵鋷錊檇檌"}, + {"z", "zuan", "钻鉆劗鑚躜躦鑽篹繤缵纂纉纘籫赚攥"}, + {"z", "zuo", + "作嘬穝昨莋秨笮捽琢筰鈼稓左佐撮繓" + "阼坐怍岞岝侳祚胙袏座唑做葃葄飵糳" + "咗"}}; + +CharacterTransliterate::CharacterTransliterate(void) +{ +} + +CharacterTransliterate::~CharacterTransliterate() +{ +} + +bool CharacterTransliterate::IsChineseCharacter(wchar_t chineseCharacter) +{ + return (unsigned short)chineseCharacter >= 0x4E00 && (unsigned short)chineseCharacter <= 0x9FCF; +} + +Container CharacterTransliterate::GetContainer(std::wstring wChinese) +{ + Container container; + size_t count = wChinese.size(); + std::vector> initialsVectors; + std::vector> nameFullFightsVectors; + for (size_t index = 0; index < count; index++) { + std::vector initials; + std::vector nameFullFights; + std::wstring childwChineseCharacter = wChinese.substr(index, 1); + GetCommonPronunciation(childwChineseCharacter, initials, nameFullFights); + if (!initials.empty() && !nameFullFights.empty()) { + initialsVectors.push_back(initials); + nameFullFightsVectors.push_back(nameFullFights); + } + } + HILOG_INFO("CharacterTransliterate GetContainer length:%{public}d", nameFullFightsVectors.size()); + container.initialsContainer_ = initialsVectors; + container.nameFullFightContainer_ = nameFullFightsVectors; + return container; +} + +void CharacterTransliterate::GetCommonPronunciation( + std::wstring &chineseCharacter, std::vector &initials, std::vector &nameFullFights) +{ + // Only one character can be entered + if (chineseCharacter.size() > 1) { + return; + } + initials.clear(); + nameFullFights.clear(); + std::string chineseCharacterString = WstringToString(chineseCharacter); + // If it is a Chinese character, there is no need to transcode Unicode here. + // The system will transcode it. Only the Chinese character needs to be matched directly. + if (IsChineseCharacter(chineseCharacter[0])) { + int len = 411; + for (int index = 0; index < len; index++) { + std::string::size_type find = + CharacterTransliterate::chineseTable_[index].chineseCharacters_.find(chineseCharacterString); + if (find != std::string::npos) { + initials.push_back(StringToWstring(CharacterTransliterate::chineseTable_[index].initials)); + nameFullFights.push_back(StringToWstring(CharacterTransliterate::chineseTable_[index].nameFullFight_)); + } + } + } else { + initials.push_back(chineseCharacter); + nameFullFights.push_back(chineseCharacter); + } +} + +// sort Chinese Pinyin combinations +std::vector> CharacterTransliterate::GetCombinedVector( + std::vector> sourceVector) +{ + // gets the first set of attributes in the sourcevector collection + std::vector> targetVector; + targetVector.push_back(sourceVector[0]); + // start the traversal from the second set of attributes in the sourcevector collection + int size = sourceVector.size(); + for (int i = 1; i < size; i++) { + std::vector nextVector = sourceVector[i]; + // traverse the combination of the second set of attributes and the first set of attributes + // set an intermediate array to store the data after attribute combination + std::vector> tempVector; + for (std::wstring nextStr : nextVector) { + for (std::vector targetStrVector : targetVector) { + for (std::wstring targetStr : targetStrVector) { + // put the combined attributes into a temporary array + std::wstring tempString = targetStr + nextStr; + std::vector temp; + temp.push_back(tempString); + tempVector.push_back(temp); + } + } + } + targetVector = tempVector; + } + return targetVector; +} + +// Split Chinese Pinyin with '|' +std::wstring CharacterTransliterate::Join(std::vector> strVector, std::wstring split) +{ + std::wstring str; + for (std::vector childVector : strVector) { + size_t len = childVector.size(); + for (size_t i = 0; i < len; i++) { + str.append(childVector[i]); + if (i < len - 1) { + str.append(split); + } + } + } + return str; +} + +std::string CharacterTransliterate::WstringToString(std::wstring wstr) +{ + using convert_typeX = std::codecvt_utf8; + std::wstring_convert converterX; + return converterX.to_bytes(wstr); +} + +// convert string to wsstring +std::wstring CharacterTransliterate::StringToWstring(std::string str) +{ + using convert_typeX = std::codecvt_utf8; + std::wstring_convert converterX; + return converterX.from_bytes(str); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/ability/sinicization/src/construction_name.cpp b/ability/sinicization/src/construction_name.cpp new file mode 100644 index 0000000..30dbdcc --- /dev/null +++ b/ability/sinicization/src/construction_name.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2021 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 "construction_name.h" + +#include "character_transliterate.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +std::string ConstructionName::local = "zh-CN"; +ConstructionName::ConstructionName() +{ +} + +ConstructionName::~ConstructionName() +{ +} + +ConstructionName ConstructionName::GetConstructionName( + std::string &chineseCharacter, ConstructionName &constructionName) +{ + CharacterTransliterate characterTransliterate; + if (strcmp(local.c_str(), "zh-CN") == 0) { + Container container = + characterTransliterate.GetContainer(characterTransliterate.StringToWstring(chineseCharacter)); + std::wstring split(L"||"); + std::wstring initials = characterTransliterate.Join(container.initialsContainer_, split); + std::wstring nameFullFight = characterTransliterate.Join(container.nameFullFightContainer_, split); + constructionName.initials_ = characterTransliterate.WstringToString(initials); + constructionName.nameFullFight_ = characterTransliterate.WstringToString(nameFullFight); + const wchar_t *nameFullFightInitials = nameFullFight.c_str(); + if ((nameFullFightInitials[0] >= L'a' && nameFullFightInitials[0] <= L'z') || + (nameFullFightInitials[0] >= L'A' && nameFullFightInitials[0] <= L'Z')) { + std::string sortFirstLetterTemp = characterTransliterate.WstringToString(nameFullFight.substr(0, 1)); + std::transform( + sortFirstLetterTemp.begin(), sortFirstLetterTemp.end(), sortFirstLetterTemp.begin(), std::toupper); + constructionName.sortFirstLetter_ = sortFirstLetterTemp; + int code = constructionName.sortFirstLetter_.c_str()[0]; + constructionName.sortFirstLetterCode_ = code; + HILOG_INFO(" GetConstructionName sortFirstLetterCode :%{public}d", code); + } else { + std::wstring sortFirstLetter(L"#"); + constructionName.sortFirstLetter_ = characterTransliterate.WstringToString(sortFirstLetter); + constructionName.sortFirstLetterCode_ = -1; + } + } else { + constructionName.initials_ = chineseCharacter; + constructionName.nameFullFight_ = chineseCharacter; + if ((chineseCharacter[0] >= 'a' && chineseCharacter[0] <= 'z') || + (chineseCharacter[0] >= 'A' && chineseCharacter[0] <= 'Z')) { + std::string sortFirstLetterTemp = chineseCharacter.substr(0, 1); + std::transform( + sortFirstLetterTemp.begin(), sortFirstLetterTemp.end(), sortFirstLetterTemp.begin(), std::toupper); + constructionName.sortFirstLetter_ = sortFirstLetterTemp; + int code = constructionName.sortFirstLetter_.c_str()[0]; + constructionName.sortFirstLetterCode_ = code; + HILOG_INFO(" GetConstructionName sortFirstLetterCode1 :%{public}d", code); + } else { + std::string sortFirstLetter("#"); + constructionName.sortFirstLetter_ = sortFirstLetter; + constructionName.sortFirstLetterCode_ = -1; + } + } + constructionName.disPlayName_ = chineseCharacter; + return GetPhotoFirstName(constructionName); +} + +ConstructionName ConstructionName::GetPhotoFirstName(ConstructionName &constructionName) +{ + if (!constructionName.disPlayName_.empty()) { + CharacterTransliterate characterTransliterate; + std::wstring nameWstr = characterTransliterate.StringToWstring(constructionName.disPlayName_); + int len = nameWstr.size(); + for (int index = 0; index < len; index++) { + if (characterTransliterate.IsChineseCharacter(nameWstr[index])) { + std::wstring childwChineseCharacter = nameWstr.substr(index, 1); + constructionName.photoFirstName_ = characterTransliterate.WstringToString(childwChineseCharacter); + return constructionName; + } + } + if ((constructionName.disPlayName_[0] >= 'a' && constructionName.disPlayName_[0] <= 'z') || + (constructionName.disPlayName_[0] >= 'A' && constructionName.disPlayName_[0] <= 'Z')) { + constructionName.photoFirstName_ = constructionName.disPlayName_[0]; + } + } + return constructionName; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..42ca13d --- /dev/null +++ b/config.json @@ -0,0 +1,66 @@ +{ + "app": { + "bundleName": "com.ohos.contactsdataability", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.contactsdataability", + "name": ".ContactsDataAbility", + + "deviceType": [ + "smartVision" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "permissions": [ + "com.ohos.contactsdataability.DataAbilityShellProvider.PROVIDER" + ], + "name": "ContactsDataAbility", + "icon": "$media:icon", + "description": "dataability_description", + "type": "data", + "uri": "dataability://com.ohos.contactsdataability", + "visible":true, + "srcLanguage":"c++" + }, + { + "permissions": [ + "com.ohos.voicemailability.DataAbilityShellProvider.PROVIDER" + ], + "name": "VoiceMailAbility", + "icon": "$media:icon", + "description": "dataability_description", + "type": "data", + "uri": "dataability://com.ohos.voicemailability", + "visible":true, + "srcLanguage":"c++" + }, + { + "permissions": [ + "com.ohos.calllogability.DataAbilityShellProvider.PROVIDER" + ], + "name": "CallLogAbility", + "icon": "$media:icon", + "description": "dataability_description", + "type": "data", + "uri": "dataability://com.ohos.calllogability", + "visible":true, + "srcLanguage":"c++" + } + ] + } +} \ No newline at end of file diff --git a/contacts/BUILD.gn b/contacts/BUILD.gn new file mode 100644 index 0000000..66366b6 --- /dev/null +++ b/contacts/BUILD.gn @@ -0,0 +1,92 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//build/lite/config/component/lite_component.gni") + +## Build contactsapi.so {{{ +config("contactsapi_public_config") { + visibility = [ ":*" ] + include_dirs = [ + "include", + ] + cflags = [ ] +} + +ohos_shared_library("contactsapi") { + sources = [ + "src/native_module.cpp", + "src/result_convert.cpp", + "src/contacts_api.cpp", + "src/contacts_build.cpp", + "src/contacts_control.cpp" + ] + + include_dirs=[ + "//utils/system/safwk/native/include", + "//utils/native/base/include", + "//base/hiviewdfx/hilog/interfaces/native/innerkits/include", + "//foundation/aafwk/standard/interfaces/innerkits/want/include", + "//foundation/appexecfwk/standard/kits/appkit/native/app", + "//foundation/aafwk/standard/interfaces/innerkits/want/include/ohos/aafwk/content", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager/include", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler/include", + "//foundation/aafwk/standard/services/abilitymgr/include", + "//foundation/appexecfwk/standard/common/log/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//foundation/aafwk/standard/interfaces/innerkits/base/include/ohos/aafwk/base", + "//foundation/aafwk/standard/frameworks/kits/ability/native/include", + ] + + deps = [ + "//foundation/aafwk/standard/frameworks/kits/ability/native:abilitykit_native", + "//foundation/ace/napi:ace_napi", + "//foundation/aafwk/standard/frameworks/kits/appkit:appkit_native", + "//utils/native/base:utils", + "//foundation/aafwk/standard/interfaces/innerkits/want/:want", + "//foundation/distributedschedule/safwk/interfaces/innerkits/safwk:system_ability_fwk", + "//foundation/aafwk/standard/frameworks/kits/ability/native:dummy_classes", + "//foundation/appexecfwk/standard/common:libappexecfwk_common", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + ] + + public_configs = [ ":contactsapi_public_config" ] + external_deps = [ + "hiviewdfx_hilog_native:libhilog", + "ability_runtime:ability_manager", + "ability_runtime:want", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "eventhandler:libeventhandler", + "ipc:ipc_core", + "native_appdatamgr:native_appdatafwk", + "native_appdatamgr:native_dataability", + "native_appdatamgr:native_preferences", + "native_appdatamgr:native_rdb", + ] + + if (is_standard_system) { + external_deps += [ "hiviewdfx_hilog_native:libhilog" ] + } + else + { + external_deps += [ "hilog:libhilog" ] + } + public_deps = [] + relative_install_dir = "module" + part_name = "contactsdata_hap" + subsystem_name = "applications" +} +## Build contactsapi.so }}} diff --git a/contacts/include/contacts_api.h b/contacts/include/contacts_api.h new file mode 100644 index 0000000..d6332f8 --- /dev/null +++ b/contacts/include/contacts_api.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_API_H +#define CONTACT_API_H + +#include "contacts_build.h" +#include "contacts_napi_object.h" + +namespace OHOS { +namespace ContactsApi { +void Init(napi_env env, napi_value exports); +napi_value AddContact(napi_env env, napi_callback_info info); +napi_value DeleteContact(napi_env env, napi_callback_info info); +napi_value UpdateContact(napi_env env, napi_callback_info info); +napi_value QueryContact(napi_env env, napi_callback_info info); +napi_value QueryContacts(napi_env env, napi_callback_info info); +napi_value QueryContactsByEmail(napi_env env, napi_callback_info info); +napi_value QueryContactsByPhoneNumber(napi_env env, napi_callback_info info); +napi_value QueryGroups(napi_env env, napi_callback_info info); +napi_value QueryHolders(napi_env env, napi_callback_info info); +napi_value QueryKey(napi_env env, napi_callback_info info); +napi_value QueryMyCard(napi_env env, napi_callback_info info); +napi_value IsMyCard(napi_env env, napi_callback_info info); +napi_value IsLocalContact(napi_env env, napi_callback_info info); +void Execute(napi_env env, void *data); +void ExecuteAsync(napi_env env, void *data); +void ExecuteDone(napi_env env, napi_status status, void *data); +void ExecuteSyncDone(napi_env env, napi_status status, void *data); +int GetMethodType(napi_env env, napi_callback_info info); +int GetRawIdByResultSet(const std::shared_ptr &resultSet); +napi_value CreateAsyncWork(napi_env env, ExecuteHelper *executeHelper, napi_callback_info info); +napi_value LocalExecute(napi_env env, ExecuteHelper *executeHelper); +void LocalExecuteAddContact(napi_env env, ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteDeleteContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryContactsOrKey(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryContactsByData(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryGroup(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryHolders(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteQueryMyCard(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteUpdateContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteIsLocalContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +void LocalExecuteIsMyCard(napi_env env, const ExecuteHelper *executeHelper, napi_value &result); +napi_value Scheduling(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper, int actionCode); +void SetChildActionCodeAndConvertParams(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper); +NativeRdb::DataAbilityPredicates ConvertParamsSwitchSplit( + int code, napi_env env, napi_value &key, napi_value &hold, napi_value &attr); +std::shared_ptr GetDataAbilityHelper(napi_env env); +void HolderPredicates(const Holder &holder, NativeRdb::DataAbilityPredicates &predicates); +void AttributesPredicates(ContactAttributes &attrs, NativeRdb::DataAbilityPredicates &predicates); +NativeRdb::DataAbilityPredicates BuildQureyContactPredicates( + napi_env env, std::string key, napi_value hold, napi_value attr); +NativeRdb::DataAbilityPredicates BuildUpdateContactPredicates(napi_env env, napi_value contacts, napi_value attr); +NativeRdb::DataAbilityPredicates BuildQuerytContactData(napi_env env, napi_value &contactsObject, + napi_value &attrObject, std::vector &valueContactData); +std::vector BuildUpdateContactColumns(); +void BuildUpdateContactConvertParams( + napi_env env, napi_value &contacts, napi_value &attr, ExecuteHelper &executeHelper); +NativeRdb::DataAbilityPredicates BuildQureyContactsPredicates(napi_env env, napi_value hold, napi_value attr); +NativeRdb::DataAbilityPredicates BuildQureyContactsByEmailPredicates( + napi_env env, std::string email, napi_value hold, napi_value attr); +NativeRdb::DataAbilityPredicates BuildQureyContactsByPhoneNumberPredicates( + napi_env env, std::string phoneNumber, napi_value hold, napi_value attr); +NativeRdb::DataAbilityPredicates BuildQureyGroupsPredicates(napi_env env, napi_value hold); +NativeRdb::DataAbilityPredicates BuildQureyKeyPredicates(napi_env env, int id, napi_value hold); +NativeRdb::DataAbilityPredicates BuildQueryMyCardPredicates(napi_env env, napi_value attr); +NativeRdb::DataAbilityPredicates BuildIsLocalContactPredicates(napi_env env, napi_value id); +NativeRdb::DataAbilityPredicates BuildIsMyCardPredicates(napi_env env, napi_value id); +NativeRdb::DataAbilityPredicates BuildDeleteContactDataPredicates(napi_env env, int rawId, napi_value attr); +NativeRdb::DataAbilityPredicates BuildDeleteContactPredicates(napi_env env, napi_callback_info info); +void ObjectInit(napi_env env, napi_value object, napi_value &hold, napi_value &attr, napi_value &contacts); +void ObjectInitId(napi_env env, napi_value object, napi_value &id); +void ObjectInitString(napi_env env, napi_value object, napi_value &key); +int GetType(napi_env env, napi_value value); +} // namespace ContactsApi +} // namespace OHOS + +#endif // CONTACT_API_H diff --git a/contacts/include/contacts_build.h b/contacts/include/contacts_build.h new file mode 100644 index 0000000..b6c3e14 --- /dev/null +++ b/contacts/include/contacts_build.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_BUILD_H +#define CONTACT_BUILD_H + +#include "ability.h" +#include "ability_context.h" +#include "context.h" +#include "data_ability_helper.h" +#include "data_ability_predicates.h" +#include "napi/native_common.h" +#include "napi/native_node_api.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" + +#include "contacts_napi_common.h" +#include "contacts_napi_object.h" +#include "hilog_wrapper_api.h" + +namespace OHOS { +namespace ContactsApi { +class ContactsBuild { +public: + ContactsBuild(); + ~ContactsBuild(); + void GetContactDataByObject(napi_env env, napi_value object, Contacts &contacts); + int GetInt(napi_env env, napi_value id); + void GetContactData(napi_env env, napi_callback_info info, std::vector &valueContact, + std::vector &valueContactData); + std::string NapiGetValueString(napi_env env, napi_value value); + ContactAttributes GetContactAttributes(napi_env env, napi_value object); + Holder GetHolder(napi_env env, napi_value object); + void BuildValueContactDataByType( + Contacts &contacts, int typeId, std::vector &valueContactData); + +private: + void TypeSwitchSplit(int typeId, Contacts &contacts, std::vector &valueContactData); + napi_value GetArrayByKey(napi_env env, napi_value valueObject, std::string key); + napi_value GetObjectByKey(napi_env env, napi_value object, std::string key); + std::string GetStringValueByKey(napi_env env, napi_value valueObject, std::string key); + int GetIntValueByKey(napi_env env, napi_value valueObject, std::string key); + Name GetName(napi_env env, napi_value object); + Portrait GetUri(napi_env env, napi_value object); + std::vector GetEmails(napi_env env, napi_value object); + std::vector GetEvent(napi_env env, napi_value object); + std::vector GetGroup(napi_env env, napi_value object); + std::vector GetImAddress(napi_env env, napi_value object); + std::vector GetPhoneNumbers(napi_env env, napi_value object); + std::vector GetPostalAddress(napi_env env, napi_value object); + std::vector GetRelation(napi_env env, napi_value object); + std::vector GetSipAddress(napi_env env, napi_value object); + std::vector GetWebsite(napi_env env, napi_value object); + NickName GetNickName(napi_env env, napi_value object); + Note GetNote(napi_env env, napi_value object); + Organization GetOrganization(napi_env env, napi_value object); + // structure parameter and ValuesBucket + void BuildValueContact(Contacts &contacts, std::vector &valueContact); + void BuildValueContactData(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketEmail(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketEvent(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketGroup(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketImAddress(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketPortrait(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketPhoneNumber(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketPostalAddress(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketRelation(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketSipAddress(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketWebsite(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketName(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketNickName(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketNote(Contacts &contacts, std::vector &valueContactData); + void GetValuesBucketOrganization(Contacts &contacts, std::vector &valueContactData); +}; +} // namespace ContactsApi +} // namespace OHOS +#endif // CONTACT_BUILD_H diff --git a/contacts/include/contacts_control.h b/contacts/include/contacts_control.h new file mode 100644 index 0000000..4b5ca8e --- /dev/null +++ b/contacts/include/contacts_control.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_CONTROL_H +#define CONTACT_CONTROL_H + +#include "ability.h" +#include "ability_context.h" +#include "context.h" +#include "data_ability_helper.h" +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" + +#include "contacts_napi_object.h" + +namespace OHOS { +namespace ContactsApi { +class ContactsControl { +public: + ContactsControl(); + ~ContactsControl(); + int64_t RawContactInsert(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket rawContactValues); + int ContactDataInsert(std::shared_ptr dataAbilityHelper, + std::vector contactsDataValues); + int RawContactUpdate(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDataUpdate(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDelete(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDataDelete(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr ContactQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr ContactDataQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr GroupsQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr MyCardQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr HolderQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates); +}; +} // namespace ContactsApi +} // namespace OHOS +#endif // CONTACT_CONTROL_H \ No newline at end of file diff --git a/contacts/include/contacts_napi_common.h b/contacts/include/contacts_napi_common.h new file mode 100644 index 0000000..539f27e --- /dev/null +++ b/contacts/include/contacts_napi_common.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_NAPI_COMMON_H +#define CONTACT_NAPI_COMMON_H + +#include "data_ability_predicates.h" +#include "data_ability_helper.h" +#include "napi/native_common.h" +#include "napi/native_node_api.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" + +namespace OHOS { +namespace ContactsApi { +constexpr int MAX_PARAMS = 6; +constexpr int ERROR = -1; + +constexpr int NAPI_GET_STRING_SIZE = 256; +constexpr int REQUEST_PARAMS_COUNT_ONE = 1; + +// NAPI type +constexpr int TYPE_NAPI_ERROR = -1; +constexpr int TYPE_NAPI_NUMBER = 0; +constexpr int TYPE_NAPI_STRING = 1; +constexpr int TYPE_HOLDER = 2; +constexpr int TYPE_ATTR = 3; +constexpr int TYPE_CONTACT = 4; + +// Execute action code +constexpr int ADD_CONTACT = 1001; +constexpr int DELETE_CONTACT = 2001; +constexpr int UPDATE_CONTACT = 3001; + +constexpr int QUERY_CONTACTS = 4001; +constexpr int QUERY_CONTACT = 4008; + +constexpr int QUERY_CONTACTS_BY_EMAIL = 4002; +constexpr int QUERY_CONTACTS_BY_PHONE_NUMBER = 4003; +constexpr int QUERY_GROUPS = 4004; +constexpr int QUERY_HOLDERS = 4005; +constexpr int QUERY_KEY = 4006; +constexpr int QUERY_MY_CARD = 4007; +constexpr int IS_LOCAL_CONTACT = 5008; +constexpr int IS_MY_CARD = 5009; + +// contactsData type +constexpr int EMAIL = 1; +constexpr int IM = 2; +constexpr int NICKNAME = 3; +constexpr int ORGANIZATION = 4; +constexpr int PHONE = 5; +constexpr int NAME = 6; +constexpr int POSTAL_ADDRESS = 7; +constexpr int PHOTO = 8; +constexpr int GROUP_MEMBERSHIP = 9; +constexpr int NOTE = 10; +constexpr int CONTACT_EVENT = 11; +constexpr int WEBSITE = 12; +constexpr int RELATION = 13; +constexpr int CONTACT_MISC = 14; +constexpr int HICALL_DEVICE = 15; +constexpr int CAMCARD = 16; +constexpr int SIP_ADDRESS = 17; + +struct ExecuteHelper { + ExecuteHelper() + : work(nullptr), deferred(nullptr), dataValue(nullptr), sync(1), argc(0), actionCode(-1), callBack(nullptr), + info(nullptr), childActionCode(0) {}; + napi_async_work work; + napi_deferred deferred; + napi_value dataValue; + int sync; + int argc; + int actionCode; + napi_ref callBack; + napi_callback_info info; + int childActionCode; + napi_value promise; + // query + std::vector columns; + // condition + NativeRdb::DataAbilityPredicates predicates; + // update + std::vector valueUpdateContact; + // insert + std::vector valueContact; + // insertContactData + std::vector valueContactData; + // dataAbilityHelper + std::shared_ptr dataAbilityHelper; +}; +} // namespace ContactsApi +} // namespace OHOS +#endif // CONTACT_NAPI_COMMON_H \ No newline at end of file diff --git a/contacts/include/contacts_napi_object.h b/contacts/include/contacts_napi_object.h new file mode 100644 index 0000000..f3ba0d5 --- /dev/null +++ b/contacts/include/contacts_napi_object.h @@ -0,0 +1,854 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_NAPI_OBJECT_H +#define CONTACT_NAPI_OBJECT_H + +#include + +namespace OHOS { +namespace ContactsApi { +enum class Attribute { + /** + * Indicates the contact event. + */ + ATTR_CONTACT_EVENT, + + /** + * Indicates the email address. + */ + ATTR_EMAIL, + + /** + * Indicates the contact group. + */ + ATTR_GROUP_MEMBERSHIP, + + /** + * Indicates the instant messaging (IM) address. + */ + ATTR_IM, + + /** + * Indicates the name. + */ + ATTR_NAME, + + /** + * Indicates the nickname. + */ + ATTR_NICKNAME, + + /** + * Indicates the note. + */ + ATTR_NOTE, + + /** + * Indicates the organization. + */ + ATTR_ORGANIZATION, + + /** + * Indicates the phone number. + */ + ATTR_PHONE, + + /** + * Indicates the portrait. + */ + ATTR_PORTRAIT, + + /** + * Indicates the postal address. + */ + ATTR_POSTAL_ADDRESS, + + /** + * Indicates the relation. + */ + ATTR_RELATION, + + /** + * Indicates the Session Initiation Protocol (SIP) address. + */ + ATTR_SIP_ADDRESS, + + /** + * Indicates the website. + */ + ATTR_WEBSITE +}; + +/** + * Provides methods for contact attributes information + */ +class ContactAttributes { +public: + /** + * Indicates the contact attributes. + */ + std::vector attributes; +}; + +/** + * Provides methods for email information + */ +class Email { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates a home email. + */ + int EMAIL_HOME = 1; + + /** + * Indicates a work email. + */ + int EMAIL_WORK = 2; + + /** + * Indicates an email of the OTHER type. + */ + int EMAIL_OTHER = 3; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the email address. + */ + std::string email; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the displayed email name. + */ + std::string displayName; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +/** + * Provides methods for event information + */ +class Event { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates an anniversary event. + */ + int EVENT_ANNIVERSARY = 1; + + /** + * Indicates an event of the OTHER type. + */ + int EVENT_OTHER = 2; + + /** + * Indicates an birthday event. + */ + int EVENT_BIRTHDAY = 3; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the event date. + */ + std::string eventDate; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +/** + * Provides methods for group information + */ +class Group { +public: + /** + * Indicates the contact group ID. + */ + int groupId = -1; + + /** + * Indicates the contact group title. + */ + std::string title; +}; + +/** + * Provides methods for holder information + */ +class Holder { +public: + /** + * Indicates the bundle name of a contact holder. + */ + std::string bundleName; + + /** + * Indicates the displayed name of a contact holder. + */ + std::string displayName; + + /** + * Indicates the holder ID. + */ + int holderId = -1; +}; + +/** + * Provides methods for ImAddress information + */ +class ImAddress { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = -1; + + /** + * Indicates an AIM instant message. + */ + int IM_AIM = 0; + + /** + * Indicates a Windows Live instant message. + */ + int IM_MSN = 1; + + /** + * Indicates a Yahoo instant message. + */ + int IM_YAHOO = 2; + + /** + * Indicates a Skype instant message. + */ + int IM_SKYPE = 3; + + /** + * Indicates a QQ instant message. + */ + int IM_QQ = 4; + + /** + * Indicates an ICQ instant message. + */ + int IM_ICQ = 6; + + /** + * Indicates a Jabber instant message. + */ + int IM_JABBER = 7; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -2; + + /** + * Indicates the IM address. + */ + std::string imAddress; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; +/** + * Provides methods for name information + */ +class Name { +public: + /** + * Indicates the family name of the contact. + */ + std::string familyName; + + /** + * Indicates the phonetic family name of the contact. + */ + std::string familyNamePhonetic; + + /** + * Indicates the full name of the contact. + */ + std::string fullName; + + /** + * Indicates the given name of the contact. + */ + std::string givenName; + + /** + * Indicates the phonetic given name of the contact. + */ + std::string givenNamePhonetic; + + /** + * Indicates the middle name of the contact. + */ + std::string middleName; + + /** + * Indicates the phonetic middle name of the contact. + */ + std::string middleNamePhonetic; + + /** + * Indicates the prefix of the contact name. + */ + std::string namePrefix; + + /** + * Indicates the suffix of this contact name. + */ + std::string nameSuffix; +}; +/** + * Provides methods for nick name information + */ +class NickName { +public: + /** + * Indicates the nickname of the contact. + */ + std::string nickName; +}; + +/** + * Provides methods for note information + */ +class Note { +public: + /** + * Indicates the note content. + */ + std::string noteContent; +}; +/** + * Provides methods for organization information + */ +class Organization { +public: + /** + * Indicates the name of the organization to which the contact belongs. + */ + std::string name; + + /** + * Indicates the title of the contact. + */ + std::string title; +}; +/** + * Provides methods for phone number information + */ +class PhoneNumber { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates a home number. + */ + int NUM_HOME = 1; + + /** + * Indicates a mobile phone number. + */ + int NUM_MOBILE = 2; + + /** + * Indicates a work number. + */ + int NUM_WORK = 3; + + /** + * Indicates a work fax number. + */ + int NUM_FAX_WORK = 4; + + /** + * Indicates a home fax number. + */ + int NUM_FAX_HOME = 5; + + /** + * Indicates a pager number. + */ + int NUM_PAGER = 6; + + /** + * Indicates a number of the OTHER type. + */ + int NUM_OTHER = 7; + + /** + * Indicates a callback number. + */ + int NUM_CALLBACK = 8; + + /** + * Indicates a car number. + */ + int NUM_CAR = 9; + + /** + * Indicates a company director number. + */ + int NUM_COMPANY_MAIN = 10; + + /** + * Indicates an Integrated Services Digital Network (ISDN) number. + */ + int NUM_ISDN = 11; + + /** + * Indicates a main number. + */ + int NUM_MAIN = 12; + + /** + * Indicates a number of the OTHER_FAX type. + */ + int NUM_OTHER_FAX = 13; + + /** + * Indicates a radio number. + */ + int NUM_RADIO = 14; + + /** + * Indicates a telex number. + */ + int NUM_TELEX = 15; + + /** + * Indicates a teletypewriter (TTY) or test-driven development (TDD) number. + */ + int NUM_TTY_TDD = 16; + + /** + * Indicates a work mobile phone number. + */ + int NUM_WORK_MOBILE = 17; + + /** + * Indicates a work pager number. + */ + int NUM_WORK_PAGER = 18; + + /** + * Indicates an assistant number. + */ + int NUM_ASSISTANT = 19; + + /** + * Indicates an MMS number. + */ + int NUM_MMS = 20; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the phone number of the contact. + */ + std::string phoneNumber; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +/** + * Provides methods for portrait information + */ +class Portrait { +public: + /** + * Indicates the uri of the contact portrait. + */ + std::string uri; +}; +/** + * Provides methods for postal address information + */ +class PostalAddress { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates a home address. + */ + int ADDR_HOME = 1; + + /** + * Indicates a work address. + */ + int ADDR_WORK = 2; + + /** + * Indicates an address of the OTHER type. + */ + int ADDR_OTHER = 3; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the city where this contact is located. + */ + std::string city; + + /** + * Indicates the country/region where this contact is located. + */ + std::string country; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the neighborhood where this contact is located. + */ + std::string neighborhood; + + /** + * Indicates the post box of this contact. + */ + std::string pobox; + + /** + * Indicates the postal address of this contact. + */ + std::string postalAddress; + + /** + * Indicates the postal code of this contact. + */ + std::string postcode; + + /** + * Indicates the area where this contact is located. + */ + std::string region; + + /** + * Indicates the street where this contact is located. + */ + std::string street; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +class Relation { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates an assistant. + */ + int RELATION_ASSISTANT = 1; + + /** + * Indicates a brother. + */ + int RELATION_BROTHER = 2; + + /** + * Indicates a child. + */ + int RELATION_CHILD = 3; + + /** + * Indicates a domestic partner. + */ + int RELATION_DOMESTIC_PARTNER = 4; + + /** + * Indicates a father. + */ + int RELATION_FATHER = 5; + + /** + * Indicates a friend. + */ + int RELATION_FRIEND = 6; + + /** + * Indicates a manager. + */ + int RELATION_MANAGER = 7; + + /** + * Indicates a mother. + */ + int RELATION_MOTHER = 8; + + /** + * Indicates a parent. + */ + int RELATION_PARENT = 9; + + /** + * Indicates a partner. + */ + int RELATION_PARTNER = 10; + + /** + * Indicates a referrer. + */ + int RELATION_REFERRED_BY = 11; + + /** + * Indicates a relative. + */ + int RELATION_RELATIVE = 12; + + /** + * Indicates a sister. + */ + int RELATION_SISTER = 13; + + /** + * Indicates a spouse. + */ + int RELATION_SPOUSE = 14; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the relation name. + */ + std::string relationName; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +class SipAddress { +public: + /** + * Indicates a custom label. + */ + int CUSTOM_LABEL = 0; + + /** + * Indicates a home SIP address. + */ + int SIP_HOME = 1; + + /** + * Indicates a work SIP address. + */ + int SIP_WORK = 2; + + /** + * Indicates an SIP address of the OTHER type. + */ + int SIP_OTHER = 3; + + /** + * Indicates an invalid label ID. + */ + int INVALID_LABEL_ID = -1; + + /** + * Indicates the label name of an attribute. + */ + std::string labelName; + + /** + * Indicates the SIP address. + */ + std::string sipAddress; + + /** + * Indicates the label id. + */ + int labelId = -1; +}; + +class Website { +public: + std::string website; +}; + +/** + * Provides methods for contact information + */ +class Contacts { +public: + /** + * Indicates the contact ID. + */ + static int INVALID_CONTACT_ID; + + /** + * Indicates the contact ID. + */ + int id; + + /** + * Indicates the query key that identifies the contact. + */ + std::string key; + + /** + * Indicates the contact attributes. + */ + ContactAttributes contactAttributes; + + /** + * Indicates an email address of the contact. + */ + std::vector emails; + + /** + * Indicates an event (special date) of the contact. + */ + std::vector events; + + /** + * Indicates a group of the contact. + */ + std::vector groups; + + /** + * Indicates an IM address of the contact. + */ + std::vector imAddresses; + + /** + * Indicates a phone number of the contact. + */ + std::vector phoneNumbers; + + /** + * Indicates the contact portrait. + */ + Portrait portrait; + + /** + * Indicates a postal address of the contact. + */ + std::vector postalAddresses; + + /** + * Indicates a relation of the contact. + */ + std::vector relations; + + /** + * Indicates a Session Initiation Protocol (SIP) address of the contact. + */ + std::vector sipAddresses; + + /** + * Indicates a website of the contact. + */ + std::vector websites; + + /** + * Indicates the contact name. + */ + Name name; + + /** + * Indicates the contact nickname. + */ + NickName nickName; + /** + * Indicates the contact note. + */ + Note note; + /** + * Indicates organization information about the contact. + */ + Organization organization; +}; +} // namespace ContactsApi +} // namespace OHOS +#endif // CONTACT_NAPI_OBJECT_H \ No newline at end of file diff --git a/contacts/include/hilog_wrapper_api.h b/contacts/include/hilog_wrapper_api.h new file mode 100644 index 0000000..9732dd1 --- /dev/null +++ b/contacts/include/hilog_wrapper_api.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2021 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. + */ + +#ifndef HILOG_WRAPPER_API_H +#define HILOG_WRAPPER_API_H + +#define CONFIG_HILOG +#ifdef CONFIG_HILOG + +#include "hilog/log.h" + +#ifdef HILOG_FATAL +#undef HILOG_FATAL +#endif + +#ifdef HILOG_ERROR +#undef HILOG_ERROR +#endif + +#ifdef HILOG_WARN +#undef HILOG_WARN +#endif + +#ifdef HILOG_INFO +#undef HILOG_INFO +#endif + +#ifdef HILOG_DEBUG +#undef HILOG_DEBUG +#endif + +static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = {LOG_CORE, 0, "ContactsApi===>"}; + +#define HILOG_FATAL(...) (void)OHOS::HiviewDFX::HiLog::Fatal(LOG_LABEL, __VA_ARGS__) +#define HILOG_ERROR(...) (void)OHOS::HiviewDFX::HiLog::Error(LOG_LABEL, __VA_ARGS__) +#define HILOG_WARN(...) (void)OHOS::HiviewDFX::HiLog::Warn(LOG_LABEL, __VA_ARGS__) +#define HILOG_INFO(...) (void)OHOS::HiviewDFX::HiLog::Info(LOG_LABEL, __VA_ARGS__) +#define HILOG_DEBUG(...) (void)OHOS::HiviewDFX::HiLog::Debug(LOG_LABEL, __VA_ARGS__) +#else + +#define HILOG_FATAL(...) +#define HILOG_ERROR(...) +#define HILOG_WARN(...) +#define HILOG_INFO(...) +#define HILOG_DEBUG(...) + +#endif // CONFIG_HILOG + +#endif // HILOG_WRAPPER_API_H \ No newline at end of file diff --git a/contacts/include/result_convert.h b/contacts/include/result_convert.h new file mode 100644 index 0000000..b5affee --- /dev/null +++ b/contacts/include/result_convert.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef RESULT_CONVERT_H +#define RESULT_CONVERT_H + +#include +#include + +#include "contacts_napi_common.h" +#include "napi/native_common.h" +#include "napi/native_node_api.h" +#include "result_set.h" + +namespace OHOS { +namespace ContactsApi { +class ResultConvert { +public: + ResultConvert(); + ~ResultConvert(); + napi_value GetNapiValue(napi_env env, const std::string keyChar, napi_value object); + napi_value GetNapiElementArray(napi_env env, napi_value object, const std::string keyChar); + napi_value GetNapiElementObject(napi_env env, napi_value object, const std::string keyChar); + napi_value GetResultValue( + napi_env env, std::string &contentKey, std::shared_ptr &resultSet); + napi_value ResultSetToHolder(napi_env env, std::shared_ptr &resultSet); + napi_value ResultSetToGroup(napi_env env, std::shared_ptr &resultSet); + napi_value ResultSetToObject(napi_env env, std::shared_ptr &resultSet); + napi_value ConvertContactArray( + napi_env env, std::map &resultSetMap, std::map &quickSearchMap); + void PutQuickSearchKey(napi_env env, std::shared_ptr &resultSet, + std::map &quickSearchMap, int contactsIdValue); + void ConvertContactObject( + napi_env env, napi_value napiObject, std::shared_ptr &resultSet); + napi_value GetResultMapValue(napi_env env, std::map &resultSetMap, int &contactsId); + void ConvertEmail(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertName(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertUri(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertEvent(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertGroup(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertImAddress(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertPhoneNumber(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertPostalAddress(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertRelation(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertSipAddress(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertWebsite(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertNickName(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertNote(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + void ConvertOrganization(napi_env env, napi_value napiObject, int &typeId, + std::shared_ptr &resultSet); + napi_value CreateNapiStringValue(napi_env env, const std::string key); + bool IsEmpty(std::shared_ptr &resultSet); +}; +} // namespace ContactsApi +} // namespace OHOS +#endif // RESULT_CONVERT_H diff --git a/contacts/src/contacts_api.cpp b/contacts/src/contacts_api.cpp new file mode 100644 index 0000000..5b88b5f --- /dev/null +++ b/contacts/src/contacts_api.cpp @@ -0,0 +1,1190 @@ +/* + * Copyright (c) 2021 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 "contacts_api.h" + +#include + +#include "ability.h" +#include "ability_context.h" +#include "context.h" +#include "data_ability_helper.h" +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" +#include "securec.h" + +#include "contacts_control.h" +#include "contacts_napi_common.h" +#include "hilog_wrapper_api.h" +#include "result_convert.h" + +namespace OHOS { +namespace ContactsApi { +namespace { +std::mutex g_mutex; +} +/** + * @brief Initialize NAPI object + * + * @param env Conditions for initialize operation + * @param object Conditions for initialize operation + * @param hold Attribute of object + * @param attr Attribute of object + * @param contact Attribute of object + */ +void ObjectInit(napi_env env, napi_value object, napi_value &hold, napi_value &attr, napi_value &contact) +{ + int type = GetType(env, object); + switch (type) { + case TYPE_HOLDER: + hold = object; + break; + case TYPE_ATTR: + attr = object; + break; + case TYPE_CONTACT: + contact = object; + break; + default: + HILOG_ERROR("ObjectInit type is error"); + break; + } +} + +/** + * @brief Initialize NAPI number object + * + * @param env Conditions for initialize operation + * @param object Conditions for initialize operation + * @param id Number object + */ +void ObjectInitId(napi_env env, napi_value object, napi_value &id) +{ + int type = GetType(env, object); + switch (type) { + case TYPE_NAPI_NUMBER: + id = object; + break; + default: + HILOG_ERROR("ObjectInitId type is error"); + break; + } +} + +/** + * @brief Initialize NAPI string object + * + * @param env Conditions for initialize operation + * @param object Conditions for initialize operation + * @param key String object + */ +void ObjectInitString(napi_env env, napi_value object, napi_value &key) +{ + int type = GetType(env, object); + switch (type) { + case TYPE_NAPI_STRING: + key = object; + break; + default: + HILOG_ERROR("ObjectInitString type is error"); + break; + } +} + +/** + * @brief Get NAPI object type + * + * @param env Conditions for get type operation + * @param value Conditions for get type operation + * + * @return The result returned by get type operation + */ +int GetType(napi_env env, napi_value value) +{ + napi_valuetype valueType; + napi_typeof(env, value, &valueType); + bool result = false; + switch (valueType) { + case napi_number: + return TYPE_NAPI_NUMBER; + break; + case napi_string: + return TYPE_NAPI_STRING; + break; + case napi_object: + napi_value key; + napi_create_string_utf8(env, "bundleName", NAPI_AUTO_LENGTH, &key); + napi_has_property(env, value, key, &result); + if (result) { + return TYPE_HOLDER; + } + napi_create_string_utf8(env, "attributes", NAPI_AUTO_LENGTH, &key); + napi_has_property(env, value, key, &result); + if (result) { + return TYPE_ATTR; + } + napi_create_string_utf8(env, "id", NAPI_AUTO_LENGTH, &key); + napi_has_property(env, value, key, &result); + if (result) { + return TYPE_CONTACT; + } + return TYPE_NAPI_ERROR; + break; + default: + return TYPE_NAPI_ERROR; + break; + } +} + +std::shared_ptr dataAbilityHelper_ = nullptr; +napi_env env_ = nullptr; +/** + * @brief Get dataAbilityHelper + * + * @param env Conditions for get dataAbilityHelper operation + * + * @return The result returned by get dataAbilityHelper + */ +std::shared_ptr GetDataAbilityHelper(napi_env env) +{ + napi_value global = nullptr; + NAPI_CALL(env, napi_get_global(env, &global)); + napi_value abilityObj = nullptr; + NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj)); + if (abilityObj == nullptr) { + HILOG_ERROR("abilityObj is nullptr!"); + } + OHOS::AppExecFwk::Ability *ability = nullptr; + NAPI_CALL(env, napi_get_value_external(env, abilityObj, (void **)&ability)); + if (ability == nullptr) { + HILOG_ERROR("ability is nullptr!"); + } + std::shared_ptr uriPtr = std::make_shared("dataability:///com.ohos.contactsdataability"); + if (dataAbilityHelper_ == nullptr) { + HILOG_ERROR("dataAbilityHelper_ is not nullptr!"); + env_ = env; + dataAbilityHelper_ = OHOS::AppExecFwk::DataAbilityHelper::Creator(ability->GetContext(), uriPtr); + } + if (env_ == env) { + HILOG_ERROR("env_ is == !"); + } + return dataAbilityHelper_; +} + +/** + * @brief Establish predicates condition by holder object + * + * @param holder Conditions for establish predicates operation + * @param predicates Conditions for establish predicates operation + */ +void HolderPredicates(Holder &holder, NativeRdb::DataAbilityPredicates &predicates) +{ + if (!holder.bundleName.empty()) { + predicates.And(); + predicates.EqualTo("account_type", holder.bundleName); + } + if (!holder.displayName.empty()) { + predicates.And(); + predicates.EqualTo("account_name", holder.displayName); + } + if (holder.holderId > 0) { + predicates.And(); + predicates.EqualTo("account_id", std::to_string(holder.holderId)); + } +} + +/** + * @brief Establish predicates condition by attributes object + * + * @param attrs Conditions for establish predicates operation + * @param predicates Conditions for establish predicates operation + */ +void AttributesPredicates(ContactAttributes &attrs, NativeRdb::DataAbilityPredicates &predicates) +{ + int size = attrs.attributes.size(); + if (size > 0) { + predicates.And(); + predicates.BeginWrap(); + } + for (int i = 0; i < size; ++i) { + predicates.EqualTo("type_id", std::to_string(attrs.attributes[i])); + if (i != size - 1) { + predicates.Or(); + } + } + if (size > 0) { + predicates.EndWrap(); + } +} + +/** + * @brief Resolve object interface in DELETE_CONTACT case + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildDeleteContactPredicates(napi_env env, napi_callback_info info) +{ + NativeRdb::DataAbilityPredicates predicates; + napi_value argv[MAX_PARAMS]; + size_t argc = MAX_PARAMS; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + ContactsBuild contactsBuild; + if (argc < 0) { + HILOG_ERROR("BuildDeleteContactPredicates napi_callback_info is nullptr"); + return predicates; + } + std::string keyValue = contactsBuild.NapiGetValueString(env, argv[0]); + if (!keyValue.empty()) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("quick_search_key", keyValue); + } + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_CONTACT case + * + * @param env Conditions for resolve object interface operation + * @param key Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + * @param attr Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyContactPredicates( + napi_env env, napi_value key, napi_value hold, napi_value attr) +{ + ContactsBuild contactsBuild; + std::string keyValue = contactsBuild.NapiGetValueString(env, key); + Holder holder = contactsBuild.GetHolder(env, hold); + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + if (!keyValue.empty()) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("quick_search_key", keyValue); + HolderPredicates(holder, predicates); + AttributesPredicates(attrs, predicates); + } + return predicates; +} + +void HoldersStructure(std::map &holders, Holder &holder) +{ + if (!holder.bundleName.empty()) { + holders["account_type"] = holder.bundleName; + } + if (!holder.displayName.empty()) { + holders["account_name"] = holder.displayName; + } + if (holder.holderId > 0) { + holders["account_id"] = std::to_string(holder.holderId); + } +} + +/** + * @brief Resolve object interface in QUERY_CONTACTS case + * + * @param env Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + * @param attr Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyContactsPredicates(napi_env env, napi_value hold, napi_value attr) +{ + ContactsBuild contactsBuild; + Holder holder = contactsBuild.GetHolder(env, hold); + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + std::map holders; + HoldersStructure(holders, holder); + int size = attrs.attributes.size(); + int mapSize = holders.size(); + std::map::iterator it; + for (it = holders.begin(); it != holders.end(); ++it) { + predicates.EqualTo(it->first, it->second); + if (it != holders.end()--) { + predicates.And(); + } + } + if (mapSize > 0) { + predicates.And(); + } + if (size > 0) { + predicates.BeginWrap(); + } + for (int i = 0; i < size; ++i) { + predicates.EqualTo("type_id", std::to_string(attrs.attributes[i])); + if (i != size - 1) { + predicates.Or(); + } + } + if (size > 0) { + predicates.EndWrap(); + } + if (size > 0 || mapSize > 0) { + predicates.And(); + } + predicates.EqualTo("is_deleted", "0"); + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_CONTACTS_BY_EMAIL case + * + * @param env Conditions for resolve object interface operation + * @param emailobject Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + * @param attr Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyContactsByEmailPredicates( + napi_env env, napi_value emailobject, napi_value hold, napi_value attr) +{ + ContactsBuild contactsBuild; + std::string email = contactsBuild.NapiGetValueString(env, emailobject); + Holder holder = contactsBuild.GetHolder(env, hold); + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + if (!email.empty() || email != "") { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("detail_info", email); + predicates.And(); + predicates.EqualTo("content_type", "email"); + HolderPredicates(holder, predicates); + AttributesPredicates(attrs, predicates); + } + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_CONTACTS_BY_PHONE_NUMBER case + * + * @param env Conditions for resolve object interface operation + * @param number Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + * @param attr Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyContactsByPhoneNumberPredicates( + napi_env env, napi_value number, napi_value hold, napi_value attr) +{ + ContactsBuild contactsBuild; + std::string phoneNumber = contactsBuild.NapiGetValueString(env, number); + Holder holder = contactsBuild.GetHolder(env, hold); + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + if (!phoneNumber.empty() || phoneNumber != "") { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("detail_info", phoneNumber); + predicates.And(); + predicates.EqualTo("content_type", "phone"); + HolderPredicates(holder, predicates); + AttributesPredicates(attrs, predicates); + } + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_GROUPS case + * + * @param env Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyGroupsPredicates(napi_env env, napi_value hold) +{ + ContactsBuild contactsBuild; + Holder holder = contactsBuild.GetHolder(env, hold); + NativeRdb::DataAbilityPredicates predicates; + std::map holders; + HoldersStructure(holders, holder); + predicates.EqualTo("is_deleted", "0"); + int size = holders.size(); + if (size > 0) { + predicates.And(); + } + std::map::iterator it; + for (it = holders.begin(); it != holders.end(); ++it) { + predicates.EqualTo(it->first, it->second); + if (it != holders.end()--) { + predicates.And(); + } + } + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_KEY case + * + * @param env Conditions for resolve object interface operation + * @param id Conditions for resolve object interface operation + * @param hold Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQureyKeyPredicates(napi_env env, napi_value id, napi_value hold) +{ + ContactsBuild contactsBuild; + int value = contactsBuild.GetInt(env, id); + Holder holder = contactsBuild.GetHolder(env, hold); + NativeRdb::DataAbilityPredicates predicates; + if (value != 0) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("contact_id", std::to_string(value)); + HolderPredicates(holder, predicates); + } + return predicates; +} + +/** + * @brief Resolve object interface in QUERY_MY_CARD case + * + * @param env Conditions for resolve object interface operation + * @param attr Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildQueryMyCardPredicates(napi_env env, napi_value attr) +{ + ContactsBuild contactsBuild; + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + int size = attrs.attributes.size(); + predicates.EqualTo("is_deleted", "0"); + if (size > 0) { + predicates.And(); + } + for (int i = 0; i < size; ++i) { + predicates.EqualTo("type_id", std::to_string(attrs.attributes[i])); + if (i != size - 1) { + predicates.Or(); + } + } + return predicates; +} + +NativeRdb::DataAbilityPredicates BuildQuerytContactData(napi_env env, napi_value &contactObject, napi_value &attrObject, + std::vector &valueContactData) +{ + ContactsBuild contactsBuild; + Contacts contact; + contactsBuild.GetContactDataByObject(env, contactObject, contact); + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attrObject); + NativeRdb::DataAbilityPredicates predicates; + std::vector fields; + fields.push_back("raw_contact_id"); + if (contact.id != 0) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("contact_id", std::to_string(contact.id)); + predicates.GroupBy(fields); + } + int size = attrs.attributes.size(); + for (int i = 0; i < size; i++) { + contactsBuild.BuildValueContactDataByType(contact, attrs.attributes[i], valueContactData); + } + return predicates; +} + +std::vector BuildUpdateContactColumns() +{ + std::vector columns; + columns.push_back("raw_contact_id"); + return columns; +} + +int GetRawIdByResultSet(const std::shared_ptr &resultSet) +{ + if (resultSet == nullptr) { + return -1; + } + std::vector vectorQueryData; + int resultSetNum = resultSet->GoToFirstRow(); + int intValue = 0; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + resultSet->GetInt(0, intValue); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return intValue; +} + +void BuildUpdateContactConvertParams(napi_env env, napi_value &contact, napi_value &attr, ExecuteHelper *executeHelper) +{ + executeHelper->valueContactData.clear(); + NativeRdb::DataAbilityPredicates predicates = + BuildQuerytContactData(env, contact, attr, executeHelper->valueContactData); + executeHelper->columns = BuildUpdateContactColumns(); + ContactsControl contactsControl; + std::shared_ptr resultSet = + contactsControl.ContactDataQuery(GetDataAbilityHelper(env), executeHelper->columns, predicates); + int rawId = GetRawIdByResultSet(resultSet); + std::vector value = executeHelper->valueContactData; + int size = value.size(); + for (int i = 0; i < size; ++i) { + (executeHelper->valueContactData)[i].PutInt("raw_contact_id", rawId); + } + executeHelper->predicates = BuildDeleteContactDataPredicates(env, rawId, attr); +} + +NativeRdb::DataAbilityPredicates BuildDeleteContactDataPredicates(napi_env env, int rawId, napi_value attr) +{ + ContactsBuild contactsBuild; + ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr); + NativeRdb::DataAbilityPredicates predicates; + if (rawId != 0) { + predicates.EqualTo("raw_contact_id", std::to_string(rawId)); + AttributesPredicates(attrs, predicates); + } + return predicates; +} + +/** + * @brief Resolve object interface in IS_LOCAL_CONTACT case + * + * @param env Conditions for resolve object interface operation + * @param id Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildIsLocalContactPredicates(napi_env env, napi_value id) +{ + ContactsBuild contactsBuild; + int value = contactsBuild.GetInt(env, id); + NativeRdb::DataAbilityPredicates predicates; + if (value != 0) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("contact_id", std::to_string(value)); + predicates.And(); + predicates.EqualTo("account_type", "com.ohos.contacts"); + predicates.And(); + predicates.EqualTo("account_name", "phone"); + } + return predicates; +} + +/** + * @brief Resolve object interface in IS_MY_CARD case + * + * @param env Conditions for resolve object interface operation + * @param id Conditions for resolve object interface operation + */ +NativeRdb::DataAbilityPredicates BuildIsMyCardPredicates(napi_env env, napi_value id) +{ + ContactsBuild contactsBuild; + int value = contactsBuild.GetInt(env, id); + NativeRdb::DataAbilityPredicates predicates; + if (value != 0) { + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("contact_id", std::to_string(value)); + } + return predicates; +} + +void ExecuteDone(napi_env env, napi_status status, void *data) +{ + ExecuteHelper *executeHelper = (ExecuteHelper *)data; + napi_value result = executeHelper->dataValue; + executeHelper->dataValue = nullptr; + napi_deferred deferred = executeHelper->deferred; + executeHelper->deferred = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, deferred, result)); + NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, executeHelper->work)); + delete executeHelper; + executeHelper = nullptr; +} + +void ExecuteSyncDone(napi_env env, napi_status status, void *data) +{ + if (status != napi_ok) { + HILOG_ERROR("ExecuteSyncDone status is not ok===>"); + return; + } + if (data != nullptr) { + ExecuteHelper *executeHelper = (ExecuteHelper *)data; + napi_value global; + napi_get_global(env, &global); + napi_value resultData[1]; + resultData[0] = executeHelper->dataValue; + executeHelper->dataValue = nullptr; + napi_value result; + napi_value callBack; + napi_get_reference_value(env, executeHelper->callBack, &callBack); + napi_valuetype valuetype = napi_undefined; + napi_typeof(env, callBack, &valuetype); + if (valuetype != napi_function) { + HILOG_ERROR("contactApi params not is function"); + return; + } + napi_call_function(env, global, callBack, 1, resultData, &result); + if (executeHelper->work != nullptr) { + napi_delete_async_work(env, executeHelper->work); + } + executeHelper->work = nullptr; + executeHelper->deferred = nullptr; + delete executeHelper; + } + HILOG_INFO("contactApi ExecuteSyncDone done===>"); +} + +void LocalExecuteAddContact(napi_env env, ExecuteHelper *executeHelper, napi_value &result) +{ + ContactsControl contactsControl; + int64_t rawId = + contactsControl.RawContactInsert(executeHelper->dataAbilityHelper, (executeHelper->valueContact)[0]); + std::vector value = executeHelper->valueContactData; + int size = value.size(); + for (int i = 0; i < size; ++i) { + (executeHelper->valueContactData)[i].PutInt("raw_contact_id", rawId); + } + int code = contactsControl.ContactDataInsert(executeHelper->dataAbilityHelper, executeHelper->valueContactData); + if (code == 0) { + napi_create_int64(env, rawId, &result); + } else { + napi_create_int64(env, code, &result); + } +} + +void LocalExecuteDeleteContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ContactsControl contactsControl; + int ret = contactsControl.ContactDelete(executeHelper->dataAbilityHelper, executeHelper->predicates); + HILOG_INFO("LocalExecuteDeleteContact contact ret = %{public}d", ret); + napi_create_int64(env, ret, &result); +} + +void LocalExecuteQueryContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.ContactQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + napi_value results = resultConvert.ResultSetToObject(env, resultSet); + if (results != nullptr) { + napi_get_element(env, results, 0, &result); + } +} + +void LocalExecuteQueryContactsOrKey(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.ContactQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + result = resultConvert.ResultSetToObject(env, resultSet); +} + +void LocalExecuteQueryContactsByData(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.ContactDataQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + result = resultConvert.ResultSetToObject(env, resultSet); +} + +void LocalExecuteQueryGroup(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.GroupsQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + result = resultConvert.ResultSetToGroup(env, resultSet); +} + +void LocalExecuteQueryHolders(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.HolderQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + result = resultConvert.ResultSetToHolder(env, resultSet); +} + +void LocalExecuteQueryMyCard(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ResultConvert resultConvert; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.MyCardQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + result = resultConvert.ResultSetToObject(env, resultSet); +} + +void LocalExecuteUpdateContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + ContactsControl contactsControl; + int resultCode = contactsControl.ContactDataDelete(executeHelper->dataAbilityHelper, executeHelper->predicates); + if (resultCode == 0) { + resultCode = + contactsControl.ContactDataInsert(executeHelper->dataAbilityHelper, executeHelper->valueContactData); + napi_create_int64(env, resultCode, &result); + } +} + +void LocalExecuteIsLocalContact(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + int64_t isLocal = 0; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.ContactQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + if (resultSet == nullptr) { + napi_create_int64(env, isLocal, &result); + return; + } + int resultSetNum = resultSet->GoToFirstRow(); + if (resultSetNum == OHOS::NativeRdb::E_OK) { + isLocal = 1; + } + napi_create_int64(env, isLocal, &result); + resultSet->Close(); +} + +void LocalExecuteIsMyCard(napi_env env, const ExecuteHelper *executeHelper, napi_value &result) +{ + int64_t isLocal = 0; + ContactsControl contactsControl; + std::shared_ptr resultSet = contactsControl.MyCardQuery( + executeHelper->dataAbilityHelper, executeHelper->columns, executeHelper->predicates); + if (resultSet == nullptr) { + HILOG_ERROR("LocalExecute is_my_card resultSet is nullptr===>"); + napi_create_int64(env, isLocal, &result); + return; + } + int rowCount = 0; + resultSet->GetRowCount(rowCount); + int resultSetNum = resultSet->GoToFirstRow(); + if (resultSetNum == OHOS::NativeRdb::E_OK) { + isLocal = 1; + } + napi_create_int64(env, isLocal, &result); + resultSet->Close(); +} + +napi_value LocalExecute(napi_env env, ExecuteHelper *executeHelper) +{ + napi_value result = nullptr; + switch (executeHelper->actionCode) { + case ADD_CONTACT: + LocalExecuteAddContact(env, executeHelper, result); + break; + case DELETE_CONTACT: + LocalExecuteDeleteContact(env, executeHelper, result); + break; + case QUERY_CONTACT: + LocalExecuteQueryContact(env, executeHelper, result); + break; + case QUERY_CONTACTS: + LocalExecuteQueryContactsOrKey(env, executeHelper, result); + break; + case QUERY_CONTACTS_BY_EMAIL: + case QUERY_CONTACTS_BY_PHONE_NUMBER: + LocalExecuteQueryContactsByData(env, executeHelper, result); + break; + case QUERY_GROUPS: + LocalExecuteQueryGroup(env, executeHelper, result); + break; + case QUERY_HOLDERS: + LocalExecuteQueryHolders(env, executeHelper, result); + break; + case QUERY_KEY: + LocalExecuteQueryContactsOrKey(env, executeHelper, result); + break; + case QUERY_MY_CARD: + LocalExecuteQueryMyCard(env, executeHelper, result); + break; + case UPDATE_CONTACT: + LocalExecuteUpdateContact(env, executeHelper, result); + break; + case IS_LOCAL_CONTACT: + LocalExecuteIsLocalContact(env, executeHelper, result); + break; + case IS_MY_CARD: + LocalExecuteIsMyCard(env, executeHelper, result); + break; + default: + HILOG_INFO("LocalExecute case error===>"); + break; + } + return result; +} + +void Execute(napi_env env, void *data) +{ + ExecuteHelper *executeHelper = static_cast(data); + executeHelper->dataValue = LocalExecute(env, executeHelper); +} + +napi_value CreateAsyncWork(napi_env env, ExecuteHelper *executeHelper, napi_callback_info info) +{ + napi_value workName; + napi_value result = nullptr; + if (executeHelper->sync == 0) { + napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &workName); + napi_value argv[6]; + size_t argc = 6; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + napi_valuetype valuetype = napi_undefined; + napi_typeof(env, argv[argc - 1], &valuetype); + if (valuetype == napi_function) { + HILOG_INFO("AddContact is callback function===>"); + napi_create_reference(env, argv[argc - 1], 1, &executeHelper->callBack); + } + napi_create_async_work( + env, nullptr, workName, Execute, ExecuteSyncDone, (void *)executeHelper, &(executeHelper->work)); + napi_get_null(env, &result); + } else { + napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &workName); + napi_create_promise(env, &(executeHelper->deferred), &result); + napi_create_async_work( + env, nullptr, workName, Execute, ExecuteDone, (void *)executeHelper, &(executeHelper->work)); + } + napi_queue_async_work(env, executeHelper->work); + executeHelper->promise = result; + return result; +} + +NativeRdb::DataAbilityPredicates ConvertParamsSwitchSplit( + int code, napi_env env, napi_value &key, napi_value &hold, napi_value &attr) +{ + NativeRdb::DataAbilityPredicates predicates; + switch (code) { + case QUERY_CONTACT: + predicates = BuildQureyContactPredicates(env, key, hold, attr); + break; + case QUERY_CONTACTS: + predicates = BuildQureyContactsPredicates(env, hold, attr); + break; + case QUERY_CONTACTS_BY_EMAIL: + predicates = BuildQureyContactsByEmailPredicates(env, key, hold, attr); + break; + case QUERY_CONTACTS_BY_PHONE_NUMBER: + predicates = BuildQureyContactsByPhoneNumberPredicates(env, key, hold, attr); + break; + case QUERY_GROUPS: + predicates = BuildQureyGroupsPredicates(env, hold); + break; + case QUERY_HOLDERS: + break; + break; + case QUERY_MY_CARD: + predicates = BuildQueryMyCardPredicates(env, attr); + break; + default: + HILOG_ERROR("ConvertParamsSwitchSplit code is no match"); + break; + } + return predicates; +} + +void SetChildActionCodeAndConvertParams(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper) +{ + napi_value id = nullptr; + napi_value key = nullptr; + napi_value hold = nullptr; + napi_value attr = nullptr; + napi_value contact = nullptr; + napi_value argv[MAX_PARAMS]; + size_t argc = MAX_PARAMS; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + int size = argc; + for (int i = 0; i < size; i++) { + ObjectInitId(env, argv[i], id); + ObjectInitString(env, argv[i], key); + ObjectInit(env, argv[i], hold, attr, contact); + } + ContactsBuild contactsBuild; + switch (executeHelper->actionCode) { + case ADD_CONTACT: + contactsBuild.GetContactData(env, info, executeHelper->valueContact, executeHelper->valueContactData); + break; + case DELETE_CONTACT: + executeHelper->predicates = BuildDeleteContactPredicates(env, info); + break; + case UPDATE_CONTACT: + BuildUpdateContactConvertParams(env, contact, attr, executeHelper); + break; + case IS_LOCAL_CONTACT: + executeHelper->predicates = BuildIsLocalContactPredicates(env, id); + break; + case IS_MY_CARD: + executeHelper->predicates = BuildIsMyCardPredicates(env, id); + break; + case QUERY_KEY: + executeHelper->predicates = BuildQureyKeyPredicates(env, id, hold); + break; + default: + executeHelper->predicates = ConvertParamsSwitchSplit(executeHelper->actionCode, env, key, hold, attr); + break; + } +} + +napi_value Scheduling(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper, int actionCode) +{ + napi_value argv[MAX_PARAMS]; + size_t argc = MAX_PARAMS; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + executeHelper->dataAbilityHelper = GetDataAbilityHelper(env); + executeHelper->argc = argc; + executeHelper->actionCode = actionCode; + SetChildActionCodeAndConvertParams(env, info, executeHelper); + napi_value result = CreateAsyncWork(env, executeHelper, info); + return result; +} + +int GetMethodType(napi_env env, napi_callback_info info) +{ + napi_value argv[MAX_PARAMS]; + size_t argc = MAX_PARAMS; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + napi_valuetype valuetype = napi_undefined; + napi_typeof(env, argv[argc - 1], &valuetype); + // last params is function as callback + if (valuetype == napi_function) { + HILOG_INFO("GetMethodType callback function===>"); + return 0; + } + return 1; +} + +/** + * @brief Test interface ADD_CONTACT + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value AddContact(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, ADD_CONTACT); + return result; +} + +/** + * @brief Test interface DELETE_CONTACT + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value DeleteContact(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, DELETE_CONTACT); + return result; +} + +/** + * @brief Test interface UPDATE_CONTACT + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value UpdateContact(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, UPDATE_CONTACT); + return result; +} + +/** + * @brief Test interface QUERY_CONTACT + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryContact(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_CONTACT); + return result; +} + +/** + * @brief Test interface QUERY_CONTACTS + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryContacts(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_CONTACTS); + return result; +} + +/** + * @brief Test interface QUERY_CONTACTS_BY_EMAIL + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryContactsByEmail(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_CONTACTS_BY_EMAIL); + return result; +} + +/** + * @brief Test interface QUERY_CONTACTS_BY_PHONE_NUMBER + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryContactsByPhoneNumber(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_CONTACTS_BY_PHONE_NUMBER); + return result; +} + +/** + * @brief Test interface QUERY_CONTACTS_BY_PHONE_NUMBER + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryGroups(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_GROUPS); + return result; +} + +/** + * @brief Test interface QUERY_HOLDERS + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryHolders(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_HOLDERS); + return result; +} + +/** + * @brief Test interface QUERY_KEY + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryKey(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_KEY); + return result; +} + +/** + * @brief Test interface QUERY_MY_CARD + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value QueryMyCard(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, QUERY_MY_CARD); + return result; +} + +/** + * @brief Test interface IS_MY_CARD + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value IsMyCard(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, IS_MY_CARD); + return result; +} + +/** + * @brief Test interface IS_LOCAL_CONTACT + * + * @param env Conditions for resolve object interface operation + * @param info Conditions for resolve object interface operation + * + * @return The result returned by test + */ +napi_value IsLocalContact(napi_env env, napi_callback_info info) +{ + ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper(); + executeHelper->sync = GetMethodType(env, info); + napi_value result = Scheduling(env, info, executeHelper, IS_LOCAL_CONTACT); + return result; +} + +void Init(napi_env env, napi_value exports) +{ + napi_property_descriptor exportFuncs[] = { + DECLARE_NAPI_FUNCTION("addContact", OHOS::ContactsApi::AddContact), + DECLARE_NAPI_FUNCTION("deleteContact", OHOS::ContactsApi::DeleteContact), + DECLARE_NAPI_FUNCTION("updateContact", OHOS::ContactsApi::UpdateContact), + DECLARE_NAPI_FUNCTION("queryContact", OHOS::ContactsApi::QueryContact), + DECLARE_NAPI_FUNCTION("queryContacts", OHOS::ContactsApi::QueryContacts), + DECLARE_NAPI_FUNCTION("queryContactsByEmail", OHOS::ContactsApi::QueryContactsByEmail), + DECLARE_NAPI_FUNCTION("queryContactsByPhoneNumber", OHOS::ContactsApi::QueryContactsByPhoneNumber), + DECLARE_NAPI_FUNCTION("queryGroups", OHOS::ContactsApi::QueryGroups), + DECLARE_NAPI_FUNCTION("queryHolders", OHOS::ContactsApi::QueryHolders), + DECLARE_NAPI_FUNCTION("queryKey", OHOS::ContactsApi::QueryKey), + DECLARE_NAPI_FUNCTION("queryMyCard", OHOS::ContactsApi::QueryMyCard), + DECLARE_NAPI_FUNCTION("isMyCard", OHOS::ContactsApi::IsMyCard), + DECLARE_NAPI_FUNCTION("isLocalContact", OHOS::ContactsApi::IsLocalContact), + }; + napi_define_properties(env, exports, sizeof(exportFuncs) / sizeof(*exportFuncs), exportFuncs); +} +} // namespace ContactsApi +} // namespace OHOS diff --git a/contacts/src/contacts_build.cpp b/contacts/src/contacts_build.cpp new file mode 100644 index 0000000..8be55dc --- /dev/null +++ b/contacts/src/contacts_build.cpp @@ -0,0 +1,845 @@ +/* + * Copyright (c) 2021 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 "contacts_build.h" + +#include "result_convert.h" + +namespace OHOS { +namespace ContactsApi { +ContactsBuild::ContactsBuild(void) +{ +} + +ContactsBuild::~ContactsBuild() +{ +} + +void ContactsBuild::GetContactDataByObject(napi_env env, napi_value object, Contacts &contact) +{ + contact.id = GetIntValueByKey(env, object, "id"); + contact.key = GetStringValueByKey(env, object, "key"); + contact.emails = GetEmails(env, object); + contact.events = GetEvent(env, object); + contact.groups = GetGroup(env, object); + contact.imAddresses = GetImAddress(env, object); + contact.phoneNumbers = GetPhoneNumbers(env, object); + contact.portrait = GetUri(env, object); + contact.relations = GetRelation(env, object); + contact.sipAddresses = GetSipAddress(env, object); + contact.websites = GetWebsite(env, object); + contact.name = GetName(env, object); + contact.nickName = GetNickName(env, object); + contact.note = GetNote(env, object); + contact.organization = GetOrganization(env, object); + contact.postalAddresses = GetPostalAddress(env, object); +} + +void ContactsBuild::GetContactData(napi_env env, napi_callback_info info, + std::vector &valueContact, std::vector &valueContactData) +{ + napi_value argv[MAX_PARAMS]; + size_t argc = MAX_PARAMS; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + ContactsBuild contactsBuild; + if (argc < 0) { + HILOG_ERROR("GetContactData napi_callback_info is nullptr"); + return; + } + Contacts contact; + GetContactDataByObject(env, argv[0], contact); + BuildValueContact(contact, valueContact); + BuildValueContactData(contact, valueContactData); +} + +void ContactsBuild::BuildValueContact(Contacts &contact, std::vector &valueContact) +{ + NativeRdb::ValuesBucket valuesBucketContact; + if (!contact.name.fullName.empty() || contact.name.fullName != "") { + valuesBucketContact.PutString("display_name", contact.name.fullName); + } + if (!contact.organization.name.empty() || contact.organization.name != "") { + valuesBucketContact.PutString("company", contact.organization.name); + } + if (!contact.organization.title.empty() || contact.organization.title != "") { + valuesBucketContact.PutString("position", contact.organization.title); + } + valueContact.push_back(valuesBucketContact); +} + +void ContactsBuild::BuildValueContactData(Contacts &contact, std::vector &valueContactData) +{ + GetValuesBucketEmail(contact, valueContactData); + GetValuesBucketEvent(contact, valueContactData); + GetValuesBucketGroup(contact, valueContactData); + GetValuesBucketImAddress(contact, valueContactData); + GetValuesBucketPortrait(contact, valueContactData); + GetValuesBucketPhoneNumber(contact, valueContactData); + GetValuesBucketPostalAddress(contact, valueContactData); + GetValuesBucketRelation(contact, valueContactData); + GetValuesBucketSipAddress(contact, valueContactData); + GetValuesBucketWebsite(contact, valueContactData); + GetValuesBucketName(contact, valueContactData); + GetValuesBucketNickName(contact, valueContactData); + GetValuesBucketNote(contact, valueContactData); + GetValuesBucketOrganization(contact, valueContactData); +} + +void ContactsBuild::BuildValueContactDataByType( + Contacts &contact, int typeId, std::vector &valueContactData) +{ + switch (typeId) { + case EMAIL: + GetValuesBucketEmail(contact, valueContactData); + break; + case IM: + GetValuesBucketImAddress(contact, valueContactData); + break; + case NICKNAME: + GetValuesBucketNickName(contact, valueContactData); + break; + case ORGANIZATION: + GetValuesBucketOrganization(contact, valueContactData); + break; + case PHONE: + GetValuesBucketPhoneNumber(contact, valueContactData); + break; + case NAME: + GetValuesBucketName(contact, valueContactData); + break; + case POSTAL_ADDRESS: + GetValuesBucketPostalAddress(contact, valueContactData); + break; + default: + TypeSwitchSplit(typeId, contact, valueContactData); + break; + } +} + +void ContactsBuild::TypeSwitchSplit( + int typeId, Contacts &contact, std::vector &valueContactData) +{ + switch (typeId) { + case PHOTO: + GetValuesBucketPortrait(contact, valueContactData); + break; + case GROUP_MEMBERSHIP: + GetValuesBucketGroup(contact, valueContactData); + break; + case NOTE: + GetValuesBucketNote(contact, valueContactData); + break; + case CONTACT_EVENT: + GetValuesBucketEvent(contact, valueContactData); + break; + case WEBSITE: + GetValuesBucketWebsite(contact, valueContactData); + break; + case RELATION: + GetValuesBucketRelation(contact, valueContactData); + break; + case CONTACT_MISC: + HILOG_INFO("TypeSwitchSplit is CONTACT_MISC "); + break; + case HICALL_DEVICE: + HILOG_INFO("TypeSwitchSplit is HICALL_DEVICE "); + break; + case CAMCARD: + case SIP_ADDRESS: + GetValuesBucketSipAddress(contact, valueContactData); + break; + default: + HILOG_ERROR("TypeSwitchSplit type is error "); + break; + } +} + +/** + * @brief Establish ValuesBucket condition in EMAIL case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketEmail(Contacts &contact, std::vector &valueContactData) +{ + int emailsSize = contact.emails.size(); + for (int i = 0; i < emailsSize; i++) { + NativeRdb::ValuesBucket valuesBucketEmail; + valuesBucketEmail.PutString("detail_info", contact.emails[i].email); + valuesBucketEmail.PutString("extend7", std::to_string(contact.emails[i].labelId)); + valuesBucketEmail.PutString("custom_data", contact.emails[i].labelName); + valuesBucketEmail.PutString("alias_detail_info", contact.emails[i].displayName); + valuesBucketEmail.PutString("content_type", "email"); + valueContactData.push_back(valuesBucketEmail); + } +} + +/** + * @brief Establish ValuesBucket condition in CONTACT_EVENT case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketEvent(Contacts &contact, std::vector &valueContactData) +{ + int eventsSize = contact.events.size(); + for (int i = 0; i < eventsSize; i++) { + NativeRdb::ValuesBucket valuesBucketEvent; + valuesBucketEvent.PutString("detail_info", contact.events[i].eventDate); + valuesBucketEvent.PutString("extend7", std::to_string(contact.events[i].labelId)); + valuesBucketEvent.PutString("custom_data", contact.events[i].labelName); + valuesBucketEvent.PutString("content_type", "contact_event"); + valueContactData.push_back(valuesBucketEvent); + } +} + +/** + * @brief Establish ValuesBucket condition in GROUP_MEMBERSHIP case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketGroup(Contacts &contact, std::vector &valueContactData) +{ + int groupsSize = contact.groups.size(); + for (int i = 0; i < groupsSize; i++) { + NativeRdb::ValuesBucket valuesBucketGroup; + valuesBucketGroup.PutString("detail_info", std::to_string(contact.groups[i].groupId)); + valuesBucketGroup.PutString("alias_detail_info", contact.groups[i].title); + valuesBucketGroup.PutString("content_type", "group_membership"); + valueContactData.push_back(valuesBucketGroup); + } +} + +/** + * @brief Establish ValuesBucket condition in Im case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketImAddress(Contacts &contact, std::vector &valueContactData) +{ + int imAddressSize = contact.imAddresses.size(); + for (int i = 0; i < imAddressSize; i++) { + NativeRdb::ValuesBucket valuesBucketImAddress; + valuesBucketImAddress.PutString("detail_info", contact.imAddresses[i].imAddress); + valuesBucketImAddress.PutString("extend7", std::to_string(contact.imAddresses[i].labelId)); + valuesBucketImAddress.PutString("custom_data", contact.imAddresses[i].labelName); + valuesBucketImAddress.PutString("content_type", "im"); + valueContactData.push_back(valuesBucketImAddress); + } +} + +/** + * @brief Establish ValuesBucket condition in PHOTO case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketPortrait(Contacts &contact, std::vector &valueContactData) +{ + if (!contact.portrait.uri.empty() || contact.portrait.uri != "") { + NativeRdb::ValuesBucket valuesBucketPortrait; + valuesBucketPortrait.PutString("detail_info", contact.portrait.uri); + valuesBucketPortrait.PutString("content_type", "photo"); + valueContactData.push_back(valuesBucketPortrait); + } +} + +/** + * @brief Establish ValuesBucket condition in PHONE case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketPhoneNumber( + Contacts &contact, std::vector &valueContactData) +{ + int phoneNumbersSize = contact.phoneNumbers.size(); + for (int i = 0; i < phoneNumbersSize; i++) { + NativeRdb::ValuesBucket valuesBucketPhoneNumber; + valuesBucketPhoneNumber.PutString("detail_info", contact.phoneNumbers[i].phoneNumber); + valuesBucketPhoneNumber.PutString("extend7", std::to_string(contact.phoneNumbers[i].labelId)); + valuesBucketPhoneNumber.PutString("custom_data", contact.phoneNumbers[i].labelName); + valuesBucketPhoneNumber.PutString("content_type", "phone"); + valueContactData.push_back(valuesBucketPhoneNumber); + } +} + +/** + * @brief Establish ValuesBucket condition in POSTAL_ADDRESS case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketPostalAddress( + Contacts &contact, std::vector &valueContactData) +{ + int postalAddressesSize = contact.postalAddresses.size(); + for (int i = 0; i < postalAddressesSize; i++) { + NativeRdb::ValuesBucket valuesBucketPostalAddress; + valuesBucketPostalAddress.PutString("detail_info", contact.postalAddresses[i].postalAddress); + valuesBucketPostalAddress.PutString("extend7", std::to_string(contact.postalAddresses[i].labelId)); + valuesBucketPostalAddress.PutString("custom_data", contact.postalAddresses[i].labelName); + valuesBucketPostalAddress.PutString("neighborhood", contact.postalAddresses[i].neighborhood); + valuesBucketPostalAddress.PutString("pobox", contact.postalAddresses[i].pobox); + valuesBucketPostalAddress.PutString("postcode", contact.postalAddresses[i].postcode); + valuesBucketPostalAddress.PutString("region", contact.postalAddresses[i].region); + valuesBucketPostalAddress.PutString("street", contact.postalAddresses[i].street); + valuesBucketPostalAddress.PutString("city", contact.postalAddresses[i].city); + valuesBucketPostalAddress.PutString("content_type", "postal_address"); + valueContactData.push_back(valuesBucketPostalAddress); + } +} + +/** + * @brief Establish ValuesBucket condition in RELATION case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketRelation(Contacts &contact, std::vector &valueContactData) +{ + int relationsSize = contact.relations.size(); + for (int i = 0; i < relationsSize; i++) { + NativeRdb::ValuesBucket valuesBucketRelation; + valuesBucketRelation.PutString("detail_info", contact.relations[i].relationName); + valuesBucketRelation.PutString("extend7", std::to_string(contact.relations[i].labelId)); + valuesBucketRelation.PutString("custom_data", contact.relations[i].labelName); + valuesBucketRelation.PutString("content_type", "relation"); + valueContactData.push_back(valuesBucketRelation); + } +} + +/** + * @brief Establish ValuesBucket condition in SIP_ADDRESS case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketSipAddress(Contacts &contact, std::vector &valueContactData) +{ + int sipAddressesSize = contact.sipAddresses.size(); + for (int i = 0; i < sipAddressesSize; i++) { + NativeRdb::ValuesBucket valuesBucketSipAddress; + valuesBucketSipAddress.PutString("detail_info", contact.sipAddresses[i].sipAddress); + valuesBucketSipAddress.PutString("extend7", std::to_string(contact.sipAddresses[i].labelId)); + valuesBucketSipAddress.PutString("custom_data", contact.sipAddresses[i].labelName); + valuesBucketSipAddress.PutString("content_type", "sip_address"); + valueContactData.push_back(valuesBucketSipAddress); + } +} + +/** + * @brief Establish ValuesBucket condition in WEBSITE case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketWebsite(Contacts &contact, std::vector &valueContactData) +{ + int websitesSize = contact.websites.size(); + for (int i = 0; i < websitesSize; i++) { + NativeRdb::ValuesBucket valuesBucketWebsite; + valuesBucketWebsite.PutString("detail_info", contact.websites[i].website); + valuesBucketWebsite.PutString("content_type", "website"); + valueContactData.push_back(valuesBucketWebsite); + } +} + +/** + * @brief Establish ValuesBucket condition in NAME case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketName(Contacts &contact, std::vector &valueContactData) +{ + if (!contact.name.fullName.empty() || contact.name.fullName != "") { + NativeRdb::ValuesBucket valuesBucketName; + valuesBucketName.PutString("detail_info", contact.name.fullName); + valuesBucketName.PutString("alpha_name", contact.name.namePrefix); + valuesBucketName.PutString("other_lan_last_name", contact.name.middleName); + valuesBucketName.PutString("other_lan_first_name", contact.name.nameSuffix); + valuesBucketName.PutString("family_name", contact.name.familyName); + valuesBucketName.PutString("middle_name_phonetic", contact.name.middleNamePhonetic); + valuesBucketName.PutString("given_name", contact.name.givenName); + valuesBucketName.PutString("given_name_phonetic", contact.name.givenNamePhonetic); + valuesBucketName.PutString("phonetic_name", contact.name.familyNamePhonetic); + valuesBucketName.PutString("content_type", "name"); + valueContactData.push_back(valuesBucketName); + } +} + +/** + * @brief Establish ValuesBucket condition in NICKNAME case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketNickName(Contacts &contact, std::vector &valueContactData) +{ + if (!contact.nickName.nickName.empty() || contact.nickName.nickName != "") { + NativeRdb::ValuesBucket valuesBucketNickName; + valuesBucketNickName.PutString("detail_info", contact.nickName.nickName); + valuesBucketNickName.PutString("content_type", "nickname"); + valueContactData.push_back(valuesBucketNickName); + } +} + +/** + * @brief Establish ValuesBucket condition in NOTE case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketNote(Contacts &contact, std::vector &valueContactData) +{ + if (!contact.note.noteContent.empty() || contact.note.noteContent != "") { + NativeRdb::ValuesBucket valuesBucketNote; + valuesBucketNote.PutString("detail_info", contact.note.noteContent); + valuesBucketNote.PutString("content_type", "note"); + valueContactData.push_back(valuesBucketNote); + } +} + +/** + * @brief Establish ValuesBucket condition in ORGANIZATION case + * + * @param contact Conditions for establish ValuesBucket operation + * @param valueContactData Conditions for establish ValuesBucket operation + */ +void ContactsBuild::GetValuesBucketOrganization( + Contacts &contact, std::vector &valueContactData) +{ + NativeRdb::ValuesBucket valuesBucketData; + if (!contact.organization.name.empty() || contact.organization.name != "") { + valuesBucketData.PutString("detail_info", contact.organization.name); + valuesBucketData.PutString("content_type", "organization"); + } + if (!contact.organization.title.empty() || contact.organization.title != "") { + valuesBucketData.PutString("position", contact.organization.title); + valuesBucketData.PutString("content_type", "organization"); + } + valueContactData.push_back(valuesBucketData); +} + +napi_value ContactsBuild::GetObjectByKey(napi_env env, napi_value object, std::string key) +{ + ResultConvert resultConvert; + return resultConvert.GetNapiValue(env, key.c_str(), object); +} + +napi_value ContactsBuild::GetArrayByKey(napi_env env, napi_value valueObject, std::string key) +{ + ResultConvert resultConvert; + napi_value array = resultConvert.GetNapiValue(env, key.c_str(), valueObject); + bool isArray = false; + napi_is_array(env, array, &isArray); + if (!isArray) { + HILOG_INFO("ContactsBuild GetArrayByKey value is not array"); + return nullptr; + } + return array; +} + +std::string ContactsBuild::GetStringValueByKey(napi_env env, napi_value valueObject, std::string key) +{ + ResultConvert resultConvert; + napi_value value = resultConvert.GetNapiValue(env, key.c_str(), valueObject); + std::string result = NapiGetValueString(env, value); + return result; +} + +int ContactsBuild::GetIntValueByKey(napi_env env, napi_value valueObject, std::string key) +{ + ResultConvert resultConvert; + napi_value value = resultConvert.GetNapiValue(env, key.c_str(), valueObject); + int64_t result; + napi_get_value_int64(env, value, &result); + int code = result; + return code; +} + +Name ContactsBuild::GetName(napi_env env, napi_value object) +{ + HILOG_INFO("ContactsBuild into GetName"); + Name name; + if (object == nullptr) { + HILOG_ERROR("ContactsBuild GetName nameKey is null "); + return name; + } + napi_value nameObj = GetObjectByKey(env, object, "name"); + napi_valuetype valueType; + napi_typeof(env, nameObj, &valueType); + if (nameObj == nullptr || valueType != napi_object) { + HILOG_ERROR("ContactsBuild GetName nameObj is null or object type is not object"); + return name; + } + name.familyName = GetStringValueByKey(env, nameObj, "familyName"); + name.middleNamePhonetic = GetStringValueByKey(env, nameObj, "middleNamePhonetic"); + name.givenName = GetStringValueByKey(env, nameObj, "givenName"); + name.givenNamePhonetic = GetStringValueByKey(env, nameObj, "givenNamePhonetic"); + name.familyNamePhonetic = GetStringValueByKey(env, nameObj, "familyNamePhonetic"); + name.fullName = GetStringValueByKey(env, nameObj, "fullName"); + name.middleName = GetStringValueByKey(env, nameObj, "middleName"); + name.namePrefix = GetStringValueByKey(env, nameObj, "namePrefix"); + name.nameSuffix = GetStringValueByKey(env, nameObj, "nameSuffix"); + return name; +} + +Portrait ContactsBuild::GetUri(napi_env env, napi_value object) +{ + HILOG_INFO("ContactsBuild into GetUri"); + Portrait portrait; + napi_value portraitKey = GetObjectByKey(env, object, "portrait"); + if (portraitKey == nullptr) { + HILOG_ERROR("ContactsBuild GetUri portraitKey is null "); + return portrait; + } + napi_value portraitValue; + napi_get_property(env, object, portraitKey, &portraitValue); + napi_valuetype valueType; + napi_typeof(env, portraitValue, &valueType); + if (portraitValue == nullptr || valueType != napi_object) { + HILOG_ERROR("ContactsBuild GetUri portraitValue is null or object type is not object"); + return portrait; + } + napi_value portraitKeyNames; + napi_get_property_names(env, portraitValue, &portraitKeyNames); + napi_value uriKey = GetObjectByKey(env, portraitKeyNames, "uri"); + if (uriKey == nullptr) { + HILOG_ERROR("ContactsBuild GetUri uriKey is null "); + return portrait; + } + napi_value uriValue; + napi_get_property(env, portraitValue, uriKey, &uriValue); + if (uriValue == nullptr) { + HILOG_ERROR("ContactsBuild GetUri uriValue is null "); + return portrait; + } + portrait.uri = NapiGetValueString(env, uriValue); + return portrait; +} + +std::vector ContactsBuild::GetEmails(napi_env env, napi_value object) +{ + std::vector emailVec; + napi_value EamilArray = GetArrayByKey(env, object, "emails"); + if (EamilArray == nullptr) { + HILOG_ERROR("ContactsBuild GetEmail napiValueEamil is null "); + return emailVec; + } + uint32_t size = 0; + napi_get_array_length(env, EamilArray, &size); + for (uint32_t i = 0; i < size; i++) { + Email email; + napi_value object; + napi_get_element(env, EamilArray, i, &object); + email.email = GetStringValueByKey(env, object, "email"); + email.labelName = GetStringValueByKey(env, object, "labelName"); + email.displayName = GetStringValueByKey(env, object, "displayName"); + email.labelId = GetIntValueByKey(env, object, "labelId"); + emailVec.push_back(email); + } + return emailVec; +} + +std::vector ContactsBuild::GetEvent(napi_env env, napi_value object) +{ + napi_value eventArray = GetArrayByKey(env, object, "events"); + if (eventArray == nullptr) { + HILOG_ERROR("ContactsBuild GetEvent arrKey is null "); + return std::vector(); + } + uint32_t size = 0; + napi_get_array_length(env, eventArray, &size); + std::vector resultVec; + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, eventArray, i, &obj); + Event eventObj; + eventObj.eventDate = GetStringValueByKey(env, obj, "eventDate"); + eventObj.labelName = GetStringValueByKey(env, obj, "labelName"); + eventObj.labelId = GetIntValueByKey(env, obj, "labelId"); + resultVec.push_back(eventObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetGroup(napi_env env, napi_value object) +{ + napi_value groupArray = GetArrayByKey(env, object, "groups"); + std::vector resultVec; + if (groupArray == nullptr) { + HILOG_ERROR("ContactsBuild GetGroup arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, groupArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, groupArray, i, &obj); + Group groupObj; + groupObj.groupId = GetIntValueByKey(env, obj, "groupId"); + groupObj.title = GetStringValueByKey(env, obj, "title"); + resultVec.push_back(groupObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetImAddress(napi_env env, napi_value object) +{ + napi_value imAddressArray = GetArrayByKey(env, object, "imAddresses"); + std::vector resultVec; + if (imAddressArray == nullptr) { + HILOG_ERROR("ContactsBuild GetImAddress arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, imAddressArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, imAddressArray, i, &obj); + ImAddress targetObj; + targetObj.imAddress = GetStringValueByKey(env, obj, "imAddress"); + targetObj.labelName = GetStringValueByKey(env, obj, "labelName"); + targetObj.labelId = GetIntValueByKey(env, obj, "labelId"); + resultVec.push_back(targetObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetPhoneNumbers(napi_env env, napi_value object) +{ + std::vector resultVec; + napi_value phoneNumberArray = GetArrayByKey(env, object, "phoneNumbers"); + if (phoneNumberArray == nullptr) { + HILOG_ERROR("ContactsBuild GetPhoneNumber napiValuePhoneNumber is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, phoneNumberArray, &size); + for (uint32_t i = 0; i < size; i++) { + PhoneNumber phones; + napi_value obj; + napi_get_element(env, phoneNumberArray, i, &obj); + phones.phoneNumber = GetStringValueByKey(env, obj, "phoneNumber"); + phones.labelName = GetStringValueByKey(env, obj, "labelName"); + phones.labelId = GetIntValueByKey(env, obj, "labelId"); + resultVec.push_back(phones); + } + return resultVec; +} + +std::vector ContactsBuild::GetPostalAddress(napi_env env, napi_value object) +{ + napi_value postalAddressArray = GetArrayByKey(env, object, "postalAddresses"); + std::vector resultVec; + if (postalAddressArray == nullptr) { + HILOG_ERROR("GetPostalAddress arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, postalAddressArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, postalAddressArray, i, &obj); + PostalAddress targetObj; + targetObj.city = GetStringValueByKey(env, obj, "city"); + targetObj.country = GetStringValueByKey(env, obj, "country"); + targetObj.labelName = GetStringValueByKey(env, obj, "labelName"); + targetObj.neighborhood = GetStringValueByKey(env, obj, "neighborhood"); + targetObj.pobox = GetStringValueByKey(env, obj, "pobox"); + targetObj.postalAddress = GetStringValueByKey(env, obj, "postalAddress"); + targetObj.postcode = GetStringValueByKey(env, obj, "postcode"); + targetObj.region = GetStringValueByKey(env, obj, "region"); + targetObj.street = GetStringValueByKey(env, obj, "street"); + resultVec.push_back(targetObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetRelation(napi_env env, napi_value object) +{ + napi_value relationArray = GetArrayByKey(env, object, "relations"); + std::vector resultVec; + if (relationArray == nullptr) { + HILOG_ERROR("GetRelation arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, relationArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, relationArray, i, &obj); + Relation targetObj; + targetObj.relationName = GetStringValueByKey(env, obj, "relationName"); + targetObj.labelName = GetStringValueByKey(env, obj, "labelName"); + targetObj.labelId = GetIntValueByKey(env, obj, "labelId"); + resultVec.push_back(targetObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetSipAddress(napi_env env, napi_value object) +{ + napi_value sipAddressArray = GetArrayByKey(env, object, "sipAddresses"); + std::vector resultVec; + if (sipAddressArray == nullptr) { + HILOG_ERROR("GetSipAddress arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, sipAddressArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, sipAddressArray, i, &obj); + SipAddress targetObj; + targetObj.sipAddress = GetStringValueByKey(env, obj, "sipAddress"); + targetObj.labelName = GetStringValueByKey(env, obj, "labelName"); + targetObj.labelId = GetIntValueByKey(env, obj, "labelId"); + resultVec.push_back(targetObj); + } + return resultVec; +} + +std::vector ContactsBuild::GetWebsite(napi_env env, napi_value object) +{ + napi_value websiteArray = GetArrayByKey(env, object, "websites"); + std::vector resultVec; + if (websiteArray == nullptr) { + HILOG_ERROR("ContactsBuild GetWebsite arrKey is null "); + return resultVec; + } + uint32_t size = 0; + napi_get_array_length(env, websiteArray, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value obj; + napi_get_element(env, websiteArray, i, &obj); + Website targetObj; + targetObj.website = GetStringValueByKey(env, obj, "website"); + resultVec.push_back(targetObj); + } + return resultVec; +} + +NickName ContactsBuild::GetNickName(napi_env env, napi_value object) +{ + HILOG_INFO("ContactsBuild into GetNickName"); + napi_value nickNameObj = GetObjectByKey(env, object, "nickName"); + NickName resultObj; + if (nickNameObj == nullptr) { + HILOG_ERROR("ContactsBuild GetNickName nickNameKey is null "); + return resultObj; + } + resultObj.nickName = GetStringValueByKey(env, nickNameObj, "nickName"); + return resultObj; +} + +Note ContactsBuild::GetNote(napi_env env, napi_value object) +{ + Note resultObj; + napi_value noteObj = GetObjectByKey(env, object, "note"); + if (noteObj == nullptr) { + HILOG_ERROR("GetNote noteKey is null "); + return resultObj; + } + resultObj.noteContent = GetStringValueByKey(env, noteObj, "noteContent"); + return resultObj; +} + +Organization ContactsBuild::GetOrganization(napi_env env, napi_value object) +{ + napi_value organizationObject = GetObjectByKey(env, object, "organization"); + Organization resultObj; + if (organizationObject == nullptr) { + HILOG_ERROR("GetOrganization noteKey is null "); + return resultObj; + } + resultObj.name = GetStringValueByKey(env, organizationObject, "name"); + resultObj.title = GetStringValueByKey(env, organizationObject, "title"); + return resultObj; +} + +int ContactsBuild::GetInt(napi_env env, napi_value id) +{ + int64_t value = 0; + if (id == nullptr) { + HILOG_ERROR("GetInt id is 0"); + return value; + } + napi_get_value_int64(env, id, &value); + return value; +} + +Holder ContactsBuild::GetHolder(napi_env env, napi_value object) +{ + Holder holder; + if (object == nullptr) { + HILOG_ERROR("GetHolder Holoder is null "); + return holder; + } + holder.bundleName = GetStringValueByKey(env, object, "bundleName"); + holder.displayName = GetStringValueByKey(env, object, "displayName"); + holder.holderId = GetIntValueByKey(env, object, "holderId"); + HILOG_INFO(" ContactsBuild::GetHolder int id = %{public}d", holder.holderId); + return holder; +} + +ContactAttributes ContactsBuild::GetContactAttributes(napi_env env, napi_value object) +{ + ContactAttributes contactAttributes; + if (object == nullptr) { + HILOG_ERROR("GetContactAttributes object is null "); + return contactAttributes; + } + napi_value napiValueAttr = GetArrayByKey(env, object, "attributes"); + std::vector attrVector; + uint32_t size = 0; + napi_get_array_length(env, napiValueAttr, &size); + for (uint32_t i = 0; i < size; i++) { + napi_value intValue; + napi_get_element(env, napiValueAttr, i, &intValue); + int64_t intNapiValue; + napi_get_value_int64(env, intValue, &intNapiValue); + if (intNapiValue != 0) { + attrVector.push_back(intNapiValue); + } + } + contactAttributes.attributes = attrVector; + return contactAttributes; +} + +std::string ContactsBuild::NapiGetValueString(napi_env env, napi_value value) +{ + if (value == nullptr) { + HILOG_ERROR("ContactsBuild NapiGetValueString value is nullptr"); + return ""; + } + std::string resultValue = ""; + char valueString[NAPI_GET_STRING_SIZE]; + size_t valueSize = NAPI_GET_STRING_SIZE; + size_t resultSize = 0; + napi_get_value_string_utf8(env, value, valueString, valueSize, &resultSize); + resultValue = valueString; + if (resultValue == "") { + HILOG_ERROR("ContactsBuild NapiGetValueString Data error"); + return ""; + } + return resultValue; +} +} // namespace ContactsApi +} // namespace OHOS \ No newline at end of file diff --git a/contacts/src/contacts_control.cpp b/contacts/src/contacts_control.cpp new file mode 100644 index 0000000..cd85b33 --- /dev/null +++ b/contacts/src/contacts_control.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2021 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 "contacts_control.h" + +#include "hilog_wrapper_api.h" + +namespace OHOS { +namespace ContactsApi { +ContactsControl::ContactsControl(void) +{ +} + +ContactsControl::~ContactsControl() +{ +} + +int64_t ContactsControl::RawContactInsert(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + int code = 0; + OHOS::Uri uriRawContact("dataability:///com.ohos.contactsdataability/contacts/raw_contact"); + code = dataAbilityHelper->Insert(uriRawContact, rawContactValues); + HILOG_INFO(" ContactsControl::RawContactInsert insert code %{public}d", code); + rawContactValues.Clear(); + return code; +} + +int ContactsControl::ContactDataInsert(std::shared_ptr dataAbilityHelper, + std::vector contactDataValues) +{ + int code = 0; + OHOS::Uri uriContactData("dataability:///com.ohos.contactsdataability/contacts/contact_data"); + code = dataAbilityHelper->BatchInsert(uriContactData, contactDataValues); + HILOG_INFO(" ContactsControl::ContactDataInsert insert code %{public}d", code); + contactDataValues.clear(); + return code; +} +int ContactsControl::ContactDataDelete(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + OHOS::Uri uriContactData("dataability:///com.ohos.contactsdataability/contacts/contact_data"); + code = dataAbilityHelper->Delete(uriContactData, predicates); + HILOG_INFO(" ContactsControl::ContactDataDelete insert code %{public}d", code); + return code; +} + +int ContactsControl::RawContactUpdate(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + OHOS::Uri uriRawContact("dataability:///com.ohos.contactsdataability/contacts/raw_contact"); + code = dataAbilityHelper->Update(uriRawContact, updateValues, predicates); + return code; +} + +int ContactsControl::ContactDataUpdate(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + OHOS::Uri uriContactData("dataability:///com.ohos.contactsdataability/contacts/contact_data"); + code = dataAbilityHelper->Update(uriContactData, updateValues, predicates); + return code; +} + +int ContactsControl::ContactDelete(std::shared_ptr dataAbilityHelper, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + OHOS::Uri uriContact("dataability:///com.ohos.contactsdataability/contacts/contact"); + code = dataAbilityHelper->Delete(uriContact, predicates); + return code; +} + +std::shared_ptr ContactsControl::HolderQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + OHOS::Uri uriContact("dataability:///com.ohos.contactsdataability/contacts/account"); + resultSet = dataAbilityHelper->Query(uriContact, columns, predicates); + return resultSet; +} + +std::shared_ptr ContactsControl::ContactQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + HILOG_INFO("ContactsControl::ContactQuery is start"); + std::shared_ptr resultSet; + OHOS::Uri uriContact("dataability:///com.ohos.contactsdataability/contacts/contact_data"); + resultSet = dataAbilityHelper->Query(uriContact, columns, predicates); + return resultSet; +} + +std::shared_ptr ContactsControl::ContactDataQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + OHOS::Uri uriContactData("dataability:///com.ohos.contactsdataability/contacts/contact_data"); + resultSet = dataAbilityHelper->Query(uriContactData, columns, predicates); + return resultSet; +} + +std::shared_ptr ContactsControl::GroupsQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + OHOS::Uri uriGroups("dataability:///com.ohos.contactsdataability/contacts/groups"); + resultSet = dataAbilityHelper->Query(uriGroups, columns, predicates); + return resultSet; +} + +std::shared_ptr ContactsControl::MyCardQuery( + std::shared_ptr dataAbilityHelper, std::vector columns, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + OHOS::Uri uriProfileContact("dataability:///com.ohos.contactsdataability/profile/contact_data"); + resultSet = dataAbilityHelper->Query(uriProfileContact, columns, predicates); + return resultSet; +} +} // namespace ContactsApi +} // namespace OHOS \ No newline at end of file diff --git a/contacts/src/native_module.cpp b/contacts/src/native_module.cpp new file mode 100644 index 0000000..2ff20d1 --- /dev/null +++ b/contacts/src/native_module.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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 "contacts_api.h" +#include "hilog_wrapper_api.h" + +namespace OHOS { +namespace ContactsApi { +static napi_value ModuleInit(napi_env env, napi_value exports) +{ + OHOS::ContactsApi::Init(env, exports); + return exports; +} + +extern "C" __attribute__((constructor)) void RegisterModule(void) +{ + napi_module module = { + .nm_version = 1, // NAPI v1 + .nm_flags = 0, // normal + .nm_filename = nullptr, + .nm_register_func = ModuleInit, + .nm_modname = "ContactsApi", + .nm_priv = nullptr, + .reserved = {} + }; + napi_module_register(&module); +} +} // namespace ContactsApi +} // namespace OHOS \ No newline at end of file diff --git a/contacts/src/result_convert.cpp b/contacts/src/result_convert.cpp new file mode 100644 index 0000000..b925ec6 --- /dev/null +++ b/contacts/src/result_convert.cpp @@ -0,0 +1,744 @@ +/* + * Copyright (c) 2021 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 "result_convert.h" + +#include "hilog_wrapper_api.h" + +namespace OHOS { +namespace ContactsApi { +ResultConvert::ResultConvert(void) +{ +} + +ResultConvert::~ResultConvert() +{ +} + +/** + * @brief Get object array by resultSet + * + * @param env Conditions for convert operation + * @param resultSet Conditions for convert operation + * + * @return The result returned by convert operation + */ +napi_value ResultConvert::ResultSetToObject( + napi_env env, std::shared_ptr &resultSet) +{ + if (resultSet == nullptr) { + HILOG_ERROR("ResultConvert::ResultSetToObject resultSet is nullptr"); + napi_value array; + napi_create_array(env, &array); + return array; + } + int rowCount = 0; + resultSet->GetRowCount(rowCount); + HILOG_INFO("ResultSetToObject GetRowCount is %{public}d", rowCount); + if (rowCount == 0) { + napi_value array; + napi_create_array(env, &array); + resultSet->Close(); + return array; + } + std::map resultSetMap; + std::map quickSearchMap; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == 0) { + int contactIdValue = 0; + std::string contactIdKey = "contact_id"; + int contactIndex = 0; + resultSet->GetColumnIndex(contactIdKey, contactIndex); + resultSet->GetInt(contactIndex, contactIdValue); + napi_value napiObject = GetResultMapValue(env, resultSetMap, contactIdValue); + PutQuickSearchKey(env, resultSet, quickSearchMap, contactIdValue); + ConvertContactObject(env, napiObject, resultSet); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + napi_value array = ConvertContactArray(env, resultSetMap, quickSearchMap); + return array; +} + +void ResultConvert::PutQuickSearchKey(napi_env env, std::shared_ptr &resultSet, + std::map &quickSearchMap, int contactIdValue) +{ + std::string quickSearchValue = ""; + std::string quickSearchKey = "quick_search_key"; + int columnIndex = 0; + resultSet->GetColumnIndex(quickSearchKey, columnIndex); + resultSet->GetString(columnIndex, quickSearchValue); + if (quickSearchMap.count(contactIdValue) <= 0) { + napi_value napiQuickSearchValue; + napi_create_string_utf8(env, quickSearchValue.c_str(), NAPI_AUTO_LENGTH, &napiQuickSearchValue); + quickSearchMap.insert(std::pair(contactIdValue, quickSearchValue)); + } +} + +napi_value ResultConvert::ConvertContactArray( + napi_env env, std::map &resultSetMap, std::map &quickSearchMap) +{ + napi_value array; + napi_create_array(env, &array); + int count = 0; + std::map::iterator it; + for (it = resultSetMap.begin(); it != resultSetMap.end(); ++it) { + napi_value elementObject = it->second; + if (quickSearchMap.count(it->first) > 0) { + napi_value keyValue; + napi_create_string_utf8(env, quickSearchMap[it->first].c_str(), NAPI_AUTO_LENGTH, &keyValue); + napi_value napiQuickKey; + napi_create_string_utf8(env, "key", NAPI_AUTO_LENGTH, &napiQuickKey); + napi_set_property(env, elementObject, napiQuickKey, keyValue); + } + napi_value keyValue; + napi_create_int64(env, it->first, &keyValue); + napi_value napiIdKey; + napi_create_string_utf8(env, "id", NAPI_AUTO_LENGTH, &napiIdKey); + napi_set_property(env, elementObject, napiIdKey, keyValue); + napi_set_element(env, array, count, elementObject); + ++count; + } + return array; +} + +/** + * @brief Converting NaPi objects to C++ objects + * + * @param env Conditions for convert operation + * @param napiObject Conditions for convert operation + * @param resultSet Target of convert operation + */ +void ResultConvert::ConvertContactObject( + napi_env env, napi_value napiObject, std::shared_ptr &resultSet) +{ + int typeIdValue = 0; + std::string typeId = "type_id"; + int columnIndexType = 0; + resultSet->GetColumnIndex(typeId, columnIndexType); + resultSet->GetInt(columnIndexType, typeIdValue); + ConvertEmail(env, napiObject, typeIdValue, resultSet); + ConvertName(env, napiObject, typeIdValue, resultSet); + ConvertUri(env, napiObject, typeIdValue, resultSet); + ConvertEvent(env, napiObject, typeIdValue, resultSet); + ConvertGroup(env, napiObject, typeIdValue, resultSet); + ConvertImAddress(env, napiObject, typeIdValue, resultSet); + ConvertPhoneNumber(env, napiObject, typeIdValue, resultSet); + ConvertPostalAddress(env, napiObject, typeIdValue, resultSet); + ConvertRelation(env, napiObject, typeIdValue, resultSet); + ConvertSipAddress(env, napiObject, typeIdValue, resultSet); + ConvertWebsite(env, napiObject, typeIdValue, resultSet); + ConvertNickName(env, napiObject, typeIdValue, resultSet); + ConvertNote(env, napiObject, typeIdValue, resultSet); + ConvertOrganization(env, napiObject, typeIdValue, resultSet); +} + +bool ResultConvert::IsEmpty(std::shared_ptr &resultSet) +{ + if (resultSet == nullptr) { + HILOG_ERROR("ResultSetToHolder resultSet is nullptr"); + return true; + } + int rowCount = 0; + resultSet->GetRowCount(rowCount); + if (rowCount == 0) { + resultSet->Close(); + return true; + } + return false; +} + +napi_value ResultConvert::ResultSetToHolder( + napi_env env, std::shared_ptr &resultSet) +{ + napi_value array; + napi_create_array(env, &array); + if (IsEmpty(resultSet)) { + return array; + } + int resultSetNum = resultSet->GoToFirstRow(); + int count = 0; + while (resultSetNum == 0) { + napi_value elementObject; + napi_create_object(env, &elementObject); + int idValue; + std::string id = "id"; + int idIndex = 0; + resultSet->GetColumnIndex(id, idIndex); + resultSet->GetInt(idIndex, idValue); + napi_value napiIdKey; + napi_create_string_utf8(env, "holderId", NAPI_AUTO_LENGTH, &napiIdKey); + napi_value napiValue; + napi_create_int64(env, idValue, &napiValue); + napi_set_property(env, elementObject, napiIdKey, napiValue); + std::string displayName = "account_name"; + std::string displayNameValue; + int displayNameIndex = 0; + resultSet->GetColumnIndex(displayName, displayNameIndex); + resultSet->GetString(displayNameIndex, displayNameValue); + napi_value napiDisplayNameKey; + napi_create_string_utf8(env, "displayName", NAPI_AUTO_LENGTH, &napiDisplayNameKey); + napi_value napiDisplayNameValue; + napi_create_string_utf8(env, displayNameValue.c_str(), NAPI_AUTO_LENGTH, &napiDisplayNameValue); + napi_set_property(env, elementObject, napiDisplayNameKey, napiDisplayNameValue); + std::string bundleName = "account_type"; + std::string bundleNameValue; + int bundleNameIndex = 0; + resultSet->GetColumnIndex(bundleName, bundleNameIndex); + resultSet->GetString(bundleNameIndex, bundleNameValue); + napi_value napiBundleNameKey; + napi_create_string_utf8(env, "bundleName", NAPI_AUTO_LENGTH, &napiBundleNameKey); + napi_value napiBundleNameValue; + napi_create_string_utf8(env, bundleNameValue.c_str(), NAPI_AUTO_LENGTH, &napiBundleNameValue); + napi_set_property(env, elementObject, napiBundleNameKey, napiBundleNameValue); + napi_set_element(env, array, count, elementObject); + ++count; + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return array; +} + +napi_value ResultConvert::ResultSetToGroup( + napi_env env, std::shared_ptr &resultSet) +{ + napi_value array; + NAPI_CALL(env, napi_create_array(env, &array)); + if (resultSet == nullptr) { + HILOG_ERROR("ResultSetToGroup resultSet is nullptr"); + return array; + } + int rowCount = 0; + resultSet->GetRowCount(rowCount); + HILOG_INFO("ResultSetToGroup GetRowCount is %{public}d", rowCount); + if (rowCount == 0) { + resultSet->Close(); + return array; + } + int resultSetNum = resultSet->GoToFirstRow(); + HILOG_INFO("ResultSetToGroup resultSetNum is %{public}d", resultSetNum); + int count = 0; + while (resultSetNum == 0) { + napi_value elementObject; + napi_create_object(env, &elementObject); + int idValue; + std::string id = "id"; + int idIndex = 0; + resultSet->GetColumnIndex(id, idIndex); + resultSet->GetInt(idIndex, idValue); + napi_value napiIdKey; + napi_create_string_utf8(env, "id", NAPI_AUTO_LENGTH, &napiIdKey); + napi_value napiValue; + napi_create_int64(env, idValue, &napiValue); + napi_set_property(env, elementObject, napiIdKey, napiValue); + std::string title = "group_name"; + std::string titleValue; + int titleIndex = 0; + resultSet->GetColumnIndex(title, titleIndex); + resultSet->GetString(titleIndex, titleValue); + napi_value napiTitleKey; + napi_create_string_utf8(env, "title", NAPI_AUTO_LENGTH, &napiTitleKey); + napi_value napiTitleValue; + napi_create_string_utf8(env, titleValue.c_str(), NAPI_AUTO_LENGTH, &napiTitleValue); + napi_set_property(env, elementObject, napiTitleKey, napiTitleValue); + napi_set_element(env, array, count, elementObject); + ++count; + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return array; +} + +napi_value ResultConvert::GetResultMapValue(napi_env env, std::map &resultSetMap, int &contactId) +{ + napi_value napiObject; + if (resultSetMap.count(contactId) > 0) { + std::map::iterator it = resultSetMap.find(contactId); + napiObject = it->second; + } else { + napi_create_object(env, &napiObject); + resultSetMap.insert(std::pair(contactId, napiObject)); + std::map::iterator it = resultSetMap.find(contactId); + napiObject = it->second; + } + return napiObject; +} + +napi_value ResultConvert::GetNapiValue(napi_env env, const std::string keyChar, napi_value napiObject) +{ + if (napiObject == nullptr) { + HILOG_ERROR("ResultConvert::GetNapiValue object is nullptr"); + return nullptr; + } + napi_value key; + napi_create_string_utf8(env, keyChar.c_str(), NAPI_AUTO_LENGTH, &key); + bool result = false; + napi_has_property(env, napiObject, key, &result); + if (result) { + napi_value value = nullptr; + napi_get_property(env, napiObject, key, &value); + return value; + } + return nullptr; +} + +napi_value ResultConvert::GetNapiElementObject(napi_env env, napi_value napiObject, const std::string valueChar) +{ + napi_value objectElement = GetNapiValue(env, valueChar, napiObject); + if (objectElement == nullptr) { + napi_create_object(env, &objectElement); + } + return objectElement; +} + +napi_value ResultConvert::GetNapiElementArray(napi_env env, napi_value napiObject, const std::string valueChar) +{ + napi_value emailArray = GetNapiValue(env, valueChar, napiObject); + if (emailArray == nullptr) { + napi_create_array(env, &emailArray); + } + return emailArray; +} + +napi_value ResultConvert::GetResultValue( + napi_env env, std::string &contentKey, std::shared_ptr &resultSet) +{ + int columnIndex = ERROR; + resultSet->GetColumnIndex(contentKey, columnIndex); + OHOS::NativeRdb::ColumnType columnType; + resultSet->GetColumnType(columnIndex, columnType); + napi_value napiValue = nullptr; + if (columnType == OHOS::NativeRdb::ColumnType::TYPE_NULL) { + return napiValue; + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_BLOB) { + return napiValue; + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_INTEGER) { + int intValue = 0; + resultSet->GetInt(columnIndex, intValue); + napi_create_int64(env, intValue, &napiValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_FLOAT) { + double doubleValue = 0; + resultSet->GetDouble(columnIndex, doubleValue); + napi_create_double(env, doubleValue, &napiValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_STRING) { + std::string stringValue; + resultSet->GetString(columnIndex, stringValue); + napi_create_string_utf8(env, stringValue.c_str(), NAPI_AUTO_LENGTH, &napiValue); + } + return napiValue; +} + +napi_value ResultConvert::CreateNapiStringValue(napi_env env, const std::string key) +{ + napi_value keyValue; + napi_create_string_utf8(env, key.c_str(), NAPI_AUTO_LENGTH, &keyValue); + return keyValue; +} + +void ResultConvert::ConvertEmail( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == EMAIL) { + const std::string emails = "emails"; + napi_value emailArray = GetNapiElementArray(env, napiObject, emails); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + std::string aliasDetailInfoKey = "alias_detail_info"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value aliasDetailInfoValue = GetResultValue(env, aliasDetailInfoKey, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "email"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_value napiDisplayNameIdKey = CreateNapiStringValue(env, "displayName"); + napi_set_property(env, objectElement, napiDisplayNameIdKey, aliasDetailInfoValue); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, emails.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertName( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == NAME) { + const std::string name = "name"; + napi_value objectElement = GetNapiElementObject(env, napiObject, name); + std::string fullNameKey = "detail_info"; + std::string familyNameKey = "family_name"; + std::string familyNamePhoneticKey = "phonetic_name"; + std::string givenNameKey = "given_name"; + std::string givenNamePhoneticKey = "given_name_phonetic"; + std::string middleNamePhoneticKey = "middle_name_phonetic"; + std::string middleNameKey = "other_lan_last_name"; + std::string namePrefixKey = "alpha_name"; + std::string nameSuffixKey = "other_lan_first_name"; + napi_value fullNameValue = GetResultValue(env, fullNameKey, resultSet); + napi_value familyNameValue = GetResultValue(env, familyNameKey, resultSet); + napi_value familyNamePhoneticValue = GetResultValue(env, familyNamePhoneticKey, resultSet); + napi_value givenNameValue = GetResultValue(env, givenNameKey, resultSet); + napi_value givenNamePhoneticValue = GetResultValue(env, givenNamePhoneticKey, resultSet); + napi_value middleNamePhoneticValue = GetResultValue(env, middleNamePhoneticKey, resultSet); + napi_value middleNameValue = GetResultValue(env, middleNameKey, resultSet); + napi_value namePrefixValue = GetResultValue(env, namePrefixKey, resultSet); + napi_value nameSuffixValue = GetResultValue(env, nameSuffixKey, resultSet); + napi_value napiFullNameKey = CreateNapiStringValue(env, "fullName"); + napi_set_property(env, objectElement, napiFullNameKey, fullNameValue); + napi_value napifamilyNameKey = CreateNapiStringValue(env, "familyName"); + napi_set_property(env, objectElement, napifamilyNameKey, familyNameValue); + napi_value napiFamilyNamePhoneticKey = CreateNapiStringValue(env, "phonetic_name"); + napi_set_property(env, objectElement, napiFamilyNamePhoneticKey, familyNamePhoneticValue); + napi_value napiGivenNameKey = CreateNapiStringValue(env, "givenName"); + napi_set_property(env, objectElement, napiGivenNameKey, givenNameValue); + napi_value napiGivenNamePhoneticKey = CreateNapiStringValue(env, "givenNamePhonetic"); + napi_set_property(env, objectElement, napiGivenNamePhoneticKey, givenNamePhoneticValue); + napi_value napiMiddleNamePhoneticKey = CreateNapiStringValue(env, "middleNamePhoneticKey"); + napi_set_property(env, objectElement, napiMiddleNamePhoneticKey, middleNamePhoneticValue); + napi_value napiMiddleNameKey = CreateNapiStringValue(env, "middleName"); + napi_set_property(env, objectElement, napiMiddleNameKey, middleNameValue); + napi_value napiNamePrefixKey = CreateNapiStringValue(env, "namePrefixKey"); + napi_set_property(env, objectElement, napiNamePrefixKey, namePrefixValue); + napi_value napiNameSuffixKey = CreateNapiStringValue(env, "nameSuffixKey"); + napi_set_property(env, objectElement, napiNameSuffixKey, nameSuffixValue); + napi_value napiElementKey; + napi_create_string_utf8(env, name.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, objectElement); + } +} + +void ResultConvert::ConvertUri( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == PHOTO) { + const std::string portrait = "portrait"; + napi_value objectElement = GetNapiElementObject(env, napiObject, portrait); + std::string uri = "detail_info"; + napi_value uriValue = GetResultValue(env, uri, resultSet); + napi_value napiUri = CreateNapiStringValue(env, "uri"); + napi_set_property(env, objectElement, napiUri, uriValue); + napi_value napiElementKey; + napi_create_string_utf8(env, portrait.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, objectElement); + } +} + +void ResultConvert::ConvertEvent( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == CONTACT_EVENT) { + const std::string events = "events"; + napi_value emailArray = GetNapiElementArray(env, napiObject, events); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "eventDate"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, events.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertGroup( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == GROUP_MEMBERSHIP) { + const std::string groups = "groups"; + napi_value emailArray = GetNapiElementArray(env, napiObject, groups); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string groupNameKey = "group_name"; + napi_value groupNameValue = GetResultValue(env, groupNameKey, resultSet); + napi_value napiGroupNameKey = CreateNapiStringValue(env, "title"); + napi_set_property(env, objectElement, napiGroupNameKey, groupNameValue); + std::string detailInfoKey = "detail_info"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "groupId"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiElementKey; + napi_create_string_utf8(env, groups.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertImAddress( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == IM) { + const std::string imAddresses = "imAddresses"; + napi_value emailArray = GetNapiElementArray(env, napiObject, imAddresses); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "imAddress"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, imAddresses.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertPhoneNumber( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == PHONE) { + const std::string phoneNumbers = "phoneNumbers"; + napi_value emailArray = GetNapiElementArray(env, napiObject, phoneNumbers); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "phoneNumber"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, phoneNumbers.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertPostalAddress( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == POSTAL_ADDRESS) { + const std::string postalAddresses = "postalAddresses"; + napi_value emailArray = GetNapiElementArray(env, napiObject, postalAddresses); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + std::string neighborhoodKey = "neighborhood"; + std::string poboxKey = "pobox"; + std::string postcodeKey = "postcode"; + std::string regionKey = "region"; + std::string streetKey = "street"; + std::string cityKey = "city"; + napi_value neighborhoodKeyValue = GetResultValue(env, streetKey, resultSet); + napi_value cityKeyValue = GetResultValue(env, cityKey, resultSet); + napi_value poboxKeyValue = GetResultValue(env, poboxKey, resultSet); + napi_value postcodeKeyValue = GetResultValue(env, postcodeKey, resultSet); + napi_value regionKeyValue = GetResultValue(env, regionKey, resultSet); + napi_value streetKeyValue = GetResultValue(env, streetKey, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "postalAddress"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_property( + env, objectElement, CreateNapiStringValue(env, neighborhoodKey.c_str()), neighborhoodKeyValue); + napi_set_property(env, objectElement, CreateNapiStringValue(env, cityKey.c_str()), cityKeyValue); + napi_set_property(env, objectElement, CreateNapiStringValue(env, poboxKey.c_str()), poboxKeyValue); + napi_set_property(env, objectElement, CreateNapiStringValue(env, postcodeKey.c_str()), postcodeKeyValue); + napi_set_property(env, objectElement, CreateNapiStringValue(env, regionKey.c_str()), regionKeyValue); + napi_set_property(env, objectElement, CreateNapiStringValue(env, streetKey.c_str()), streetKeyValue); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey = CreateNapiStringValue(env, postalAddresses); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertRelation( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == RELATION) { + const std::string relations = "relations"; + napi_value emailArray = GetNapiElementArray(env, napiObject, relations); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "relationName"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, relations.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertSipAddress( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == SIP_ADDRESS) { + const std::string sipAddresses = "sipAddresses"; + napi_value emailArray = GetNapiElementArray(env, napiObject, sipAddresses); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "relationName"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, sipAddresses.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertWebsite( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == WEBSITE) { + const std::string websites = "websites"; + napi_value emailArray = GetNapiElementArray(env, napiObject, websites); + uint32_t count = 0; + napi_get_array_length(env, emailArray, &count); + napi_value objectElement; + napi_create_object(env, &objectElement); + std::string detailInfoKey = "detail_info"; + std::string customDataKey = "custom_data"; + std::string extend7Key = "extend7"; + napi_value detailInfoValue = GetResultValue(env, detailInfoKey, resultSet); + napi_value customValue = GetResultValue(env, customDataKey, resultSet); + napi_value extend7Value = GetResultValue(env, extend7Key, resultSet); + napi_value napiDetailInfoKey = CreateNapiStringValue(env, "website"); + napi_set_property(env, objectElement, napiDetailInfoKey, detailInfoValue); + napi_value napiLabelNameKey = CreateNapiStringValue(env, "labelName"); + napi_set_property(env, objectElement, napiLabelNameKey, customValue); + napi_value napiLabelIdKey = CreateNapiStringValue(env, "labelId"); + napi_set_property(env, objectElement, napiLabelIdKey, extend7Value); + napi_set_element(env, emailArray, count, objectElement); + napi_value napiElementKey; + napi_create_string_utf8(env, websites.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, emailArray); + } +} + +void ResultConvert::ConvertNickName( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == NICKNAME) { + const std::string nickName = "nickName"; + napi_value objectElement = GetNapiElementObject(env, napiObject, nickName); + std::string name = "detail_info"; + napi_value uriValue = GetResultValue(env, name, resultSet); + napi_value napiUri = CreateNapiStringValue(env, "nickName"); + napi_set_property(env, objectElement, napiUri, uriValue); + napi_value napiElementKey; + napi_create_string_utf8(env, nickName.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, objectElement); + } +} + +void ResultConvert::ConvertNote( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == NOTE) { + const std::string note = "note"; + napi_value objectElement = GetNapiElementObject(env, napiObject, note); + std::string name = "detail_info"; + napi_value noteValue = GetResultValue(env, name, resultSet); + napi_value noteKey = CreateNapiStringValue(env, "noteContent"); + napi_set_property(env, objectElement, noteKey, noteValue); + napi_value napiElementKey; + napi_create_string_utf8(env, note.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, objectElement); + } +} + +void ResultConvert::ConvertOrganization( + napi_env env, napi_value napiObject, int &typeId, std::shared_ptr &resultSet) +{ + if (typeId == ORGANIZATION) { + const std::string organization = "organization"; + napi_value objectElement = GetNapiElementObject(env, napiObject, organization); + std::string company = "detail_info"; + std::string position = "position"; + napi_value companyValue = GetResultValue(env, company, resultSet); + napi_value positionValue = GetResultValue(env, position, resultSet); + napi_value napiNameValueKey = CreateNapiStringValue(env, "name"); + napi_set_property(env, objectElement, napiNameValueKey, companyValue); + napi_value napiTitleValueKey = CreateNapiStringValue(env, "title"); + napi_set_property(env, objectElement, napiTitleValueKey, positionValue); + napi_value napiElementKey; + napi_create_string_utf8(env, organization.c_str(), NAPI_AUTO_LENGTH, &napiElementKey); + napi_set_property(env, napiObject, napiElementKey, objectElement); + } +} +} // namespace ContactsApi +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/calllog/include/calllog_ability.h b/dataBusiness/calllog/include/calllog_ability.h new file mode 100644 index 0000000..ba1eead --- /dev/null +++ b/dataBusiness/calllog/include/calllog_ability.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CALLLOG_ABILITY_H +#define CALLLOG_ABILITY_H + +#include "ability.h" +#include "ability_loader.h" +#include "want.h" + +#include "calllog_database.h" + +namespace OHOS { +namespace AppExecFwk { +class CallLogAbility : public Ability { +public: + CallLogAbility(); + ~CallLogAbility(); + virtual int Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) override; + virtual int BatchInsert(const Uri &uri, const std::vector &values) override; + virtual void OnStart(const Want &want) override; + virtual int Update(const Uri &uri, const NativeRdb::ValuesBucket &value, + const NativeRdb::DataAbilityPredicates &predicates) override; + virtual int Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual std::shared_ptr Query(const Uri &uri, + const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual void Dump(const std::string &extra) override; + +private: + static std::shared_ptr callLogDataBase_; + static std::map uriValueMap_; + int UriParse(Uri &uri); + int InsertExecute(const Uri &uri, const NativeRdb::ValuesBucket &value); + void DataBaseNotifyChange(int code, Uri uri); + bool IsBeginTransactionOK(int code, std::mutex &mutex); + bool IsCommitOk(int code, std::mutex &mutex); +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif // CALLLOG_ABILITY_H diff --git a/dataBusiness/calllog/include/calllog_database.h b/dataBusiness/calllog/include/calllog_database.h new file mode 100644 index 0000000..4342682 --- /dev/null +++ b/dataBusiness/calllog/include/calllog_database.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CALLLOG_DATABASE_H +#define CALLLOG_DATABASE_H + +#include + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" +#include "value_object.h" + +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +class CallLogDataBase { +public: + static std::shared_ptr GetInstance(); + static std::shared_ptr store_; + int64_t InsertCallLog(OHOS::NativeRdb::ValuesBucket insertValues); + int UpdateCallLog(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteCallLog(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + std::unique_ptr Query( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, std::vector columns); + int BeginTransaction(); + int Commit(); + int RollBack(); + void QueryContactsByInsertCalls(OHOS::NativeRdb::ValuesBucket &insertValues); + +private: + CallLogDataBase(); + CallLogDataBase(const CallLogDataBase &); + const CallLogDataBase &operator=(const CallLogDataBase &); + static std::shared_ptr callLogDataBase_; + int UpdateTopContact(OHOS::NativeRdb::ValuesBucket &insertValues); +}; + +class SqliteOpenHelperCallLogCallback : public OHOS::NativeRdb::RdbOpenCallback { +public: + int OnCreate(OHOS::NativeRdb::RdbStore &rdbStore) override; + int OnUpgrade(OHOS::NativeRdb::RdbStore &rdbStore, int oldVersion, int newVersion) override; + int OnDowngrade(OHOS::NativeRdb::RdbStore &rdbStore, int currentVersion, int targetVersion) override; +}; +} // namespace Contacts +} // namespace OHOS + +#endif // CALLLOG_DATABASE_H diff --git a/dataBusiness/calllog/src/calllog_ability.cpp b/dataBusiness/calllog/src/calllog_ability.cpp new file mode 100644 index 0000000..e788fde --- /dev/null +++ b/dataBusiness/calllog/src/calllog_ability.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2021 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 "calllog_ability.h" + +#include + +#include "ability_loader.h" +#include "common.h" +#include "contacts_common_event.h" +#include "data_ability_predicates.h" +#include "file_utils.h" +#include "predicates_convert.h" +#include "rdb_predicates.h" +#include "sql_analyzer.h" +#include "uri_utils.h" + +namespace OHOS { +namespace AppExecFwk { +REGISTER_AA(CallLogAbility); +namespace { +std::mutex g_mutex; +} +std::shared_ptr CallLogAbility::callLogDataBase_ = nullptr; +std::map CallLogAbility::uriValueMap_ = { + {"/com.ohos.calllogability/calls/calllog", Contacts::CALLLOG} +}; + +CallLogAbility::CallLogAbility() +{ +} + +CallLogAbility::~CallLogAbility() +{ +} + +void CallLogAbility::Dump(const std::string &extra) +{ + HILOG_ERROR("CallLogAbility ====>Dump:%{public}s", extra.c_str()); + Contacts::FileUtils fileUtils; + std::string dirStr = Contacts::ContactsPath::DUMP_PATH; + fileUtils.WriteStringToFileAppend(dirStr, extra); +} + +void CallLogAbility::OnStart(const Want &want) +{ + std::string basePath = GetDatabaseDir(); + Contacts::ContactsPath::RDB_PATH = basePath + "/"; + Contacts::ContactsPath::RDB_BACKUP_PATH = basePath + "/backup/"; + Contacts::ContactsPath::DUMP_PATH = GetFilesDir() + "/"; +} + +int CallLogAbility::UriParse(Uri &uri) +{ + Contacts::UriUtils uriUtils; + int parseCode = uriUtils.UriParse(uri, uriValueMap_); + return parseCode; +} + +/** + * @brief CallLogAbility BeginTransaction emptiness problems + * + * @param code the return number of BeginTransaction + * @param mutex transmission parameter : lock + * + * @return BeginTransaction emptiness true or false + */ +bool CallLogAbility::IsBeginTransactionOK(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsBeginTransactionOK fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief CallLogAbility Commit emptiness problems + * + * @param code the return number of Commit + * @param mutex transmission parameter : lock + * + * @return Commit emptiness true or false + */ +bool CallLogAbility::IsCommitOk(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsCommitOk fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief CallLogAbility Insert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data value of the database + * + * @return Insert database results code + */ +int CallLogAbility::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) +{ + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("CallLogAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + callLogDataBase_ = Contacts::CallLogDataBase::GetInstance(); + int ret = callLogDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + int resultId = InsertExecute(uri, value); + if (resultId == Contacts::OPERATION_ERROR) { + ret = callLogDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::OPERATION_ERROR; + } + ret = callLogDataBase_->Commit(); + if (!IsCommitOk(ret, g_mutex)) { + callLogDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + return resultId; +} + +int CallLogAbility::InsertExecute(const Uri &uri, const NativeRdb::ValuesBucket &value) +{ + int rowId = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int parseCode = UriParse(uriTemp); + switch (parseCode) { + case Contacts::CALLLOG: + rowId = callLogDataBase_->InsertCallLog(value); + break; + default: + HILOG_ERROR("CallLogAbility ====>no match uri action"); + break; + } + return rowId; +} + +/** + * @brief CallLogAbility BatchInsert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data values of the database + * + * @return Insert database results code + */ +int CallLogAbility::BatchInsert(const Uri &uri, const std::vector &values) +{ + int rowRet = Contacts::RDB_EXECUTE_FAIL; + int size = values.size(); + if (size <= 0) { + HILOG_ERROR("BatchInsert value is error"); + return rowRet; + } + g_mutex.lock(); + callLogDataBase_ = Contacts::CallLogDataBase::GetInstance(); + int ret = callLogDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + int count = 0; + for (int i = 0; i < size; i++) { + ++count; + OHOS::NativeRdb::ValuesBucket rawContactValues = values[i]; + int code = InsertExecute(uri, rawContactValues); + if (code == Contacts::RDB_EXECUTE_FAIL) { + callLogDataBase_->RollBack(); + g_mutex.unlock(); + return code; + } + if (count % Contacts::BATCH_INSERT_COUNT == 0) { + int markRet = callLogDataBase_->Commit(); + int beginRet = callLogDataBase_->BeginTransaction(); + if (!IsCommitOk(markRet, g_mutex) || !IsBeginTransactionOK(beginRet, g_mutex)) { + callLogDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + } + } + int markRet = callLogDataBase_->Commit(); + if (!IsCommitOk(markRet, g_mutex)) { + callLogDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + return Contacts::RDB_EXECUTE_OK; +} + +/** + * @brief CallLogAbility Update database + * + * @param uri Determine the data table name based on the URI + * @param predicates Update the data value of the condition + * + * @return Update database results code + */ +int CallLogAbility::Update( + const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates) +{ + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("CallLogAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + callLogDataBase_ = Contacts::CallLogDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + int ret = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int parseCode = UriParse(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (parseCode) { + case Contacts::CALLLOG: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::CALLLOG, dataAbilityPredicates); + ret = callLogDataBase_->UpdateCallLog(value, rdbPredicates); + break; + default: + HILOG_ERROR("CallLogAbility ====>no match uri action"); + break; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_UPDATE, uri); + return ret; +} + +/** + * @brief CallLogAbility Delete database + * + * @param uri Determine the data table name based on the URI + * @param predicates Delete the data values of the condition + * + * @return Delete database results code + */ +int CallLogAbility::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) +{ + g_mutex.lock(); + callLogDataBase_ = Contacts::CallLogDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + int ret = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int parseCode = UriParse(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (parseCode) { + case Contacts::CALLLOG: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::CALLLOG, dataAbilityPredicates); + ret = callLogDataBase_->DeleteCallLog(rdbPredicates); + break; + default: + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + break; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_DELETE, uri); + return ret; +} + +/** + * @brief CallLogAbility Query database + * + * @param uri Determine the data table name based on the URI + * @param columns Columns returned by query + * @param predicates Query the data values of the condition + * + * @return Query database results + */ +std::shared_ptr CallLogAbility::Query( + const Uri &uri, const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) +{ + HILOG_INFO("ContactsDataAbility ====>Query start"); + callLogDataBase_ = Contacts::CallLogDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + std::shared_ptr result; + OHOS::Uri uriTemp = uri; + Contacts::UriUtils uriUtils; + int parseCode = uriUtils.UriParse(uriTemp, uriValueMap_); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + std::vector columnsTemp = columns; + switch (parseCode) { + case Contacts::CALLLOG: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::CALLLOG, dataAbilityPredicates); + result = callLogDataBase_->Query(rdbPredicates, columnsTemp); + break; + default: + HILOG_ERROR("CallLogAbility ====>no match uri action"); + break; + } + std::shared_ptr sharedPtrResult = std::move(result); + HILOG_INFO("ContactsDataAbility ====>Query end"); + return sharedPtrResult; +} + +void CallLogAbility::DataBaseNotifyChange(int code, Uri uri) +{ + Contacts::ContactsCommonEvent::SendCallLogChange(code); +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/calllog/src/calllog_database.cpp b/dataBusiness/calllog/src/calllog_database.cpp new file mode 100644 index 0000000..d506d6f --- /dev/null +++ b/dataBusiness/calllog/src/calllog_database.cpp @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2021 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 "calllog_database.h" + +#include "common.h" +#include "contacts_database.h" +#include "contacts_type.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr CallLogDataBase::callLogDataBase_ = nullptr; +std::shared_ptr CallLogDataBase::store_ = nullptr; +static std::string g_databaseName; + +CallLogDataBase::CallLogDataBase() +{ + g_databaseName = ContactsPath::RDB_PATH + "calls.db"; + HILOG_INFO("CallLogDataBase g_databaseName :%{public}s", g_databaseName.c_str()); + int errCode = OHOS::NativeRdb::E_OK; + OHOS::NativeRdb::RdbStoreConfig config(g_databaseName); + SqliteOpenHelperCallLogCallback sqliteOpenHelperCallback; + store_ = OHOS::NativeRdb::RdbHelper::GetRdbStore(config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode); + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CallLogDataBase errCode :%{public}d", errCode); + } else { + HILOG_INFO("CallLogDataBase errCode :%{public}d", errCode); + } +} + +std::shared_ptr CallLogDataBase::GetInstance() +{ + if (callLogDataBase_ == nullptr) { + callLogDataBase_.reset(new CallLogDataBase()); + return callLogDataBase_; + } + return callLogDataBase_; +} + +int CallLogDataBase::BeginTransaction() +{ + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase BeginTransaction store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CallLogDataBase BeginTransaction fail :%{public}d", ret); + } + return ret; +} + +int CallLogDataBase::Commit() +{ + if (store_ == nullptr) { + HILOG_ERROR(" CallLogDataBase Commit store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->Commit(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR(" CallLogDataBase Commit fail :%{public}d", ret); + } + return ret; +} + +int CallLogDataBase::RollBack() +{ + if (store_ == nullptr) { + HILOG_ERROR(" CallLogDataBase RollBack store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->RollBack(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR(" CallLogDataBase RollBack fail :%{public}d", ret); + } + return ret; +} + +int SqliteOpenHelperCallLogCallback::OnCreate(OHOS::NativeRdb::RdbStore &store) +{ + std::vector judgeSuccess; + judgeSuccess.push_back(store.ExecuteSql(CREATE_VOICEMAIL)); + judgeSuccess.push_back(store.ExecuteSql(CREATE_CALLLOG)); + judgeSuccess.push_back(store.ExecuteSql(CREATE_REPLYING)); + judgeSuccess.push_back(store.ExecuteSql(CREATE_DATABASE_BACKUP_TASK)); + judgeSuccess.push_back(store.ExecuteSql(CREATE_INSERT_BACKUP_TIME)); + judgeSuccess.push_back(store.ExecuteSql(CALL_LOG_PHONE_NUMBER_INDEX)); + int size = judgeSuccess.size(); + for (int i = 0; i < size; i++) { + if (judgeSuccess[i] != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("SqliteOpenHelperCallLogCallback create table error : %{public}d", judgeSuccess[i]); + } + } + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperCallLogCallback::OnUpgrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnUpgrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion < newVersion && newVersion == DATABASE_NEW_VERSION) { + store.ExecuteSql("ALTER TABLE database_backup_task ADD COLUMN sync TEXT"); + } + store.SetVersion(newVersion); + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperCallLogCallback::OnDowngrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnDowngrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion > newVersion && newVersion == DATABASE_OPEN_VERSION) { + store.ExecuteSql( + "CREATE TABLE IF NOT EXISTS database_backup (id INTEGER PRIMARY KEY AUTOINCREMENT, backup_time " + "TEXT, backup_path TEXT, remarks TEXT)"); + store.ExecuteSql( + "INSERT INTO database_backup(id, backup_time, backup_path, remarks) SELECT id, " + "backup_time, backup_path, remarks FROM database_backup_task"); + store.ExecuteSql("DROP table database_backup_task"); + store.ExecuteSql("ALTER table database_backup RENAME TO database_backup_task"); + store.ExecuteSql(CREATE_INSERT_BACKUP_TIME); + } + int ret = store.SetVersion(newVersion); + return ret; +} + +/** + * @brief InsertCallLog operation + * + * @param insertValues Conditions for update operation + * + * @return InsertCallLog operation results + */ +int64_t CallLogDataBase::InsertCallLog(OHOS::NativeRdb::ValuesBucket insertValues) +{ + int64_t outRowId = RDB_EXECUTE_FAIL; + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase Insert store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + QueryContactsByInsertCalls(insertValues); + int ret = store_->Insert(outRowId, CallsTableName::CALLLOG, insertValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CallLogDataBase InsertCallLog ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return outRowId; +} + +/** + * @brief UpdateCallLog operation + * + * @param values Conditions for update operation + * @param predicates Conditions for update operation + * + * @return UpdateCallLog operation results + */ +int CallLogDataBase::UpdateCallLog(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &predicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase Update store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (values.HasColumn(CallLogColumns::PHONE_NUMBER)) { + QueryContactsByInsertCalls(values); + } + int changeRow; + int ret = store_->Update(changeRow, values, predicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CallLogDataBase UpdateCallLog ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +/** + * @brief DeleteCallLog operation + * + * @param predicates Conditions for delete operation + * + * @return DeleteCallLog operation results + */ +int CallLogDataBase::DeleteCallLog(OHOS::NativeRdb::RdbPredicates &predicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase Delete store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int deleteRow; + int ret = store_->Delete(deleteRow, predicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CallLogDataBase DeleteCallLog ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +/** + * @brief QueryContacts operation + * + * @param predicates Conditions for query operation + * @param columns Conditions for query operation + * + * @return Query database results + */ +std::unique_ptr CallLogDataBase::Query( + OHOS::NativeRdb::RdbPredicates &predicates, std::vector columns) +{ + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase Delete store_ is nullptr"); + return nullptr; + } + std::unique_ptr result = store_->Query(predicates, columns); + return result; +} + +/** + * @brief QueryContacts By InsertCallLog get name and phone to UpdateTopContact + * + * @param insertValues Inserted data values + * + * @return void + */ +void CallLogDataBase::QueryContactsByInsertCalls(OHOS::NativeRdb::ValuesBucket &insertValues) +{ + if (!insertValues.HasColumn(CallLogColumns::PHONE_NUMBER)) { + HILOG_ERROR("QueryContactsByInsertCalls phone_number is required"); + return; + } + OHOS::NativeRdb::ValueObject value; + insertValues.GetObject(CallLogColumns::PHONE_NUMBER, value); + std::string phoneNumber; + value.GetString(phoneNumber); + ContactsType contactsType; + static std::shared_ptr contactsDataBase = ContactsDataBase::GetInstance(); + int typeNameId = contactsType.LookupTypeId(contactsDataBase->contactStore_, ContentTypeData::PHONE); + std::string sql = "SELECT display_name, contact_id FROM "; + sql.append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE raw_contact_id = ") + .append("(SELECT min(raw_contact_id) FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE detail_info = ?") + .append(" AND is_deleted = 0") + .append(") AND type_id = ") + .append(std::to_string(typeNameId)) + .append(" AND is_deleted = 0"); + std::vector selectionArgs; + selectionArgs.push_back(phoneNumber); + std::unique_ptr resultSet = + contactsDataBase->contactStore_->QuerySql(sql, selectionArgs); + std::string quickSearchKey; + std::string name; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + resultSet->GetString(0, name); + resultSet->GetString(1, quickSearchKey); + resultSetNum = resultSet->GoToNextRow(); + insertValues.Delete(CallLogColumns::DISPLAY_NAME); + insertValues.PutString(CallLogColumns::DISPLAY_NAME, name); + insertValues.Delete(CallLogColumns::QUICK_SEARCH_KEY); + insertValues.PutString(CallLogColumns::QUICK_SEARCH_KEY, quickSearchKey); + break; + } + resultSet->Close(); + int ret = UpdateTopContact(insertValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("QueryContactsByInsertCalls UpdateTopContact is error"); + } +} + +/** + * @brief Update the callLog contact frequency and contact time + * + * @param insertValues Get contact time + * @param phoneNumber phoneNumber To select callLog + * + * @return update frequency and time result code + */ +int CallLogDataBase::UpdateTopContact(OHOS::NativeRdb::ValuesBucket &insertValues) +{ + if (!insertValues.HasColumn(CallLogColumns::BEGIN_TIME)) { + return RDB_EXECUTE_FAIL; + } + OHOS::NativeRdb::ValueObject value; + insertValues.GetObject(CallLogColumns::BEGIN_TIME, value); + int contactedTime; + value.GetInt(contactedTime); + std::string sqlBuild = "UPDATE "; + sqlBuild.append(ContactTableName::RAW_CONTACT) + .append(" SET lastest_contacted_time = ") + .append(std::to_string(contactedTime)) + .append(", contacted_count = (contacted_count + 1) ") + .append(" WHERE contact_id = ") + .append("(SELECT DISTINCT min(contact_id) FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE detail_info = ? ") + .append(")"); + std::vector bindArgs; + OHOS::NativeRdb::ValueObject phone; + insertValues.GetObject(CallLogColumns::PHONE_NUMBER, phone); + bindArgs.push_back(phone); + int ret = ContactsDataBase::GetInstance()->contactStore_->ExecuteSql(sqlBuild, bindArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("store ExecuteSql error"); + return RDB_EXECUTE_FAIL; + } + return RDB_EXECUTE_OK; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/include/contacts.h b/dataBusiness/contacts/include/contacts.h new file mode 100644 index 0000000..9ae41e5 --- /dev/null +++ b/dataBusiness/contacts/include/contacts.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_H +#define CONTACT_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_store.h" + +namespace OHOS { +namespace Contacts { +class Contacts { +public: + Contacts(); + ~Contacts(); + int InsertContact(std::shared_ptr rdbStore, const int64_t &outRawContactId, + OHOS::NativeRdb::ValuesBucket rawContactValues, int64_t &contactId); + OHOS::NativeRdb::ValuesBucket StructureContactDataValueBucket(OHOS::NativeRdb::ValuesBucket rawContactValues); + int UpdateContact(const int &rawContactId, std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket linkDataDataValues); + int DeleteContactById(std::shared_ptr rdbStore, int needDeleteContactId); + +private: + int ContactValueBucketGetInt(OHOS::NativeRdb::ValuesBucket rawContactValues, std::string ColumnName); + std::string ContactValueBucketGetString(OHOS::NativeRdb::ValuesBucket rawContactValues, std::string ColumnName); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_H diff --git a/dataBusiness/contacts/include/contacts_account.h b/dataBusiness/contacts/include/contacts_account.h new file mode 100644 index 0000000..9de1319 --- /dev/null +++ b/dataBusiness/contacts/include/contacts_account.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_ACCOUNT_H +#define CONTACT_ACCOUNT_H + +#include "rdb_errno.h" +#include "rdb_store.h" +#include "result_set.h" + +#include "account_data_collection.h" + +namespace OHOS { +namespace Contacts { +class ContactsAccount { +public: + static std::shared_ptr GetInstance(); + ~ContactsAccount(); + int64_t Insert( + std::shared_ptr rdbStore, std::string accountName, std::string accountType); + int LookupAccountTypeId( + std::shared_ptr rdbStore, std::string accountName, std::string accountType); + void PrepopulateCommonAccountTypes(std::shared_ptr rdbStore); + std::vector GetAccountFromLoacl(std::shared_ptr rdbStore); + int GetNotExistAccount(std::shared_ptr rdbStore, AccountDataCollection collection); + int DeleteDataByRawId(std::shared_ptr rdbStore, int needDeleteRawContactId); + int DeleteGroupsByAccountId(std::shared_ptr rdbStore, int accountId); + int DeleteAccountByAccountId(std::shared_ptr rdbStore, int accountId); + int StopForegin(std::shared_ptr rdbStore); + int OpenForegin(std::shared_ptr rdbStore); + +private: + ContactsAccount(); + static std::shared_ptr instance_; +}; +} // namespace Contacts +} // namespace OHOS + +#endif // CONTACT_ACCOUNT_H \ No newline at end of file diff --git a/dataBusiness/contacts/include/contacts_data_ability.h b/dataBusiness/contacts/include/contacts_data_ability.h new file mode 100644 index 0000000..09312d0 --- /dev/null +++ b/dataBusiness/contacts/include/contacts_data_ability.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTSDATAABILITY_CONTACT_DATA_ABILITY_TEST_H +#define CONTACTSDATAABILITY_CONTACT_DATA_ABILITY_TEST_H + +#include + +#include "ability.h" +#include "ability_loader.h" +#include "predicates_convert.h" +#include "rdb_predicates.h" +#include "want.h" + +#include "contacts_database.h" + +namespace OHOS { +namespace AppExecFwk { +class ContactsDataAbility : public Ability { +public: + ContactsDataAbility(); + ~ContactsDataAbility(); + virtual int Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) override; + virtual int BatchInsert(const Uri &uri, const std::vector &values) override; + virtual void OnStart(const Want &want) override; + virtual int Update(const Uri &uri, const NativeRdb::ValuesBucket &value, + const NativeRdb::DataAbilityPredicates &predicates) override; + virtual int Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual std::shared_ptr Query(const Uri &uri, + const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual void Dump(const std::string &extra) override; + +private: + static std::shared_ptr contactDataBase_; + static std::shared_ptr profileDataBase_; + static std::map uriValueMap_; + int InsertExecute(int &code, const NativeRdb::ValuesBucket &value); + int UriParseAndSwitch(Uri &uri); + void SwitchProfile(Uri &uri); + void QueryExecute(std::shared_ptr &result, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates, std::vector &columnsTemp, + int &parseCode); + void QueryExecuteSwitchSplit(std::shared_ptr &result, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates, std::vector &columnsTemp, + int &parseCode); + void UpdateExecute(int &retCode, int code, const NativeRdb::ValuesBucket &value, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates); + void SwitchUpdate(int &retCode, int &code, const NativeRdb::ValuesBucket &value, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates); + void DeleteExecute(int &retCode, int code, OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates); + void DataBaseNotifyChange(int code, Uri uri); + bool IsBeginTransactionOK(int code, std::mutex &mutex); + bool IsCommitOK(int code, std::mutex &mutex); + int BackUp(); + int Recover(int &code); +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif // CONTACTSDATAABILITY_CONTACT_DATA_ABILITY_TEST_H \ No newline at end of file diff --git a/dataBusiness/contacts/include/contacts_database.h b/dataBusiness/contacts/include/contacts_database.h new file mode 100644 index 0000000..159cb5e --- /dev/null +++ b/dataBusiness/contacts/include/contacts_database.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_DATABASE_H +#define CONTACT_DATABASE_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" + +#include "calllog_database.h" +#include "profile_database.h" + +namespace OHOS { +namespace Contacts { +class ContactsDataBase { +public: + static std::shared_ptr GetInstance(); + static std::shared_ptr store_; + static std::shared_ptr contactStore_; + + std::vector ResultSetToValuesBucket( + std::unique_ptr &resultSet); + void GetContactByValue(int &rawContactId, OHOS::NativeRdb::ValueObject &value); + int64_t InsertRawContact(std::string table, OHOS::NativeRdb::ValuesBucket value); + int64_t InsertContactData(std::string table, OHOS::NativeRdb::ValuesBucket value); + int64_t InsertGroup(std::string table, OHOS::NativeRdb::ValuesBucket value); + int64_t InsertBlockList(std::string table, OHOS::NativeRdb::ValuesBucket value); + int UpdateContactData(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int UpdateRawContact(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int UpdateGroup(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int UpdateBlockList(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteGroup(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteContactData(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteContact(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteRawContact(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteBlockList(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + std::unique_ptr Query( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, std::vector &columns); + int CompletelyDelete(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int BeginTransaction(); + int Commit(); + int RollBack(); + static void DestroyInstanceAndRestore(std::string restorePath); + std::shared_ptr SelectCandidate(); + int Split(OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactMerge(); + int ReContactMerge(OHOS::NativeRdb::DataAbilityPredicates predicates); + int DeleteRecord(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int GetTypeId(std::string typeText); + void DeleteExecute(std::shared_ptr &store, + std::vector queryValuesBucket); + void InsertMergeData(std::shared_ptr &store, std::vector &rawContactIdVector); + void MarkMerge(std::shared_ptr &store); + void MergeUpdateTask( + std::shared_ptr &store, std::vector &rawContactIdVector, bool isDeleted); + void DeleteRecordInsert(std::shared_ptr &store, + std::vector &queryValuesBucket); + void DeletedAsyncTask(std::shared_ptr &store, + std::vector &queryValuesBucket); + +private: + ContactsDataBase(); + ContactsDataBase(const ContactsDataBase &); + static std::shared_ptr contactDataBase_; + static std::shared_ptr callLogDataBase_; + + std::vector QueryContactDataRawContactId( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, std::vector &types); + std::string StructureDeleteContactJson( + OHOS::NativeRdb::ValuesBucket rawContactValues, std::string rawContactIdColumn, int rawContactId); + int DeleteExecute(std::vector &queryValuesBucket); + int DeleteRawContactLocal(int contactId, int rawContactId, std::string backupData, std::string disPlayName); + std::vector DeleteContactQuery(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + std::vector DeleteRawContactQuery(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteLocal(int rawContactId, std::string contactId); + static bool Restore(std::string restorePath); + int GetTypeText( + OHOS::NativeRdb::ValuesBucket &contactDataValues, int &typeId, int &rawContactId, std::string &typeText); + int CompletelyDeleteCommit(int retCode); +}; + +class SqliteOpenHelperContactCallback : public OHOS::NativeRdb::RdbOpenCallback { +public: + int OnCreate(OHOS::NativeRdb::RdbStore &rdbStore) override; + int OnUpgrade(OHOS::NativeRdb::RdbStore &rdbStore, int oldVersion, int newVersion) override; + int OnDowngrade(OHOS::NativeRdb::RdbStore &rdbStore, int currentVersion, int targetVersion) override; +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_DATABASE_H \ No newline at end of file diff --git a/dataBusiness/contacts/include/contacts_type.h b/dataBusiness/contacts/include/contacts_type.h new file mode 100644 index 0000000..e4eea12 --- /dev/null +++ b/dataBusiness/contacts/include/contacts_type.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_TYPE_H +#define CONTACT_TYPE_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_store.h" +#include "result_set.h" + +namespace OHOS { +namespace Contacts { +class ContactsType { +public: + ContactsType(); + ~ContactsType(); + int64_t Insert(std::shared_ptr rdbStore, std::string typeValue, int typeId); + int LookupTypeId(std::shared_ptr rdbStore, std::string typeValue); + void PrepopulateCommonTypes(std::shared_ptr rdbStore); + std::string GetTypeText(std::shared_ptr rdbStore, int typeId); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_TYPE_H diff --git a/dataBusiness/contacts/include/contacts_update_helper.h b/dataBusiness/contacts/include/contacts_update_helper.h new file mode 100644 index 0000000..2c7c52a --- /dev/null +++ b/dataBusiness/contacts/include/contacts_update_helper.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_UPDATE_HELPER_H +#define CONTACT_UPDATE_HELPER_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_store.h" + +namespace OHOS { +namespace Contacts { +class ContactsUpdateHelper { +public: + ContactsUpdateHelper(); + ~ContactsUpdateHelper(); + int UpdateDisplay(std::vector rawContactIdVector, std::vector types, + std::shared_ptr rdbStore, OHOS::NativeRdb::ValuesBucket linkDataDataValues, + bool isDelete); + OHOS::NativeRdb::ValuesBucket GetUpdateDisPlayNameValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete); + OHOS::NativeRdb::ValuesBucket GetUpdateSearchNameValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete); + OHOS::NativeRdb::ValuesBucket GetUpdateCompanyValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete); + int UpdateName(OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete, int rawId, std::string type, + std::shared_ptr rdbStore); + void UpdateCallLogByPhoneNum( + std::vector &rawContactIdVector, std::shared_ptr &rdbStore, bool isDelete); + std::unique_ptr QueryDataForCallLog( + std::shared_ptr &rdbStore, int contactId); + void DataToUpdateCallLog( + bool isDelete, int contactId, std::unique_ptr &resultSet); + int UpdateCallLog( + std::string &phoneNumber, std::string &name, std::string &quickSearch, bool isDelete, bool isCallLog); + int UpdateCallLogNameNull(std::string &name, std::string &quickSearch, bool isCallLog); +}; +} // namespace Contacts +} // namespace OHOS + +#endif // CONTACT_UPDATE_HELPER_H diff --git a/dataBusiness/contacts/include/profile_database.h b/dataBusiness/contacts/include/profile_database.h new file mode 100644 index 0000000..78171e7 --- /dev/null +++ b/dataBusiness/contacts/include/profile_database.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef PROFILE_DATABASE_H +#define PROFILE_DATABASE_H + +#include + +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_store.h" +#include "result_set.h" + +namespace OHOS { +namespace Contacts { +class ProfileDatabase { +public: + static std::shared_ptr GetInstance(); + static std::shared_ptr store_; + int BeginTransaction(); + int Commit(); + int RollBack(); + static void DestroyInstanceAndRestore(std::string restorePath); + +private: + ProfileDatabase(); + static bool Restore(std::string restorePath); + ProfileDatabase(const ProfileDatabase &); + const ProfileDatabase &operator=(const ProfileDatabase &); + static std::shared_ptr profileDatabase_; +}; + +class SqliteOpenHelperProfileCallback : public OHOS::NativeRdb::RdbOpenCallback { +public: + int OnCreate(OHOS::NativeRdb::RdbStore &rdbStore) override; + int OnUpgrade(OHOS::NativeRdb::RdbStore &rdbStore, int oldVersion, int newVersion) override; + int OnDowngrade(OHOS::NativeRdb::RdbStore &rdbStore, int currentVersion, int targetVersion) override; +}; +} // namespace Contacts +} // namespace OHOS +#endif // PROFILE_DATABASE_H diff --git a/dataBusiness/contacts/include/raw_contacts.h b/dataBusiness/contacts/include/raw_contacts.h new file mode 100644 index 0000000..b3a834b --- /dev/null +++ b/dataBusiness/contacts/include/raw_contacts.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef RAW_CONTACT_H +#define RAW_CONTACT_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_store.h" + +namespace OHOS { +namespace Contacts { +class RawContacts { +public: + RawContacts(); + ~RawContacts(); + int InsertRawContact(std::shared_ptr rdbStore, int64_t &outRawContactId, + OHOS::NativeRdb::ValuesBucket rawContactValues); + int UpdateRawContact(std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket rawContactValues, std::string whereClause, std::vector whereArgs); + int UpdateRawContactById(int &rawContactId, std::string type, std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket rawContactValues); + int GetDeleteContactIdByAccountId(std::shared_ptr rdbStore, int accountId); + int GetDeleteRawContactIdByAccountId(std::shared_ptr rdbStore, int accountId); + int DeleteRawcontactByRawId(std::shared_ptr rdbStore, int needDeleteRawContactId); +}; +} // namespace Contacts +} // namespace OHOS +#endif // RAW_CONTACT_H diff --git a/dataBusiness/contacts/src/contacts.cpp b/dataBusiness/contacts/src/contacts.cpp new file mode 100644 index 0000000..1861214 --- /dev/null +++ b/dataBusiness/contacts/src/contacts.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 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 "contacts.h" + +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +Contacts::Contacts(void) +{ +} + +Contacts::~Contacts() +{ +} + +/** + * @brief Insert the raw_contact table at the same time as the contact table + * + * @param rdbStore Database operation object + * @param outRawContactId raw_conatct table id + * @param rawContactValues insert raw_contact values + * @param contactId contact_id address + * + * @return insert contact error or success code + */ +int Contacts::InsertContact(std::shared_ptr rdbStore, const int64_t &outRawContactId, + OHOS::NativeRdb::ValuesBucket rawContactValues, int64_t &contactId) +{ + OHOS::NativeRdb::ValuesBucket contactValues = StructureContactDataValueBucket(rawContactValues); + contactValues.PutInt(ContactColumns::NAME_RAW_CONTACT_ID, outRawContactId); + int rowContactRet = rdbStore->Insert(contactId, ContactTableName::CONTACT, contactValues); + return rowContactRet; +} + +int Contacts::UpdateContact(const int &rawContactId, std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket linkDataDataValues) +{ + std::string upWhereClause; + upWhereClause.append(ContactColumns::NAME_RAW_CONTACT_ID).append(" = ?"); + std::vector upWhereArgs; + upWhereArgs.push_back(std::to_string(rawContactId)); + int changedRows = OHOS::NativeRdb::E_OK; + int ret = rdbStore->Update(changedRows, ContactTableName::CONTACT, linkDataDataValues, upWhereClause, upWhereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateSearchContact fail:%{public}d", ret); + } + return ret; +} + +/** + * @brief Build conatct data + * + * @param rawContactValues insert contact values + * + * @return contact table values + */ +OHOS::NativeRdb::ValuesBucket Contacts::StructureContactDataValueBucket(OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + OHOS::NativeRdb::ValuesBucket contactValueBucket; + if (rawContactValues.HasColumn(RawContactColumns::PHOTO_FILE_ID)) { + int result = ContactValueBucketGetInt(rawContactValues, RawContactColumns::PHOTO_FILE_ID); + contactValueBucket.PutInt(ContactColumns::PHOTO_FILE_ID, result); + } + if (rawContactValues.HasColumn(RawContactColumns::READ_ONLY)) { + int result = ContactValueBucketGetInt(rawContactValues, RawContactColumns::READ_ONLY); + contactValueBucket.PutInt(ContactColumns::READ_ONLY, result); + } + if (rawContactValues.HasColumn(RawContactColumns::PHOTO_ID)) { + int result = ContactValueBucketGetInt(rawContactValues, RawContactColumns::PHOTO_ID); + contactValueBucket.PutInt(ContactColumns::PHOTO_ID, result); + } + if (rawContactValues.HasColumn(RawContactColumns::IS_TRANSFER_VOICEMAIL)) { + int result = ContactValueBucketGetInt(rawContactValues, RawContactColumns::IS_TRANSFER_VOICEMAIL); + contactValueBucket.PutInt(ContactColumns::IS_TRANSFER_VOICEMAIL, result); + } + if (rawContactValues.HasColumn(RawContactColumns::COMPANY)) { + std::string result = ContactValueBucketGetString(rawContactValues, RawContactColumns::COMPANY); + contactValueBucket.PutString(ContactColumns::COMPANY, result); + } + if (rawContactValues.HasColumn(RawContactColumns::POSITION)) { + std::string result = ContactValueBucketGetString(rawContactValues, RawContactColumns::POSITION); + contactValueBucket.PutString(ContactColumns::POSITION, result); + } + return contactValueBucket; +} + +int Contacts::ContactValueBucketGetInt(OHOS::NativeRdb::ValuesBucket rawContactValues, std::string columnName) +{ + int result = OHOS::NativeRdb::E_OK; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(columnName, value); + value.GetInt(result); + return result; +} + +std::string Contacts::ContactValueBucketGetString( + OHOS::NativeRdb::ValuesBucket rawContactValues, std::string columnName) +{ + std::string result; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(columnName, value); + value.GetString(result); + return result; +} + +int Contacts::DeleteContactById(std::shared_ptr rdbStore, int needDeleteContactId) +{ + std::shared_ptr &store = rdbStore; + if (store == nullptr) { + HILOG_ERROR("ContactsAccount DeletecontactById store is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (needDeleteContactId < ID_EMPTITY) { + HILOG_ERROR("ContactsAccount DeleteDataByRawId needDeleteContactId illegal"); + return OPERATION_ERROR; + } + int rowId = OHOS::NativeRdb::E_OK; + std::vector whereArgs; + whereArgs.push_back(std::to_string(needDeleteContactId)); + std::string whereCase; + whereCase.append(ContactColumns::ID).append(" = ?"); + int delContact = store->Delete(rowId, ContactTableName::CONTACT, whereCase, whereArgs); + return delContact; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/contacts_account.cpp b/dataBusiness/contacts/src/contacts_account.cpp new file mode 100644 index 0000000..7def65d --- /dev/null +++ b/dataBusiness/contacts/src/contacts_account.cpp @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2021 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 "contacts_account.h" + +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr ContactsAccount::instance_ = nullptr; + +std::shared_ptr ContactsAccount::GetInstance() +{ + if (instance_ == nullptr) { + instance_.reset(new ContactsAccount()); + } + return instance_; +} + +ContactsAccount::ContactsAccount(void) +{ +} + +ContactsAccount::~ContactsAccount() +{ +} + +/** + * @brief ContactsAccount insert database + * + * @param rdbStore Insert operation based on radStore + * @param accountName Pass in parameter accountName + * @param accountType Pass in parameter accountType + * + * @return Insert database results code + */ +int64_t ContactsAccount::Insert( + std::shared_ptr rdbStore, std::string accountName, std::string accountType) +{ + std::shared_ptr &store_ = rdbStore; + OHOS::NativeRdb::ValuesBucket values; + values.PutString(AccountColumns::ACCOUNT_NAME, accountName); + values.PutString(AccountColumns::ACCOUNT_TYPE, accountType); + int64_t outRowId = OHOS::NativeRdb::E_OK; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount insert store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->Insert(outRowId, ContactTableName::ACCOUNT, values); + HILOG_INFO(" ContactsAccount insert ret :%{public}d", ret); + return outRowId; +}; + +void ContactsAccount::PrepopulateCommonAccountTypes(std::shared_ptr rdbStore) +{ + int typeResult = LookupAccountTypeId(rdbStore, AccountData::ACCOUNT_NAME, AccountData::ACCOUNT_TYPE); + if (typeResult == RDB_EXECUTE_FAIL) { + Insert(rdbStore, AccountData::ACCOUNT_NAME, AccountData::ACCOUNT_TYPE); + } else { + HILOG_INFO("ContactsAccount account is exist"); + } +} + +int ContactsAccount::LookupAccountTypeId( + std::shared_ptr rdbStore, std::string accountName, std::string accountType) +{ + std::shared_ptr &store_ = rdbStore; + std::string sqlBuilder = "SELECT * FROM "; + sqlBuilder.append(ContactTableName::ACCOUNT) + .append(" WHERE ") + .append(AccountColumns::ACCOUNT_NAME) + .append(" = ") + .append("'") + .append(accountName) + .append("'") + .append(" AND ") + .append(AccountColumns::ACCOUNT_TYPE) + .append(" = ") + .append("'") + .append(accountType) + .append("'"); + std::vector selectionArgs; + std::unique_ptr resultSet = store_->QuerySql(sqlBuilder, selectionArgs); + int ret = resultSet->GoToFirstRow(); + if (ret != OHOS::NativeRdb::E_OK) { + resultSet->Close(); + return RDB_EXECUTE_FAIL; + } + int columnIndex = 0; + resultSet->GetColumnIndex(ContactPublicColumns::ID, columnIndex); + int accountId = 0; + resultSet->GetInt(columnIndex, accountId); + resultSet->Close(); + return accountId; +} + +std::vector ContactsAccount::GetAccountFromLoacl( + std::shared_ptr rdbStore) +{ + std::shared_ptr &store_ = rdbStore; + std::vector values; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount GetAccountFromLoacl store_ is nullptr"); + return values; + } + std::string buildQuery = ""; + buildQuery.append("select ") + .append(AccountColumns::ACCOUNT_NAME) + .append(",") + .append(AccountColumns::ACCOUNT_TYPE) + .append(",") + .append(AccountColumns::DATA_INFO) + .append(" from ") + .append(ContactTableName::ACCOUNT); + std::vector selectArgs; + std::unique_ptr result = store_->QuerySql(buildQuery, selectArgs); + int resultSetNum = result->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string accountName; + std::string accountType; + std::string accountCollection; + int accountNameIndex = 0; + int accountTypeIndex = 0; + int accountCollectionIndex = 0; + result->GetColumnIndex(AccountColumns::ACCOUNT_NAME, accountNameIndex); + result->GetColumnIndex(AccountColumns::ACCOUNT_TYPE, accountTypeIndex); + result->GetColumnIndex(AccountColumns::DATA_INFO, accountCollectionIndex); + result->GetString(accountNameIndex, accountName); + result->GetString(accountTypeIndex, accountType); + result->GetString(accountCollectionIndex, accountCollection); + AccountDataCollection collection = AccountDataCollection(accountName, accountType, accountCollection); + values.push_back(collection); + resultSetNum = result->GoToNextRow(); + } + result->Close(); + return values; +} + +int ContactsAccount::GetNotExistAccount( + std::shared_ptr rdbStore, AccountDataCollection collection) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount GetNotExistAccount store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (collection.GetcAccountName() != "" || collection.GetcAccountType() != "") { + std::vector selectArgs; + std::string buildSql = ""; + buildSql.append("select ") + .append(AccountColumns::ID) + .append(" from ") + .append(ContactTableName::ACCOUNT) + .append(" where ") + .append(AccountColumns::ACCOUNT_NAME) + .append(" = ? and ") + .append(AccountColumns::ACCOUNT_TYPE) + .append(" = ? and (") + .append(AccountColumns::DATA_INFO) + .append(" IS NULL or ") + .append(AccountColumns::DATA_INFO) + .append(" = ?)"); + selectArgs.push_back(collection.GetcAccountName()); + selectArgs.push_back(collection.GetcAccountType()); + selectArgs.push_back(collection.GetcDataCollection()); + std::unique_ptr result = store_->QuerySql(buildSql, selectArgs); + int resultSetNum = result->GoToFirstRow(); + int reValue = RDB_EXECUTE_FAIL; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int reValueIndex = 0; + result->GetColumnIndex(AccountColumns::ID, reValueIndex); + if (reValueIndex < 0) { + break; + } + result->GetInt(reValueIndex, reValue); + resultSetNum = result->GoToNextRow(); + break; + } + result->Close(); + return reValue; + } + return OPERATION_ERROR; +} + +int ContactsAccount::DeleteAccountByAccountId(std::shared_ptr rdbStore, int accountId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount DeleteAccountByAccountId store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (accountId < ID_EMPTITY) { + return OPERATION_ERROR; + } + int rowId = 0; + std::vector whereArgs; + whereArgs.push_back(std::to_string(accountId)); + std::string whereCase; + whereCase.append(AccountColumns::ID).append(" = ?"); + int delAccount = store_->Delete(rowId, ContactTableName::ACCOUNT, whereCase, whereArgs); + return delAccount; +} + +int ContactsAccount::DeleteDataByRawId(std::shared_ptr rdbStore, int needDeleteRawContactId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount DeleteDataByRawId store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (needDeleteRawContactId < ID_EMPTITY) { + return OPERATION_ERROR; + } + int rowId = 0; + std::vector whereArgs; + whereArgs.push_back(std::to_string(needDeleteRawContactId)); + std::string whereCase; + whereCase.append(ContactDataColumns::RAW_CONTACT_ID).append(" = ?"); + int delData = store_->Delete(rowId, ContactTableName::CONTACT_DATA, whereCase, whereArgs); + return delData; +} + +int ContactsAccount::DeleteGroupsByAccountId(std::shared_ptr rdbStore, int accountId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount DeleteGroupsByAccountId store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (accountId < ID_EMPTITY) { + return OPERATION_ERROR; + } + int rowId = 0; + std::vector whereArgs; + whereArgs.push_back(std::to_string(accountId)); + std::string whereCase; + whereCase.append(GroupsColumns::ACCOUNT_ID).append(" = ? "); + int delGroup = store_->Delete(rowId, ContactTableName::GROUPS, whereCase, whereArgs); + return delGroup; +} + +int ContactsAccount::StopForegin(std::shared_ptr rdbStore) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount StopForegin store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + return store_->ExecuteSql("PRAGMA foreign_keys = OFF"); +} + +int ContactsAccount::OpenForegin(std::shared_ptr rdbStore) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("ContactsAccount OpenForegin store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + return store_->ExecuteSql("PRAGMA foreign_keys = ON"); +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/contacts_data_ability.cpp b/dataBusiness/contacts/src/contacts_data_ability.cpp new file mode 100644 index 0000000..13bf2f6 --- /dev/null +++ b/dataBusiness/contacts/src/contacts_data_ability.cpp @@ -0,0 +1,608 @@ +/* + * Copyright (c) 2021 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 "contacts_data_ability.h" + +#include + +#include "common.h" +#include "contacts_columns.h" +#include "contacts_common_event.h" +#include "data_ability_predicates.h" +#include "database_disaster_recovery.h" +#include "file_utils.h" +#include "hilog_wrapper.h" +#include "profile_database.h" +#include "rdb_predicates.h" +#include "sql_analyzer.h" +#include "uri_utils.h" + +namespace OHOS { +namespace AppExecFwk { +REGISTER_AA(ContactsDataAbility); +namespace { +std::mutex g_mutex; +} +std::shared_ptr ContactsDataAbility::contactDataBase_ = nullptr; +std::shared_ptr ContactsDataAbility::profileDataBase_ = nullptr; +std::map ContactsDataAbility::uriValueMap_ = { + {"/com.ohos.contactsdataability/contacts/contact", Contacts::CONTACTS_CONTACT}, + {"/com.ohos.contactsdataability/contacts/deleted_raw_contact", Contacts::CONTACTS_DELETE}, + {"/com.ohos.contactsdataability/contacts/deleted_raw_contact_record", Contacts::CONTACTS_DELETE_RECORD}, + {"/com.ohos.contactsdataability/contacts/raw_contact", Contacts::CONTACTS_RAW_CONTACT}, + {"/com.ohos.contactsdataability/contacts/account", Contacts::ACCOUNT}, + {"/com.ohos.contactsdataability/contacts/raw_contact/query_merge_list", Contacts::QUERY_MERGE_LIST}, + {"/com.ohos.contactsdataability/contacts/raw_contact/split_contact", Contacts::SPLIT_CONTACT}, + {"/com.ohos.contactsdataability/contacts/raw_contact/manual_merge", Contacts::MANUAL_MERGE}, + {"/com.ohos.contactsdataability/contacts/raw_contact/auto_merge", Contacts::AUTO_MERGE}, + {"/com.ohos.contactsdataability/contacts/contact_data", Contacts::CONTACTS_CONTACT_DATA}, + {"/com.ohos.contactsdataability/contacts/contact_type", Contacts::CONTACT_TYPE}, + {"/com.ohos.contactsdataability/contacts/groups", Contacts::CONTACTS_GROUPS}, + {"/com.ohos.contactsdataability/contacts/contact_blocklist", Contacts::CONTACTS_BLOCKLIST}, + {"/com.ohos.contactsdataability/contacts/photo_files", Contacts::CONTACTS_PHOTO_FILES}, + {"/com.ohos.contactsdataability/contacts/search_contact", Contacts::CONTACTS_SEARCH_CONTACT}, + {"/com.ohos.contactsdataability/contacts/backup", Contacts::CONTACT_BACKUP}, + {"/com.ohos.contactsdataability/profile/backup", Contacts::PROFILE_BACKUP}, + {"/com.ohos.contactsdataability/contacts/recover", Contacts::CONTACT_RECOVER}, + {"/com.ohos.contactsdataability/profile/recover", Contacts::PROFILE_RECOVER}, + {"/com.ohos.contactsdataability/profile/contact", Contacts::PROFILE_CONTACT}, + {"/com.ohos.contactsdataability/profile/raw_contact", Contacts::PROFILE_RAW_CONTACT}, + {"/com.ohos.contactsdataability/profile/contact_data", Contacts::PROFILE_CONTACT_DATA}, + {"/com.ohos.contactsdataability/profile/groups", Contacts::PROFILE_GROUPS}, + {"/com.ohos.contactsdataability/profile/contact_blocklist", Contacts::PROFILE_BLOCKLIST}, + {"/com.ohos.contactsdataability/profile/photo_files", Contacts::PROFILE_PHOTO_FILES}, + {"/com.ohos.contactsdataability/profile/search_contact", Contacts::PROFILE_SEARCH_CONTACT}, + {"/com.ohos.contactsdataability/profile/deleted_raw_contact_record", Contacts::PROFILE_DELETE_RECORD}, + {"/com.ohos.contactsdataability/profile/deleted_raw_contact", Contacts::PROFILE_DELETE}, + {"/com.ohos.contactsdataability/profile/contact_type", Contacts::PROFILE_TYPE} +}; + +ContactsDataAbility::ContactsDataAbility(void) +{ +} + +ContactsDataAbility::~ContactsDataAbility() +{ +} + +void ContactsDataAbility::OnStart(const Want &want) +{ + Ability::OnStart(want); + std::string basePath = GetDatabaseDir(); + Contacts::ContactsPath::RDB_PATH = basePath + "/"; + Contacts::ContactsPath::RDB_BACKUP_PATH = basePath + "/backup/"; + Contacts::ContactsPath::DUMP_PATH = GetFilesDir() + "/"; +} + +void ContactsDataAbility::Dump(const std::string &extra) +{ + Contacts::FileUtils fileUtils; + std::string dirStr = Contacts::ContactsPath::DUMP_PATH; + fileUtils.WriteStringToFileAppend(dirStr, extra); +} + +/** + * @brief ContactsDataAbility BeginTransaction emptiness problems + * + * @param code the return number of BeginTransaction + * @param mutex transmission parameter : lock + * + * @return BeginTransaction emptiness true or false + */ +bool ContactsDataAbility::IsBeginTransactionOK(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsBeginTransactionOK fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief ContactsDataAbility Commit emptiness problems + * + * @param code the return number of Commit + * @param mutex transmission parameter : lock + * + * @return Commit emptiness true or false + */ +bool ContactsDataAbility::IsCommitOK(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsCommitOK fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief ContactsDataAbility insert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data value of the database + * + * @return Insert database results code + */ +int ContactsDataAbility::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) +{ + HILOG_INFO("Insert start"); + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("ContactsDataAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + int resultId = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int code = UriParseAndSwitch(uriTemp); + int ret = contactDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + resultId = InsertExecute(code, value); + HILOG_INFO("Insert id = %{public}d", resultId); + if (resultId == Contacts::OPERATION_ERROR) { + contactDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::OPERATION_ERROR; + } + ret = contactDataBase_->Commit(); + if (!IsCommitOK(ret, g_mutex)) { + contactDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + HILOG_INFO("Insert end"); + return resultId; +} + +int ContactsDataAbility::InsertExecute(int &code, const NativeRdb::ValuesBucket &value) +{ + int rowId = Contacts::RDB_EXECUTE_FAIL; + switch (code) { + case Contacts::CONTACTS_RAW_CONTACT: + case Contacts::PROFILE_RAW_CONTACT: + // contact Basic Information + rowId = contactDataBase_->InsertRawContact(Contacts::ContactTableName::RAW_CONTACT, value); + break; + case Contacts::CONTACTS_CONTACT_DATA: + case Contacts::PROFILE_CONTACT_DATA: + // contact Information add + rowId = contactDataBase_->InsertContactData(Contacts::ContactTableName::CONTACT_DATA, value); + break; + case Contacts::CONTACTS_GROUPS: + case Contacts::PROFILE_GROUPS: + // insert group + rowId = contactDataBase_->InsertGroup(Contacts::ContactTableName::GROUPS, value); + break; + case Contacts::CONTACTS_BLOCKLIST: + case Contacts::PROFILE_BLOCKLIST: + // add blocklist + rowId = contactDataBase_->InsertBlockList(Contacts::ContactTableName::CONTACT_BLOCKLIST, value); + break; + default: + rowId = Contacts::OPERATION_ERROR; + HILOG_INFO("ContactsDataAbility ====>no match uri action"); + break; + } + return rowId; +} + +/** + * @brief ContactsDataAbility BatchInsert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data values of the database + * + * @return BatchInsert database results code + */ +int ContactsDataAbility::BatchInsert(const Uri &uri, const std::vector &values) +{ + int size = values.size(); + if (size <= 0) { + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + OHOS::Uri uriTemp = uri; + int code = UriParseAndSwitch(uriTemp); + int ret = contactDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + int count = 0; + for (int i = 0; i < size; i++) { + ++count; + OHOS::NativeRdb::ValuesBucket rawContactValues = values[i]; + int rowRet = InsertExecute(code, rawContactValues); + if (rowRet == Contacts::OPERATION_ERROR) { + contactDataBase_->RollBack(); + g_mutex.unlock(); + return rowRet; + } + if (count % Contacts::BATCH_INSERT_COUNT == 0) { + int markRet = contactDataBase_->Commit(); + int beginRet = contactDataBase_->BeginTransaction(); + if (!IsCommitOK(markRet, g_mutex) || !IsBeginTransactionOK(beginRet, g_mutex)) { + contactDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + } + } + int markRet = contactDataBase_->Commit(); + if (!IsCommitOK(markRet, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + g_mutex.unlock(); + return Contacts::OPERATION_OK; +} + +/** + * @brief ContactsDataAbility Update database + * + * @param uri Determine the data table name based on the URI + * @param predicates Update the data value of the condition + * + * @return Update database results code + */ +int ContactsDataAbility::Update( + const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates) +{ + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("ContactsDataAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + int retCode = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int code = UriParseAndSwitch(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + UpdateExecute(retCode, code, value, dataAbilityPredicates); + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_UPDATE, uri); + return retCode; +} + +void ContactsDataAbility::UpdateExecute(int &retCode, int code, const NativeRdb::ValuesBucket &value, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates) +{ + Contacts::PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (code) { + case Contacts::CONTACTS_CONTACT: + case Contacts::PROFILE_CONTACT: + break; + case Contacts::CONTACTS_RAW_CONTACT: + case Contacts::PROFILE_RAW_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::RAW_CONTACT, dataAbilityPredicates); + retCode = contactDataBase_->UpdateRawContact(value, rdbPredicates); + break; + case Contacts::CONTACTS_CONTACT_DATA: + case Contacts::PROFILE_CONTACT_DATA: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::CONTACT_DATA, dataAbilityPredicates); + retCode = contactDataBase_->UpdateContactData(value, rdbPredicates); + break; + case Contacts::CONTACTS_GROUPS: + case Contacts::PROFILE_GROUPS: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::GROUPS, dataAbilityPredicates); + retCode = contactDataBase_->UpdateGroup(value, rdbPredicates); + break; + case Contacts::CONTACTS_BLOCKLIST: + case Contacts::PROFILE_BLOCKLIST: + rdbPredicates = predicatesConvert.ConvertPredicates( + Contacts::ContactTableName::CONTACT_BLOCKLIST, dataAbilityPredicates); + retCode = contactDataBase_->UpdateBlockList(value, rdbPredicates); + break; + default: + SwitchUpdate(retCode, code, value, dataAbilityPredicates); + break; + } +} + +void ContactsDataAbility::SwitchUpdate(int &retCode, int &code, const NativeRdb::ValuesBucket &value, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates) +{ + Contacts::PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (code) { + case Contacts::SPLIT_CONTACT: + retCode = contactDataBase_->Split(dataAbilityPredicates); + break; + case Contacts::MANUAL_MERGE: + retCode = contactDataBase_->ReContactMerge(dataAbilityPredicates); + break; + case Contacts::AUTO_MERGE: + retCode = contactDataBase_->ContactMerge(); + break; + case Contacts::CONTACT_BACKUP: + case Contacts::PROFILE_BACKUP: + retCode = BackUp(); + break; + case Contacts::CONTACT_RECOVER: + case Contacts::PROFILE_RECOVER: + retCode = Recover(code); + break; + default: + retCode = Contacts::RDB_EXECUTE_FAIL; + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + break; + } +} + +/** + * @brief ContactsDataAbility Delete database + * + * @param uri Determine the data table name based on the URI + * @param predicates Delete the data values of the condition + * + * @return Delete database results code + */ +int ContactsDataAbility::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) +{ + HILOG_INFO("ContactsDataAbility ====>Delete"); + g_mutex.lock(); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + int retCode = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int code = UriParseAndSwitch(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + DeleteExecute(retCode, code, dataAbilityPredicates); + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_DELETE, uri); + return retCode; +} + +void ContactsDataAbility::DeleteExecute( + int &retCode, int code, OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates) +{ + Contacts::PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (code) { + case Contacts::CONTACTS_CONTACT: + case Contacts::PROFILE_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::CONTACT, dataAbilityPredicates); + retCode = contactDataBase_->DeleteContact(rdbPredicates); + break; + case Contacts::CONTACTS_RAW_CONTACT: + case Contacts::PROFILE_RAW_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::RAW_CONTACT, dataAbilityPredicates); + retCode = contactDataBase_->DeleteRawContact(rdbPredicates); + break; + case Contacts::CONTACTS_CONTACT_DATA: + case Contacts::PROFILE_CONTACT_DATA: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::CONTACT_DATA, dataAbilityPredicates); + retCode = contactDataBase_->DeleteContactData(rdbPredicates); + break; + case Contacts::CONTACTS_GROUPS: + case Contacts::PROFILE_GROUPS: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::GROUPS, dataAbilityPredicates); + retCode = contactDataBase_->DeleteGroup(rdbPredicates); + break; + case Contacts::CONTACTS_BLOCKLIST: + case Contacts::PROFILE_BLOCKLIST: + rdbPredicates = predicatesConvert.ConvertPredicates( + Contacts::ContactTableName::CONTACT_BLOCKLIST, dataAbilityPredicates); + retCode = contactDataBase_->DeleteBlockList(rdbPredicates); + break; + case Contacts::CONTACTS_DELETE: + case Contacts::PROFILE_DELETE: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_DELETED, dataAbilityPredicates); + retCode = contactDataBase_->CompletelyDelete(rdbPredicates); + break; + case Contacts::CONTACTS_DELETE_RECORD: + case Contacts::PROFILE_DELETE_RECORD: + rdbPredicates = predicatesConvert.ConvertPredicates( + Contacts::ContactTableName::DELETE_RAW_CONTACT, dataAbilityPredicates); + retCode = contactDataBase_->DeleteRecord(rdbPredicates); + break; + default: + retCode = Contacts::OPERATION_ERROR; + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + break; + } +} + +/** + * @brief ContactsDataAbility query database + * + * @param uri Determine the data table name based on the URI + * @param columns Conditions for query operation + * @param predicates Query the data values of the condition + * + * @return Query database results + */ +std::shared_ptr ContactsDataAbility::Query( + const Uri &uri, const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) +{ + HILOG_INFO("ContactsDataAbility ====>Query start"); + g_mutex.lock(); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + std::shared_ptr result; + OHOS::Uri uriTemp = uri; + int parseCode = UriParseAndSwitch(uriTemp); + std::vector columnsTemp = columns; + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + QueryExecute(result, dataAbilityPredicates, columnsTemp, parseCode); + std::shared_ptr sharedPtrResult = std::move(result); + g_mutex.unlock(); + HILOG_INFO("ContactsDataAbility ====>Query end"); + return sharedPtrResult; +} + +void ContactsDataAbility::QueryExecute(std::shared_ptr &result, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates, std::vector &columnsTemp, + int &parseCode) +{ + Contacts::PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (parseCode) { + case Contacts::CONTACTS_CONTACT: + case Contacts::PROFILE_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_CONTACT, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::CONTACTS_RAW_CONTACT: + case Contacts::PROFILE_RAW_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_RAW_CONTACT, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::CONTACTS_CONTACT_DATA: + case Contacts::PROFILE_CONTACT_DATA: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_CONTACT_DATA, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::CONTACTS_GROUPS: + case Contacts::PROFILE_GROUPS: + rdbPredicates = predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_GROUPS, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + default: + QueryExecuteSwitchSplit(result, dataAbilityPredicates, columnsTemp, parseCode); + break; + } +} + +void ContactsDataAbility::QueryExecuteSwitchSplit(std::shared_ptr &result, + OHOS::NativeRdb::DataAbilityPredicates &dataAbilityPredicates, std::vector &columnsTemp, + int &parseCode) +{ + Contacts::PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (parseCode) { + case Contacts::CONTACTS_BLOCKLIST: + case Contacts::PROFILE_BLOCKLIST: + rdbPredicates = predicatesConvert.ConvertPredicates( + Contacts::ContactTableName::CONTACT_BLOCKLIST, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::CONTACTS_DELETE: + case Contacts::PROFILE_DELETE: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::VIEW_DELETED, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::CONTACTS_SEARCH_CONTACT: + case Contacts::PROFILE_SEARCH_CONTACT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ViewName::SEARCH_CONTACT_VIEW, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::QUERY_MERGE_LIST: + result = contactDataBase_->SelectCandidate(); + break; + case Contacts::CONTACT_TYPE: + case Contacts::PROFILE_TYPE: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::CONTACT_TYPE, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::ACCOUNT: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::ContactTableName::ACCOUNT, dataAbilityPredicates); + result = contactDataBase_->Query(rdbPredicates, columnsTemp); + break; + default: + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + break; + } +} + +int ContactsDataAbility::UriParseAndSwitch(Uri &uri) +{ + Contacts::UriUtils uriUtils; + int parseCode = uriUtils.UriParse(uri, uriValueMap_); + if (parseCode != Contacts::OPERATION_ERROR) { + SwitchProfile(uri); + } + return parseCode; +} + +void ContactsDataAbility::SwitchProfile(Uri &uri) +{ + std::vector pathVector; + uri.GetPathSegments(pathVector); + if (pathVector.size() > 1 && pathVector[1].find("profile") == std::string::npos) { + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + contactDataBase_->store_ = contactDataBase_->contactStore_; + } else { + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + contactDataBase_->store_ = profileDataBase_->store_; + } +} + +int ContactsDataAbility::BackUp() +{ + int retCode = Contacts::RDB_EXECUTE_FAIL; + std::shared_ptr instance = + OHOS::Contacts::DataBaseDisasterRecovery::GetInstance(); + retCode = instance->SQLliteCheckDb(); + if (retCode == 0) { + retCode = instance->BackDatabase(); + } + return retCode; +} + +int ContactsDataAbility::Recover(int &code) +{ + std::string name = Contacts::PROFILE_DATABASE_NAME; + if (code == Contacts::CONTACT_RECOVER) { + name = Contacts::CONTACT_DATABASE_NAME; + } + std::shared_ptr instance = + OHOS::Contacts::DataBaseDisasterRecovery::GetInstance(); + int retCode = instance->RecoveryDatabase(name); + contactDataBase_ = Contacts::ContactsDataBase::GetInstance(); + profileDataBase_ = Contacts::ProfileDatabase::GetInstance(); + return retCode; +} + +void ContactsDataAbility::DataBaseNotifyChange(int code, Uri uri) +{ + Contacts::ContactsCommonEvent::SendContactChange(code); +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/contacts_database.cpp b/dataBusiness/contacts/src/contacts_database.cpp new file mode 100644 index 0000000..95ce445 --- /dev/null +++ b/dataBusiness/contacts/src/contacts_database.cpp @@ -0,0 +1,1310 @@ +/* + * Copyright (c) 2021 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 "contacts_database.h" + +#include +#include +#include +#include + +#include "account_manager.h" +#include "async_task.h" +#include "common.h" +#include "contacts.h" +#include "contacts_account.h" +#include "contacts_columns.h" +#include "contacts_json_utils.h" +#include "contacts_search.h" +#include "contacts_type.h" +#include "contacts_update_helper.h" +#include "database_disaster_recovery.h" +#include "hilog_wrapper.h" +#include "match_candidate.h" +#include "merger_contacts.h" +#include "predicates_convert.h" +#include "raw_contacts.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr ContactsDataBase::contactDataBase_ = nullptr; +std::shared_ptr ContactsDataBase::callLogDataBase_ = nullptr; +std::shared_ptr ContactsDataBase::store_ = nullptr; +std::shared_ptr ContactsDataBase::contactStore_ = nullptr; +static AsyncTaskQueue *ASYNC_TASK_QUEUE; +static std::string g_databaseName; +namespace { +std::mutex mtx_; +} + +ContactsDataBase::ContactsDataBase() +{ + g_databaseName = ContactsPath::RDB_PATH + "contacts.db"; + HILOG_INFO("ContactsDataBase g_databaseName :%{public}s", g_databaseName.c_str()); + int errCode = OHOS::NativeRdb::E_OK; + OHOS::NativeRdb::RdbStoreConfig config(g_databaseName); + SqliteOpenHelperContactCallback sqliteOpenHelperCallback; + contactStore_ = + OHOS::NativeRdb::RdbHelper::GetRdbStore(config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode); + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsDataBase :%{public}d", errCode); + if (REBASE_SETTING == 0) { + std::shared_ptr instance = + OHOS::Contacts::DataBaseDisasterRecovery::GetInstance(); + instance->RecoveryDatabase(CONTACT_DATABASE_NAME); + contactStore_ = OHOS::NativeRdb::RdbHelper::GetRdbStore( + config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode); + } + } + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsDataBase rebase open error :%{public}d", errCode); + return; + } + store_ = contactStore_; + std::shared_ptr contactsAccount = ContactsAccount::GetInstance(); + contactsAccount->PrepopulateCommonAccountTypes(store_); + ContactsType contactsType; + contactsType.PrepopulateCommonTypes(store_); + callLogDataBase_ = CallLogDataBase::GetInstance(); + ASYNC_TASK_QUEUE = AsyncTaskQueue::Instance(); +} + +ContactsDataBase::ContactsDataBase(const ContactsDataBase &) +{ +} + +std::shared_ptr ContactsDataBase::GetInstance() +{ + if (contactDataBase_ == nullptr) { + contactDataBase_.reset(new ContactsDataBase()); + } + return contactDataBase_; +} + +int ContactsDataBase::BeginTransaction() +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase BeginTransaction store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsDataBase BeginTransaction fail :%{public}d", ret); + } + return ret; +} + +int ContactsDataBase::Commit() +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase Commit store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->Commit(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsDataBase Commit fail :%{public}d", ret); + } + return ret; +} + +int ContactsDataBase::RollBack() +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase RollBack store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->RollBack(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsDataBase RollBack fail :%{public}d", ret); + } + return ret; +} + +/** + * @brief ContactsDataBase insert data into table raw_contact + * + * @param table Insert tableName + * @param rawContactValues Parameters to be passed for insert operation + * + * @return The result returned by the insert operation + */ +int64_t ContactsDataBase::InsertRawContact(std::string table, OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase InsertRawContact store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + // Get default account + AccountManager accountManager; + int accountId = accountManager.GetAccount(); + rawContactValues.PutInt(RawContactColumns::ACCOUNT_ID, accountId); + RawContacts rawContacts; + int64_t outRawContactId = 0; + int rowRet = rawContacts.InsertRawContact(store_, outRawContactId, rawContactValues); + if (rowRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertRawContact insertRawContact fail:%{public}d", rowRet); + return RDB_EXECUTE_FAIL; + } + Contacts contactsContact; + int64_t contactId = 0; + int rowContactRet = contactsContact.InsertContact(store_, outRawContactId, rawContactValues, contactId); + if (rowContactRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertRawContact insertContact fail:%{public}d", rowContactRet); + return RDB_EXECUTE_FAIL; + } + // update contactId to rawContacts + OHOS::NativeRdb::ValuesBucket upRawContactValues; + std::string contactIdKey = RawContactColumns::CONTACT_ID; + upRawContactValues.PutInt(contactIdKey, contactId); + std::string upWhereClause; + upWhereClause.append(ContactPublicColumns::ID).append(" = ?"); + std::vector upWhereArgs; + upWhereArgs.push_back(std::to_string(outRawContactId)); + int ret = rawContacts.UpdateRawContact(store_, upRawContactValues, upWhereClause, upWhereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("insertRawContact Update contactId to rawContacts fail:%{public}d", rowContactRet); + return RDB_EXECUTE_FAIL; + } + // insert search + ContactsSearch contactsSearch; + int64_t searchContactId = 0; + int rowSearchContactRet = + contactsSearch.Insert(store_, contactId, outRawContactId, rawContactValues, searchContactId); + if (rowSearchContactRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertRawContact insertSearchContact fail:%{public}d", rowSearchContactRet); + return RDB_EXECUTE_FAIL; + } + return outRawContactId; +} + +void ContactsDataBase::GetContactByValue(int &contactValue, OHOS::NativeRdb::ValueObject &value) +{ + if (value.GetType() == OHOS::NativeRdb::ValueObjectType::TYPE_NULL) { + HILOG_ERROR("GetContactByValue value is nullptr"); + contactValue = 0; + return; + } + if (value.GetType() == OHOS::NativeRdb::ValueObjectType::TYPE_INT) { + value.GetInt(contactValue); + return; + } + if (value.GetType() == OHOS::NativeRdb::ValueObjectType::TYPE_DOUBLE) { + double temp = 0; + value.GetDouble(temp); + contactValue = ceil(temp); + return; + } + if (value.GetType() == OHOS::NativeRdb::ValueObjectType::TYPE_STRING) { + std::string tempString; + value.GetString(tempString); + contactValue = std::stoi(tempString); + return; + } + contactValue = 0; +} + +/** + * @brief ContactsDataBase insert data into table contact_data + * + * @param table Insert tableName + * @param contactDataValues Parameters to be passed for insert operation + * + * @return The result returned by the insert operation + */ +int64_t ContactsDataBase::InsertContactData(std::string table, OHOS::NativeRdb::ValuesBucket contactDataValues) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase InsertContactData store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int rawContactId = OHOS::NativeRdb::E_OK; + if (!contactDataValues.HasColumn(ContactDataColumns::RAW_CONTACT_ID)) { + HILOG_ERROR("InsertContactData raw_contact_id is required"); + return RDB_EXECUTE_FAIL; + } + OHOS::NativeRdb::ValueObject value; + contactDataValues.GetObject(ContactDataColumns::RAW_CONTACT_ID, value); + GetContactByValue(rawContactId, value); + if (rawContactId <= 0) { + HILOG_ERROR("InsertContactData raw_contact_id is required %{public}d", rawContactId); + return RDB_EXECUTE_FAIL; + } + int typeId = RDB_EXECUTE_FAIL; + std::string typeText; + int retCode = GetTypeText(contactDataValues, typeId, rawContactId, typeText); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertContactData getTypeText fail:%{public}d", retCode); + return retCode; + } + if (typeId <= 0) { + HILOG_ERROR("InsertContactData typeId is required %{public}d", typeId); + return RDB_EXECUTE_FAIL; + } + // delete content_type + contactDataValues.Delete(ContentTypeColumns::CONTENT_TYPE); + contactDataValues.PutInt(ContactDataColumns::TYPE_ID, typeId); + int64_t outDataRowId; + int ret = store_->Insert(outDataRowId, table, contactDataValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertContactData fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + std::vector rawContactIdVector; + rawContactIdVector.push_back(rawContactId); + std::vector typeTextVector; + typeTextVector.push_back(typeText); + ContactsUpdateHelper contactsUpdateHelper; + int updateDisplayRet = + contactsUpdateHelper.UpdateDisplay(rawContactIdVector, typeTextVector, store_, contactDataValues, false); + if (updateDisplayRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertContactData UpdateDisplay fail:%{public}d", updateDisplayRet); + return RDB_EXECUTE_FAIL; + } + MergeUpdateTask(store_, rawContactIdVector, false); + return outDataRowId; +} + +int ContactsDataBase::GetTypeText( + OHOS::NativeRdb::ValuesBucket &contactDataValues, int &typeId, int &rawContactId, std::string &typeText) +{ + // if content_type is added , by content_type get type_id + if (contactDataValues.HasColumn(ContentTypeColumns::CONTENT_TYPE)) { + OHOS::NativeRdb::ValueObject typeValue; + contactDataValues.GetObject(ContentTypeColumns::CONTENT_TYPE, typeValue); + typeValue.GetString(typeText); + if (typeText.empty()) { + HILOG_ERROR("GetTypeText type is required"); + return PARAMETER_EMPTY; + } + // get type id + ContactsType contactsType; + typeId = contactsType.LookupTypeId(store_, typeText); + if (typeId == RDB_EXECUTE_FAIL) { + // not find type insert auto type + typeId = contactsType.Insert(store_, typeText, RDB_OBJECT_EMPTY); + } + if (typeId == RDB_EXECUTE_FAIL) { + return RDB_EXECUTE_FAIL; + } + return RDB_EXECUTE_OK; + } else if (contactDataValues.HasColumn(ContactDataColumns::TYPE_ID)) { + OHOS::NativeRdb::ValueObject typeValue; + contactDataValues.GetObject(ContactDataColumns::TYPE_ID, typeValue); + GetContactByValue(typeId, typeValue); + ContactsType contactsType; + typeText = contactsType.GetTypeText(store_, typeId); + return RDB_EXECUTE_OK; + } + return RDB_EXECUTE_FAIL; +} + +/** + * @brief ContactsDataBase insert data into table groups + * + * @param table Insert tableName + * @param initialValues Parameters to be passed for insert operation + * + * @return The result returned by the insert operation + */ +int64_t ContactsDataBase::InsertGroup(std::string table, OHOS::NativeRdb::ValuesBucket initialValues) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase InsertGroup store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + AccountManager accountManager; + // get default account + int accountId = accountManager.GetAccount(); + initialValues.PutInt(GroupsColumns::ACCOUNT_ID, accountId); + int64_t outGroupRowId = OHOS::NativeRdb::E_OK; + int ret = store_->Insert(outGroupRowId, table, initialValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("InsertGroup fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return outGroupRowId; +} + +/** + * @brief ContactsDataBase insert data into table contact_blocklist + * + * @param table Insert tableName + * @param initialValues Parameters to be passed for insert operation + * + * @return The result returned by the insert operation + */ +int64_t ContactsDataBase::InsertBlockList(std::string table, OHOS::NativeRdb::ValuesBucket initialValues) +{ + int64_t outRowId = OHOS::NativeRdb::E_OK; + int ret = store_->Insert(outRowId, table, initialValues); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + return outRowId; +} + +/** + * @brief ContactsDataBase update data into table contact_data + * + * @param contactDataValues Parameters to be passed for update operation + * @param rdbPredicates Conditions for update operation + * + * @return The result returned by the update operation + */ +int ContactsDataBase::UpdateContactData( + OHOS::NativeRdb::ValuesBucket contactDataValues, OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase UpdateContactData store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + std::vector types; + std::vector rawContactIdVector = QueryContactDataRawContactId(rdbPredicates, types); + int changedRows = OHOS::NativeRdb::E_OK; + ret = store_->Update(changedRows, contactDataValues, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + RollBack(); + HILOG_ERROR("UpdateContactData fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + ContactsUpdateHelper contactsUpdateHelper; + ret = contactsUpdateHelper.UpdateDisplay(rawContactIdVector, types, store_, contactDataValues, false); + if (ret != OHOS::NativeRdb::E_OK) { + RollBack(); + HILOG_ERROR("UpdateContactData UpdateDisplay fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + ret = Commit(); + if (ret != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + MergeUpdateTask(store_, rawContactIdVector, false); + return ret; +} + +/** + * @brief ContactsDataBase update data into table raw_contact + * + * @param values Parameters to be passed for update operation + * @param rdbPredicates Conditions for update operation + * + * @return The result returned by the update operation + */ +int ContactsDataBase::UpdateRawContact( + OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase UpdateRawContact store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + std::vector columns; + columns.push_back(ContactPublicColumns::ID); + std::unique_ptr rawContactResultSet = store_->Query(rdbPredicates, columns); + int rawContactResultSetNum = rawContactResultSet->GoToFirstRow(); + std::vector rawContactIdVector; + while (rawContactResultSetNum == OHOS::NativeRdb::E_OK) { + std::string columnName = ContactPublicColumns::ID; + int columnIndex = 0; + int rawContactId = 0; + rawContactResultSet->GetColumnIndex(columnName, columnIndex); + rawContactResultSet->GetInt(columnIndex, rawContactId); + rawContactIdVector.push_back(rawContactId); + rawContactResultSetNum = rawContactResultSet->GoToNextRow(); + } + rawContactResultSet->Close(); + int changedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Update(changedRows, values, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("UpdateRawContact fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + // add Restore contact judgment + int isDelete = RDB_EXECUTE_FAIL; + if (values.HasColumn(RawContactColumns::IS_DELETED)) { + OHOS::NativeRdb::ValueObject value; + values.GetObject(RawContactColumns::IS_DELETED, value); + GetContactByValue(isDelete, value); + if (isDelete == 0 && rawContactIdVector.size() > 0) { + ContactsUpdateHelper contactsUpdateHelper; + contactsUpdateHelper.UpdateCallLogByPhoneNum(rawContactIdVector, store_, false); + } + } + return ret; +} + +/** + * @brief ContactsDataBase update data into table contact_blocklist + * + * @param values Parameters to be passed for update operation + * @param rdbPredicates Conditions for update operation + * + * @return The result returned by the update operation + */ +int ContactsDataBase::UpdateBlockList( + OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase UpdateBlockList store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int changedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Update(changedRows, values, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("UpdateBlockList fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + HILOG_INFO("UpdateBlockList row:%{public}d", changedRows); + return ret; +} + +/** + * @brief ContactsDataBase update data into table groups + * + * @param values Parameters to be passed for update operation + * @param rdbPredicates Conditions for update operation + * + * @return The result returned by the update operation + */ +int ContactsDataBase::UpdateGroup(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase UpdateGroup store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int changedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Update(changedRows, values, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("UpdateGroup fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + HILOG_INFO("UpdateGroup row:%{public}d", changedRows); + return ret; +} + +/** + * @brief ContactsDataBase delete data from table contact_blocklist + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::DeleteBlockList(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteBlockList store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int changedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Delete(changedRows, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteBlockList fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + HILOG_INFO("DeleteBlockList row:%{public}d", changedRows); + return ret; +} + +/** + * @brief ContactsDataBase delete data from table groups + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::DeleteGroup(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteGroup store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int deletedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Delete(deletedRows, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteGroup fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + HILOG_INFO("DeleteGroup row:%{public}d", deletedRows); + return ret; +} + +int ContactsDataBase::DeleteRecord(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteRecord store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int deletedRows = OHOS::NativeRdb::E_OK; + int ret = store_->Delete(deletedRows, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteRecord raw_contact_deleted fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + HILOG_INFO("DeleteRecord raw_contact_deleted row:%{public}d", deletedRows); + return ret; +} + +/** + * @brief ContactsDataBase delete data from table contact_data + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::DeleteContactData(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteContactData store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + std::vector types; + std::vector rawContactIdVector = QueryContactDataRawContactId(rdbPredicates, types); + int deletedRows = OHOS::NativeRdb::E_OK; + ret = store_->Delete(deletedRows, rdbPredicates); + ContactsUpdateHelper contactsUpdateHelper; + OHOS::NativeRdb::ValuesBucket contactDataValues; + int updateDisplayRet = + contactsUpdateHelper.UpdateDisplay(rawContactIdVector, types, store_, contactDataValues, true); + if (updateDisplayRet != OHOS::NativeRdb::E_OK) { + RollBack(); + HILOG_ERROR("deleteContactData UpdateDisplay fail:%{public}d", updateDisplayRet); + return RDB_EXECUTE_FAIL; + } + ret = Commit(); + if (ret != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + MergeUpdateTask(store_, rawContactIdVector, true); + return ret; +} + +/** + * @brief ContactsDataBase delete data from table contact + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::DeleteContact(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteContact store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + std::vector queryValuesBucket = DeleteContactQuery(rdbPredicates); + int deleteRet = DeleteExecute(queryValuesBucket); + if (deleteRet != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + deleteRet = Commit(); + if (deleteRet != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + DeletedAsyncTask(store_, queryValuesBucket); + return deleteRet; +} + +void ContactsDataBase::DeletedAsyncTask( + std::shared_ptr &store, std::vector &queryValuesBucket) +{ + ASYNC_TASK_QUEUE->Push(new AsyncDeleteContactsTask(store_, queryValuesBucket)); + ASYNC_TASK_QUEUE->Start(); +} + +int ContactsDataBase::DeleteExecute(std::vector &queryValuesBucket) +{ + int size = queryValuesBucket.size(); + if (size == 0) { + return RDB_EXECUTE_FAIL; + } + int ret = RDB_EXECUTE_FAIL; + for (int i = 0; i < size; i++) { + OHOS::NativeRdb::ValuesBucket valuesElement = queryValuesBucket[i]; + bool hasId = valuesElement.HasColumn(ContactColumns::ID); + if (!hasId) { + continue; + } + OHOS::NativeRdb::ValueObject idValue; + valuesElement.GetObject(ContactPublicColumns::ID, idValue); + int rawContactId = 0; + idValue.GetInt(rawContactId); + OHOS::NativeRdb::ValuesBucket values; + values.PutInt(RawContactColumns::IS_DELETED, DELETE_MARK); + int updateRow = OHOS::NativeRdb::E_OK; + std::string upWhere = ""; + upWhere.append(ContactPublicColumns::ID); + upWhere.append(" = ? "); + std::vector upWhereArgs; + upWhereArgs.push_back(std::to_string(rawContactId)); + ret = store_->Update(updateRow, ContactTableName::RAW_CONTACT, values, upWhere, upWhereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("deleteRawContact upResultDelete fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + } + return ret; +} + +void ContactsDataBase::DeleteRecordInsert( + std::shared_ptr &store, std::vector &queryValuesBucket) +{ + mtx_.lock(); + int size = queryValuesBucket.size(); + for (int i = 0; i < size; i++) { + OHOS::NativeRdb::ValuesBucket valuesElement = queryValuesBucket[i]; + bool hasId = valuesElement.HasColumn(ContactColumns::ID); + if (!hasId) { + continue; + } + OHOS::NativeRdb::ValueObject idValue; + valuesElement.GetObject(ContactPublicColumns::ID, idValue); + int rawContactId = 0; + idValue.GetInt(rawContactId); + OHOS::NativeRdb::ValueObject contactIdValue; + valuesElement.GetObject(RawContactColumns::CONTACT_ID, contactIdValue); + int contactId = 0; + contactIdValue.GetInt(contactId); + OHOS::NativeRdb::ValueObject nameValue; + valuesElement.GetObject(RawContactColumns::DISPLAY_NAME, nameValue); + std::string disPlayName; + nameValue.GetString(disPlayName); + std::string backupData = + StructureDeleteContactJson(queryValuesBucket[i], ContactPublicColumns::ID, rawContactId); + if (backupData.empty()) { + HILOG_ERROR("deleteRawContact json :%{public}s", backupData.c_str()); + } + int deleteRet = DeleteRawContactLocal(contactId, rawContactId, backupData, disPlayName); + if (deleteRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("deleteRawContact upResultDelete fail:%{public}d", deleteRet); + } + std::vector rawContactIdVector; + rawContactIdVector.push_back(rawContactId); + ContactsUpdateHelper contactsUpdateHelper; + contactsUpdateHelper.UpdateCallLogByPhoneNum(rawContactIdVector, store, true); + } + mtx_.unlock(); +} + +/** + * @brief ContactsDataBase delete data from table raw_contact + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::DeleteRawContact(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteRawContact store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + std::vector queryValuesBucket = DeleteRawContactQuery(rdbPredicates); + int deleteRet = DeleteExecute(queryValuesBucket); + if (deleteRet != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + deleteRet = Commit(); + if (deleteRet != OHOS::NativeRdb::E_OK) { + RollBack(); + return RDB_EXECUTE_FAIL; + } + DeletedAsyncTask(store_, queryValuesBucket); + return deleteRet; +} + +std::vector ContactsDataBase::DeleteContactQuery( + OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + PredicatesConvert predicatesConvert; + OHOS::NativeRdb::RdbPredicates newRdbPredicates = + predicatesConvert.CopyPredicates(ViewName::VIEW_CONTACT, rdbPredicates); + std::vector columns; + columns.push_back(ContactPublicColumns::ID); + columns.push_back(RawContactColumns::DISPLAY_NAME); + std::unique_ptr resultSet = store_->Query(newRdbPredicates, columns); + int resultSetNum = resultSet->GoToFirstRow(); + if (resultSetNum != OHOS::NativeRdb::E_OK) { + // query size 0 + std::vector vectorQueryData; + resultSetNum = resultSet->GoToNextRow(); + resultSet->Close(); + return vectorQueryData; + } + std::vector whereArgs; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int contactId; + resultSet->GetInt(0, contactId); + whereArgs.push_back(std::to_string(contactId)); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + int size = whereArgs.size(); + OHOS::NativeRdb::RdbPredicates rawContactQueryRdbPredicates(ViewName::VIEW_RAW_CONTACT); + std::string whereClause; + for (int i = 0; i < size; i++) { + whereClause.append(" contact_id = ? "); + if (i != size - 1) { + whereClause.append(" OR "); + } + } + OHOS::NativeRdb::PredicatesUtils::SetWhereClauseAndArgs(&rawContactQueryRdbPredicates, whereClause, whereArgs); + OHOS::NativeRdb::PredicatesUtils::SetAttributes(&rawContactQueryRdbPredicates, + rawContactQueryRdbPredicates.IsDistinct(), rawContactQueryRdbPredicates.GetIndex(), + rawContactQueryRdbPredicates.GetGroup(), rawContactQueryRdbPredicates.GetOrder(), + rawContactQueryRdbPredicates.GetLimit(), rawContactQueryRdbPredicates.GetOffset()); + return DeleteRawContactQuery(rawContactQueryRdbPredicates); +} + +std::vector ContactsDataBase::DeleteRawContactQuery( + OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + std::vector columns; + columns.push_back(RawContactColumns::DISPLAY_NAME); + columns.push_back(ContactColumns::ID); + columns.push_back(RawContactColumns::CONTACT_ID); + std::unique_ptr resultSet = store_->Query(rdbPredicates, columns); + return ResultSetToValuesBucket(resultSet); +} + +int ContactsDataBase::DeleteRawContactLocal( + int contactId, int rawContactId, std::string backupData, std::string disPlayName) +{ + OHOS::NativeRdb::ValuesBucket deleteRawContact; + deleteRawContact.PutInt(DeleteRawContactColumns::RAW_CONTACT_ID, rawContactId); + deleteRawContact.PutString(DeleteRawContactColumns::BACKUP_DATA, backupData); + deleteRawContact.PutString(DeleteRawContactColumns::DISPLAY_NAME, disPlayName); + deleteRawContact.PutInt(DeleteRawContactColumns::CONTACT_ID, contactId); + int64_t outRowId = OHOS::NativeRdb::E_OK; + int ret = store_->Insert(outRowId, ContactTableName::DELETE_RAW_CONTACT, deleteRawContact); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("deleteRawContact deleteInsert fail:%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +/** + * @brief ContactsDataBase completely delete data + * + * @param rdbPredicates Conditions for delete operation + * + * @return The result returned by the delete operation + */ +int ContactsDataBase::CompletelyDelete(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + int ret = BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + return RDB_EXECUTE_FAIL; + } + std::vector columns; + columns.push_back(DeleteRawContactColumns::CONTACT_ID); + std::unique_ptr resultSet = store_->Query(rdbPredicates, columns); + std::vector contactIds; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int contactId; + resultSet->GetInt(0, contactId); + contactIds.push_back(std::to_string(contactId)); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + int retCode = RDB_EXECUTE_FAIL; + int size = contactIds.size(); + for (int index = 0; index < size; index++) { + std::string queryViewContact = + "SELECT id FROM view_raw_contact WHERE is_deleted = 1 AND contact_id = " + contactIds[index]; + std::unique_ptr contactIdSet = store_->QuerySql(queryViewContact); + resultSetNum = contactIdSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int value = -1; + contactIdSet->GetInt(0, value); + retCode = DeleteLocal(value, contactIds[index]); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CompletelyDelete DeleteLocal error:%{public}d", retCode); + break; + } + resultSetNum = contactIdSet->GoToNextRow(); + } + contactIdSet->Close(); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CompletelyDelete for error:%{public}d", retCode); + RollBack(); + return retCode; + } + } + return CompletelyDeleteCommit(retCode); +} + +int ContactsDataBase::CompletelyDeleteCommit(int retCode) +{ + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CompletelyDelete end error:%{public}d", retCode); + RollBack(); + return retCode; + } + int markRet = Commit(); + if (markRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("CompletelyDelete end error:%{public}d", markRet); + return RDB_EXECUTE_FAIL; + } + return retCode; +} + +int ContactsDataBase::DeleteLocal(int rawContactId, std::string contactId) +{ + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase DeleteLocal store is nullptr"); + return RDB_OBJECT_EMPTY; + } + int retCode = RDB_EXECUTE_FAIL; + std::string updateContactSql = "UPDATE contact SET name_raw_contact_id = NULL WHERE id = " + contactId; + retCode = store_->ExecuteSql(updateContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal updateContactSql code:%{public}d", retCode); + return retCode; + } + std::string updateRawContactSql = "UPDATE raw_contact SET contact_id = NULL WHERE contact_id = " + contactId; + retCode = store_->ExecuteSql(updateRawContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal updateRawContactSql code:%{public}d", retCode); + return retCode; + } + std::string deleteDeleteRawContactSql = "DELETE FROM deleted_raw_contact WHERE contact_id = " + contactId; + retCode = store_->ExecuteSql(deleteDeleteRawContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal deleted_raw_contact code:%{public}d", retCode); + return retCode; + } + std::string deleteSearchContactSql = "DELETE FROM search_contact WHERE contact_id = " + contactId; + retCode = store_->ExecuteSql(deleteSearchContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal deleteSearchContactSql code:%{public}d", retCode); + return retCode; + } + std::string deleteContactData = "DELETE FROM contact_data WHERE raw_contact_id = " + std::to_string(rawContactId); + retCode = store_->ExecuteSql(deleteContactData); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal deleteContactData code:%{public}d", retCode); + return retCode; + } + std::string deleteContactSql = "DELETE FROM contact WHERE id = " + contactId; + retCode = store_->ExecuteSql(deleteContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal deleteContactSql code:%{public}d", retCode); + return retCode; + } + std::string deleteRawContactSql = "DELETE FROM raw_contact WHERE id = " + std::to_string(rawContactId); + retCode = store_->ExecuteSql(deleteRawContactSql); + if (retCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("DeleteLocal deleteRawContactSql code:%{public}d", retCode); + return retCode; + } + return retCode; +} + +std::vector ContactsDataBase::QueryContactDataRawContactId( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, std::vector &types) +{ + std::vector columns; + columns.push_back(ContactDataColumns::TYPE_ID); + columns.push_back(ContactDataColumns::RAW_CONTACT_ID); + std::unique_ptr resultSet = store_->Query(rdbPredicates, columns); + std::vector rawContactIdVector; + std::vector typeIdVector; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string colummName = ContactDataColumns::RAW_CONTACT_ID; + int columnIndex = 0; + resultSet->GetColumnIndex(colummName, columnIndex); + int rawContactId = 0; + resultSet->GetInt(columnIndex, rawContactId); + std::string typeIdKey = ContactDataColumns::TYPE_ID; + int columnIndexType = 0; + resultSet->GetColumnIndex(typeIdKey, columnIndexType); + int typeId = 0; + resultSet->GetInt(columnIndexType, typeId); + OHOS::NativeRdb::ValueObject typeTextObject; + typeIdVector.push_back(typeId); + rawContactIdVector.push_back(rawContactId); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + int typeIdSize = typeIdVector.size(); + ContactsType contactsType; + for (int i = 0; i < typeIdSize; i++) { + std::string typeText = contactsType.GetTypeText(store_, typeIdVector[i]); + types.push_back(typeText); + } + return rawContactIdVector; +} + +/** + * @brief ContactsDataBase query data according to given conditions + * + * @param rdbPredicates Conditions for query operation + * @param columns Conditions for query operation + * + * @return The result returned by the delete operation + */ +std::unique_ptr ContactsDataBase::Query( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, std::vector &columns) +{ + std::unique_ptr resultSet; + if (store_ == nullptr) { + HILOG_ERROR("ContactsDataBase Query store_ is nullptr"); + return resultSet; + } + int errCode = OHOS::NativeRdb::E_OK; + resultSet = store_->Query(rdbPredicates, columns); + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_INFO("Query error code is:%{public}d", errCode); + } + return resultSet; +} + +std::vector ContactsDataBase::ResultSetToValuesBucket( + std::unique_ptr &resultSet) +{ + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + std::vector vectorQueryData; + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + OHOS::NativeRdb::ValuesBucket valuesBucketElement; + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + std::string typeValue = columnNames[i]; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + OHOS::NativeRdb::ColumnType columnType; + resultSet->GetColumnType(columnIndex, columnType); + if (columnType == OHOS::NativeRdb::ColumnType::TYPE_INTEGER) { + int intValue = 0; + resultSet->GetInt(columnIndex, intValue); + valuesBucketElement.PutInt(typeValue, intValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_FLOAT) { + double doubleValue = 0; + resultSet->GetDouble(columnIndex, doubleValue); + valuesBucketElement.PutDouble(typeValue, doubleValue); + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_STRING) { + std::string stringValue; + resultSet->GetString(columnIndex, stringValue); + valuesBucketElement.PutString(typeValue, stringValue); + } + } + vectorQueryData.push_back(valuesBucketElement); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return vectorQueryData; +} + +std::string ContactsDataBase::StructureDeleteContactJson( + OHOS::NativeRdb::ValuesBucket rawContactValues, std::string rawContactIdColumn, int rawContactId) +{ + ContactsJsonUtils contactsJsonUtils; + std::vector selectionArgs; + selectionArgs.push_back(std::to_string(rawContactId)); + std::string queryTabName = ViewName::VIEW_CONTACT_DATA; + std::vector contentColumns; + contentColumns.push_back(ContentTypeColumns::CONTENT_TYPE); + contentColumns.push_back(ContactDataColumns::DETAIL_INFO); + contentColumns.push_back(ContactDataColumns::POSITION); + contentColumns.push_back(ContactDataColumns::EXTEND1); + contentColumns.push_back(ContactDataColumns::EXTEND2); + contentColumns.push_back(ContactDataColumns::EXTEND3); + contentColumns.push_back(ContactDataColumns::EXTEND4); + contentColumns.push_back(ContactDataColumns::ALPHA_NAME); + contentColumns.push_back(ContactDataColumns::OTHRE_LAN_LAST_NAME); + contentColumns.push_back(ContactDataColumns::OTHRE_LAN_FIRST_NAME); + contentColumns.push_back(ContactDataColumns::EXTEND5); + contentColumns.push_back(ContactDataColumns::LAN_STYLE); + contentColumns.push_back(ContactDataColumns::CUSTOM_DATA); + contentColumns.push_back(ContactDataColumns::EXTEND6); + contentColumns.push_back(ContactDataColumns::EXTEND7); + contentColumns.push_back(ContactDataColumns::BLOB_DATA); + std::string queryWhereClause = DeleteRawContactColumns::RAW_CONTACT_ID; + queryWhereClause.append(" = ? "); + std::string sql = "SELECT "; + int size = contentColumns.size(); + for (int i = 0; i < size; i++) { + sql.append(contentColumns[i]); + if (i != size - 1) { + sql.append(", "); + } + } + sql.append(" FROM ").append(queryTabName).append(" WHERE ").append(queryWhereClause); + std::unique_ptr contactDataResultSet = store_->QuerySql(sql, selectionArgs); + std::string backupData = contactsJsonUtils.GetDeleteData(contactDataResultSet); + contactDataResultSet->Close(); + return backupData; +} + +int SqliteOpenHelperContactCallback::OnCreate(OHOS::NativeRdb::RdbStore &store) +{ + store.ExecuteSql(CREATE_CONTACT); + store.ExecuteSql(CREATE_CONTACT_INDEX); + store.ExecuteSql(CREATE_RAW_CONTACT); + store.ExecuteSql(CREATE_RAW_CONTACT_INDEX); + store.ExecuteSql(CREATE_CONTACT_DATA); + store.ExecuteSql(CREATE_CONTACT_INDEX_DATA1); + store.ExecuteSql(CREATE_CONTACT_INDEX_DATA2); + store.ExecuteSql(CREATE_CONTACT_BLOCKLIST); + store.ExecuteSql(CREATE_LOCAL_LANG); + store.ExecuteSql(CREATE_ACCOUNT); + store.ExecuteSql(CREATE_PHOTO_FILES); + store.ExecuteSql(CREATE_CONTACT_TYPE); + store.ExecuteSql(CREATE_GROUPS); + store.ExecuteSql(CREATE_DELETED_RAW_CONTACT); + store.ExecuteSql(CREATE_SEARCH_CONTACT); + store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX1); + store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX2); + store.ExecuteSql(CREATE_SEARCH_CONTACT_VIEW); + store.ExecuteSql(MERGE_INFO); + store.ExecuteSql(CREATE_VIEW_CONTACT_DATA); + store.ExecuteSql(CREATE_VIEW_RAW_CONTACT); + store.ExecuteSql(CREATE_VIEW_CONTACT); + store.ExecuteSql(CREATE_VIEW_GROUPS); + store.ExecuteSql(CREATE_VIEW_DELETED); + store.ExecuteSql(INSERT_DELETE_RAW_CONTACT); + store.ExecuteSql(UPDATE_RAW_CONTACT_VERSION); + store.ExecuteSql(UPDATE_CONTACT_DATA_VERSION); + store.ExecuteSql(INSERT_CONTACT_QUICK_SEARCH); + store.ExecuteSql(CREATE_DATABASE_BACKUP_TASK); + store.ExecuteSql(CREATE_INSERT_BACKUP_TIME); + store.ExecuteSql(UPDATE_CONTACT_BY_INSERT_CONTACT_DATA); + store.ExecuteSql(UPDATE_CONTACT_BY_DELETE_CONTACT_DATA); + store.ExecuteSql(UPDATE_CONTACT_BY_UPDATE_CONTACT_DATA); + store.ExecuteSql(MERGE_INFO_INDEX); + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperContactCallback::OnUpgrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnUpgrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion < newVersion && newVersion == DATABASE_NEW_VERSION) { + store.ExecuteSql("ALTER TABLE database_backup_task ADD COLUMN sync TEXT"); + } + store.SetVersion(newVersion); + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperContactCallback::OnDowngrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnDowngrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion > newVersion && newVersion == DATABASE_OPEN_VERSION) { + store.ExecuteSql( + "CREATE TABLE IF NOT EXISTS database_backup (id INTEGER PRIMARY KEY AUTOINCREMENT, backup_time " + "TEXT, backup_path TEXT, remarks TEXT)"); + store.ExecuteSql( + "INSERT INTO database_backup(id, backup_time, backup_path, remarks) SELECT id, " + "backup_time, backup_path, remarks FROM database_backup_task"); + store.ExecuteSql("DROP table database_backup_task"); + store.ExecuteSql("ALTER table database_backup RENAME TO database_backup_task"); + store.ExecuteSql(CREATE_INSERT_BACKUP_TIME); + } + int ret = store.SetVersion(newVersion); + return ret; +} + +void ContactsDataBase::DestroyInstanceAndRestore(std::string restorePath) +{ + mtx_.lock(); + if (access(restorePath.c_str(), F_OK) != 0) { + HILOG_ERROR("Restore file %{public}s does not exist", restorePath.c_str()); + mtx_.unlock(); + return; + } + OHOS::NativeRdb::RdbHelper::DeleteRdbStore(g_databaseName); + OHOS::NativeRdb::RdbHelper::ClearCache(); + contactDataBase_ = nullptr; + Restore(restorePath); + mtx_.unlock(); +} + +bool ContactsDataBase::Restore(std::string restorePath) +{ + HILOG_INFO("ContactsDataBase Restore start "); + if (rename(restorePath.c_str(), g_databaseName.c_str()) == 0) { + HILOG_INFO("ContactsDataBase Restore rename ok "); + return true; + } + return false; +} + +/** + * @brief ContactsDataAbility selectCandidate operation + * + * @return The result returned by the selectCandidate operation + */ +std::shared_ptr ContactsDataBase::SelectCandidate() +{ + MarkMerge(store_); + MergerContacts mergerContacts; + return mergerContacts.SelectCandidate(store_); +} + +/** + * @brief ContactsDataAbility split operation + * + * @param predicates Conditions for split operation + * + * @return The result returned by the split operation + */ +int ContactsDataBase::Split(OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::vector whereArgs = predicates.GetWhereArgs(); + if (whereArgs.size() > 1) { + HILOG_ERROR("Invalid parameter passed"); + return RDB_EXECUTE_FAIL; + } + MatchCandidate matchCandidate; + int code = RDB_EXECUTE_FAIL; + for (auto value : whereArgs) { + code = matchCandidate.Split(store_, atoi(value.c_str())); + } + if (code != RDB_EXECUTE_OK) { + HILOG_INFO("Split code %{public}d", code); + } + return code; +} + +/** + * @brief ContactsDataAbility autoMerge operation + * + * @return The result returned by the autoMerge operation + */ +int ContactsDataBase::ContactMerge() +{ + MarkMerge(store_); + int code = RDB_EXECUTE_FAIL; + MergerContacts mergerContacts; + if (store_ != nullptr) { + code = mergerContacts.ContactMerge(store_); + if (code != RDB_EXECUTE_OK) { + HILOG_ERROR("ContactMerge ERROR!"); + } + } + return code; +} + +/** + * @brief ContactsDataAbility manualMerge operation + * + * @param predicates Conditions for manualMerge operation + * + * @return The result returned by the manualMerge operation + */ +int ContactsDataBase::ReContactMerge(OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + MarkMerge(store_); + int code = RDB_EXECUTE_FAIL; + MergerContacts mergerContacts; + if (store_ != nullptr) { + code = mergerContacts.ReContactMerge(store_, predicates); + if (code != RDB_EXECUTE_OK) { + HILOG_ERROR("ReContactMerge ERROR!"); + } + } + return code; +} + +void ContactsDataBase::InsertMergeData( + std::shared_ptr &store, std::vector &rawContactIdVector) +{ + int size = rawContactIdVector.size(); + for (int i = 0; i < size; i++) { + OHOS::NativeRdb::ValuesBucket mergeInfoValues; + mergeInfoValues.PutInt(MergeInfo::RAW_CONTACT_ID, rawContactIdVector[i]); + int64_t mergeInfoRowId = 0; + int mergeInfoRet = store->Insert(mergeInfoRowId, ContactTableName::MERGE_INFO, mergeInfoValues); + if (mergeInfoRet != RDB_EXECUTE_OK) { + HILOG_ERROR("mergeInfo insert error : %{public}d ", mergeInfoRet); + } + } +} + +void ContactsDataBase::MergeUpdateTask( + std::shared_ptr &store, std::vector &rawContactIdVector, bool isDeleted) +{ + ASYNC_TASK_QUEUE->Push(new AsyncTask(store_, rawContactIdVector, isDeleted)); + ASYNC_TASK_QUEUE->Start(); +} + +void ContactsDataBase::MarkMerge(std::shared_ptr &store) +{ + std::string sql = "SELECT "; + sql.append(MergeInfo::RAW_CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::MERGE_INFO) + .append(" GROUP BY ") + .append(MergeInfo::RAW_CONTACT_ID); + std::unique_ptr resultSet = store->QuerySql(sql); + int mergeResultSetNum = resultSet->GoToFirstRow(); + MatchCandidate matchCandidate; + while (mergeResultSetNum == OHOS::NativeRdb::E_OK) { + std::string columnName = MergeInfo::RAW_CONTACT_ID; + int columnIndex = 0; + int rawContactId = 0; + resultSet->GetColumnIndex(columnName, columnIndex); + resultSet->GetInt(columnIndex, rawContactId); + int error = matchCandidate.FindMatchContact(store, rawContactId); + if (error != RDB_EXECUTE_OK) { + HILOG_ERROR("Find error is : %{public}d ", error); + } + std::string deleteMergeInfo = "DELETE FROM "; + deleteMergeInfo.append(ContactTableName::MERGE_INFO) + .append(" WHERE ") + .append(MergeInfo::RAW_CONTACT_ID) + .append(" = ") + .append(std::to_string(rawContactId)); + int ret = store->ExecuteSql(deleteMergeInfo); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("deleteMergeInfo error"); + } + mergeResultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); +} + +int ContactsDataBase::GetTypeId(std::string typeText) +{ + ContactsType contactsType; + int typeId = contactsType.LookupTypeId(store_, typeText); + HILOG_INFO("ContactsDataBase GetTypeId %{public}d", typeId); + return typeId; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/contacts_type.cpp b/dataBusiness/contacts/src/contacts_type.cpp new file mode 100644 index 0000000..56fd299 --- /dev/null +++ b/dataBusiness/contacts/src/contacts_type.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2021 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 "contacts_type.h" + +#include "common.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +ContactsType::ContactsType(void) +{ +} + +ContactsType::~ContactsType() +{ +} + +int64_t ContactsType::Insert(std::shared_ptr rdbStore, std::string typeValue, int typeId) +{ + std::shared_ptr &store_ = rdbStore; + OHOS::NativeRdb::ValuesBucket values; + values.PutString(ContentTypeColumns::CONTENT_TYPE, typeValue); + if (typeId != RDB_OBJECT_EMPTY) { + values.PutInt(ContentTypeColumns::ID, typeId); + } + if (store_ == nullptr) { + HILOG_ERROR("ContactsType insert store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int64_t outRowId = RDB_EXECUTE_FAIL; + int ret = store_->Insert(outRowId, ContactTableName::CONTACT_TYPE, values); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsType insert ret :%{public}d", ret); + } + return outRowId; +} + +void ContactsType::PrepopulateCommonTypes(std::shared_ptr rdbStore) +{ + std::vector vectorType; + vectorType.push_back(ContentTypeData::EMAIL); + vectorType.push_back(ContentTypeData::IM); + vectorType.push_back(ContentTypeData::NICKNAME); + vectorType.push_back(ContentTypeData::ORGANIZATION); + vectorType.push_back(ContentTypeData::PHONE); + vectorType.push_back(ContentTypeData::NAME); + vectorType.push_back(ContentTypeData::ADDRESS); + vectorType.push_back(ContentTypeData::PHOTO); + vectorType.push_back(ContentTypeData::GROUP_MEMBERSHIP); + vectorType.push_back(ContentTypeData::NOTE); + vectorType.push_back(ContentTypeData::CONTACT_EVENT); + vectorType.push_back(ContentTypeData::WEBSITE); + vectorType.push_back(ContentTypeData::RELATION); + vectorType.push_back(ContentTypeData::CONTACT_MISC); + vectorType.push_back(ContentTypeData::HICALL_DEVICE); + vectorType.push_back(ContentTypeData::CAMCARD); + vectorType.push_back(ContentTypeData::SIP_ADDRESS); + int size = vectorType.size(); + for (int i = 0; i < size; i++) { + std::string typeValue = vectorType[i]; + int error = LookupTypeId(rdbStore, typeValue); + char *typeChar = nullptr; + typeChar = (char *)typeValue.data(); + if (error == RDB_EXECUTE_FAIL) { + int typeId = i + 1; + Insert(rdbStore, typeValue, typeId); + } + } +} + +int ContactsType::LookupTypeId(std::shared_ptr rdbStore, std::string typeValue) +{ + std::shared_ptr &store_ = rdbStore; + std::string sqlBuilder = "SELECT * FROM "; + sqlBuilder.append(ContactTableName::CONTACT_TYPE) + .append(" WHERE ") + .append(ContentTypeColumns::CONTENT_TYPE) + .append(" = ? "); + std::vector selectionArgs; + selectionArgs.push_back(typeValue); + std::unique_ptr resultSet = store_->QuerySql(sqlBuilder, selectionArgs); + int ret = resultSet->GoToFirstRow(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsType lookupTypeId ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + int columnIndex = RDB_EXECUTE_FAIL; + resultSet->GetColumnIndex(ContactPublicColumns::ID, columnIndex); + int typeId = RDB_EXECUTE_FAIL; + resultSet->GetInt(columnIndex, typeId); + resultSet->Close(); + return typeId; +} + +std::string ContactsType::GetTypeText(std::shared_ptr rdbStore, int typeId) +{ + std::shared_ptr &store_ = rdbStore; + std::string sqlBuilder = "SELECT * FROM "; + sqlBuilder.append(ContactTableName::CONTACT_TYPE) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ?"); + std::vector selectionArgs; + selectionArgs.push_back(std::to_string(typeId)); + std::unique_ptr resultSet = store_->QuerySql(sqlBuilder, selectionArgs); + int ret = resultSet->GoToFirstRow(); + if (ret != OHOS::NativeRdb::E_OK) { + resultSet->Close(); + HILOG_ERROR("ContactsType lookupTypeText ret :%{public}d", ret); + } + std::string TypeText; + int columnIndex = RDB_EXECUTE_FAIL; + resultSet->GetColumnIndex(ContentTypeColumns::CONTENT_TYPE, columnIndex); + resultSet->GetString(columnIndex, TypeText); + resultSet->Close(); + return TypeText; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/contacts_update_helper.cpp b/dataBusiness/contacts/src/contacts_update_helper.cpp new file mode 100644 index 0000000..2f198fa --- /dev/null +++ b/dataBusiness/contacts/src/contacts_update_helper.cpp @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2021 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 "contacts_update_helper.h" + +#include "calllog_database.h" +#include "character_transliterate.h" +#include "common.h" +#include "construction_name.h" +#include "contacts.h" +#include "contacts_columns.h" +#include "contacts_database.h" +#include "contacts_search.h" +#include "contacts_type.h" +#include "hilog_wrapper.h" +#include "raw_contacts.h" +#include "voicemail_database.h" + +namespace OHOS { +namespace Contacts { +ContactsUpdateHelper::ContactsUpdateHelper(void) +{ +} + +ContactsUpdateHelper::~ContactsUpdateHelper() +{ +} + +int ContactsUpdateHelper::UpdateDisplay(std::vector rawContactIdVector, std::vector types, + std::shared_ptr rdbStore, OHOS::NativeRdb::ValuesBucket contactDataDataValues, + bool isDelete) +{ + int ret = RDB_EXECUTE_OK; + int count = rawContactIdVector.size(); + int countType = types.size(); + if (countType != count) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay Illegal rawContactId size type:%{public}d", count); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay Illegal type size :%{public}d", countType); + return ret; + } + ContactsSearch contactsSearch; + RawContacts rawContacts; + Contacts contactsContact; + for (int i = 0; i < count; i++) { + int rawContactId = rawContactIdVector[i]; + std::string type = types[i]; + if (strcmp(type.c_str(), ContentTypeData::ORGANIZATION) == 0) { + OHOS::NativeRdb::ValuesBucket rawContactValues = + GetUpdateCompanyValuesBucket(contactDataDataValues, isDelete); + if (rawContactValues.Size() <= 0) { + return ret; + } + ret = rawContacts.UpdateRawContactById(rawContactId, type, rdbStore, rawContactValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail type:%{public}s", type.c_str()); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail:%{public}d", ret); + return ret; + } + OHOS::NativeRdb::ValuesBucket contactValues = GetUpdateCompanyValuesBucket(contactDataDataValues, isDelete); + if (contactValues.Size() <= 0) { + return ret; + } + ret = contactsContact.UpdateContact(rawContactId, rdbStore, contactValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateContact fail type:%{public}s", type.c_str()); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateContact fail:%{public}d", ret); + return ret; + } + } else if (strcmp(type.c_str(), ContentTypeData::NAME) == 0) { + ret = UpdateName(contactDataDataValues, isDelete, rawContactId, type, rdbStore); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail type:%{public}s", type.c_str()); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail:%{public}d", ret); + return ret; + } + } else { + ret = RDB_EXECUTE_OK; + } + } + return ret; +} + +int ContactsUpdateHelper::UpdateName(OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete, int rawContactId, + std::string type, std::shared_ptr rdbStore) +{ + OHOS::NativeRdb::ValuesBucket rawContactValues = GetUpdateDisPlayNameValuesBucket(linkDataDataValues, isDelete); + OHOS::NativeRdb::ValuesBucket searchContactValues = GetUpdateSearchNameValuesBucket(linkDataDataValues, isDelete); + std::string disPlayName; + OHOS::NativeRdb::ValueObject typeValue; + rawContactValues.GetObject(RawContactColumns::DISPLAY_NAME, typeValue); + typeValue.GetString(disPlayName); + if (!disPlayName.empty()) { + ConstructionName name; + name.GetConstructionName(disPlayName, name); + std::string searchName; + searchName.append(disPlayName); + if (!name.nameFullFight_.empty()) { + searchName.append("||"); + searchName.append(name.nameFullFight_); + } + if (!name.initials_.empty()) { + searchName.append("||"); + searchName.append(name.initials_); + } + if (!searchName.empty()) { + searchContactValues.PutString(SearchContactColumns::SEARCH_NAME, searchName); + } + if (!name.photoFirstName_.empty()) { + rawContactValues.PutString(RawContactColumns::PHOTO_FIRST_NAME, name.photoFirstName_); + } + if (!name.sortFirstLetter_.empty()) { + // add sort and sort_first_letter + rawContactValues.PutString(RawContactColumns::SORT_FIRST_LETTER, name.sortFirstLetter_); + rawContactValues.PutString(RawContactColumns::SORT, std::to_string(name.sortFirstLetterCode_)); + } + } + int ret = RDB_EXECUTE_OK; + if (rawContactValues.Size() > 0) { + RawContacts rawContacts; + rawContacts.UpdateRawContactById(rawContactId, type, rdbStore, rawContactValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail type:%{public}s", type.c_str()); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateRawContact fail:%{public}d", ret); + return ret; + } + } + if (searchContactValues.Size() > 0) { + // update SearchContact name + ContactsSearch contactsSearch; + ret = contactsSearch.UpdateSearchContact(rawContactId, type, rdbStore, searchContactValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateSearchContact fail type:%{public}s", type.c_str()); + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateSearchContact fail:%{public}d", ret); + return ret; + } + } + return ret; +} + +/** + * @brief ContactsUpdateHelper update table calllog by phoneNumber + * + * @param rawContactIdVector Contacts ID collection to update + * @param rdbStore Conditions to update calllog + * @param isDelete Contacts field value to update + * + * @return Update calllog results code + */ +void ContactsUpdateHelper::UpdateCallLogByPhoneNum( + std::vector &rawContactIdVector, std::shared_ptr &rdbStore, bool isDelete) +{ + std::shared_ptr contactDataBase_ = ContactsDataBase::GetInstance(); + if (rdbStore != contactDataBase_->contactStore_) { + HILOG_ERROR("UpdateCallLogByPhoneNum rdbStore is profile, not need update"); + return; + } + int count = rawContactIdVector.size(); + for (int i = 0; i < count; i++) { + std::string queryContactIdSql; + queryContactIdSql.append(" SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ViewName::VIEW_RAW_CONTACT) + .append(" WHERE ") + .append(ContactPublicColumns::ID) + .append(" = ") + .append(std::to_string(rawContactIdVector[i])); + std::unique_ptr rawContactResultSet = + rdbStore->QuerySql(queryContactIdSql); + int rawContactResultSetNum = rawContactResultSet->GoToFirstRow(); + int contactId = 0; + while (rawContactResultSetNum == OHOS::NativeRdb::E_OK) { + std::string columnName = RawContactColumns::CONTACT_ID; + int columnIndex = 0; + rawContactResultSet->GetColumnIndex(columnName, columnIndex); + rawContactResultSet->GetInt(columnIndex, contactId); + rawContactResultSetNum = rawContactResultSet->GoToNextRow(); + break; + } + rawContactResultSet->Close(); + if (contactId <= 0) { + return; + } + std::unique_ptr resultSet = QueryDataForCallLog(rdbStore, contactId); + DataToUpdateCallLog(isDelete, contactId, resultSet); + } +} + +void ContactsUpdateHelper::DataToUpdateCallLog( + bool isDelete, int contactId, std::unique_ptr &resultSet) +{ + int rowCount = 0; + resultSet->GetRowCount(rowCount); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string phoneNumber; + std::string name; + std::string quickSearch; + // not delete contact + if (!isDelete) { + resultSet->GetString(0, name); + } + resultSet->GetString(RESEULT_GET_ONE, phoneNumber); + resultSet->GetString(RESEULT_GET_TWO, quickSearch); + UpdateCallLog(phoneNumber, name, quickSearch, isDelete, true); + UpdateCallLog(phoneNumber, name, quickSearch, isDelete, false); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + if (rowCount == 0) { + // not find contact data update callLog + std::string quickSearch = std::to_string(contactId); + std::string name; + UpdateCallLogNameNull(name, quickSearch, true); + UpdateCallLogNameNull(name, quickSearch, false); + } +} + +std::unique_ptr ContactsUpdateHelper::QueryDataForCallLog( + std::shared_ptr &rdbStore, int contactId) +{ + ContactsType contactsType; + int typeNameId = contactsType.LookupTypeId(rdbStore, ContentTypeData::PHONE); + std::string sql; + sql.append("SELECT ") + .append(RawContactColumns::DISPLAY_NAME) + .append(",") + .append(ContactDataColumns::DETAIL_INFO) + .append(",") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE ") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(" = (SELECT min(") + .append(ContactDataColumns::RAW_CONTACT_ID) + .append(") FROM ") + .append(ViewName::VIEW_CONTACT_DATA) + .append(" WHERE ") + .append(RawContactColumns::CONTACT_ID) + .append(" = ") + .append(std::to_string(contactId)) + .append(" AND ") + .append(ContentTypeColumns::CONTENT_TYPE) + .append(" = '") + .append(ContentTypeData::PHONE) + .append("') AND ") + .append(ContactDataColumns::TYPE_ID) + .append(" = ") + .append(std::to_string(typeNameId)); + std::unique_ptr resultSet = rdbStore->QuerySql(sql); + if (resultSet == nullptr) { + HILOG_ERROR("ContactsUpdateHelper QueryDataForCallLog resultSet is nullptr "); + } + return resultSet; +} + +int ContactsUpdateHelper::UpdateCallLogNameNull(std::string &name, std::string &quickSearch, bool isCallLog) +{ + std::shared_ptr callLogDataBase = CallLogDataBase::GetInstance(); + OHOS::NativeRdb::ValuesBucket updateCallLogValues; + updateCallLogValues.PutNull(CallLogColumns::DISPLAY_NAME); + updateCallLogValues.PutNull(CallLogColumns::QUICK_SEARCH_KEY); + std::string tabName = CallsTableName::VOICEMAIL; + if (isCallLog) { + tabName = CallsTableName::CALLLOG; + } + auto predicates = OHOS::NativeRdb::RdbPredicates(tabName); + std::string updateWheres; + updateWheres.append(CallLogColumns::QUICK_SEARCH_KEY).append(" = ? "); + std::vector updateArgs; + updateArgs.push_back(quickSearch); + predicates.SetWhereClause(updateWheres); + predicates.SetWhereArgs(updateArgs); + int ret = RDB_EXECUTE_FAIL; + if (isCallLog) { + ret = callLogDataBase->UpdateCallLog(updateCallLogValues, predicates); + } else { + ret = VoiceMailDataBase::GetInstance()->UpdateVoiceMail(updateCallLogValues, predicates); + } + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("UpdateCallLogPhone name error from phone is %{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +/** + * @brief ContactsUpdateHelper update table calllog + * + * @param phoneNumber Contacts's phone number + * @param name CallLog name to update + * @param quickSearch Contacts's quick search key + * @param isDelete Contacts field value to update + * @param isCallLog Contacts field value to update + * + * @return Update calllog results code + */ +int ContactsUpdateHelper::UpdateCallLog( + std::string &phoneNumber, std::string &name, std::string &quickSearch, bool isDelete, bool isCallLog) +{ + if (phoneNumber.empty()) { + return RDB_EXECUTE_OK; + } + std::shared_ptr callLogDataBase = CallLogDataBase::GetInstance(); + OHOS::NativeRdb::ValuesBucket updateCallLogValues; + if (isDelete) { + updateCallLogValues.PutNull(CallLogColumns::DISPLAY_NAME); + updateCallLogValues.PutNull(CallLogColumns::QUICK_SEARCH_KEY); + } else { + updateCallLogValues.PutString(CallLogColumns::DISPLAY_NAME, name); + updateCallLogValues.PutString(CallLogColumns::QUICK_SEARCH_KEY, quickSearch); + } + updateCallLogValues.PutString(CallLogColumns::PHONE_NUMBER, phoneNumber); + std::string tabName = CallsTableName::VOICEMAIL; + if (isCallLog) { + tabName = CallsTableName::CALLLOG; + } + auto predicates = OHOS::NativeRdb::RdbPredicates(tabName); + std::string updateWheres; + updateWheres.append(CallLogColumns::PHONE_NUMBER).append(" = ? "); + std::vector updateArgs; + updateArgs.push_back(phoneNumber); + predicates.SetWhereClause(updateWheres); + predicates.SetWhereArgs(updateArgs); + int ret = RDB_EXECUTE_FAIL; + if (isCallLog) { + ret = callLogDataBase->UpdateCallLog(updateCallLogValues, predicates); + } else { + ret = VoiceMailDataBase::GetInstance()->UpdateVoiceMail(updateCallLogValues, predicates); + } + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("UpdateCallLogPhone name error from phone is %{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +OHOS::NativeRdb::ValuesBucket ContactsUpdateHelper::GetUpdateDisPlayNameValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + if (isDelete) { + valuesBucket.PutNull(RawContactColumns::DISPLAY_NAME); + valuesBucket.PutNull(RawContactColumns::SORT_FIRST_LETTER); + valuesBucket.PutNull(RawContactColumns::SORT); + return valuesBucket; + } + std::string displayName; + if (linkDataDataValues.HasColumn(ContactDataColumns::DETAIL_INFO)) { + OHOS::NativeRdb::ValueObject typeValue; + linkDataDataValues.GetObject(ContactDataColumns::DETAIL_INFO, typeValue); + typeValue.GetString(displayName); + } + valuesBucket.PutString(RawContactColumns::DISPLAY_NAME, displayName); + std::string phoneticName; + if (linkDataDataValues.HasColumn(RawContactColumns::PHONETIC_NAME)) { + OHOS::NativeRdb::ValueObject typeValue; + linkDataDataValues.GetObject(ContactDataColumns::PHONETIC_NAME, typeValue); + typeValue.GetString(phoneticName); + } + valuesBucket.PutString(RawContactColumns::PHONETIC_NAME, phoneticName); + return valuesBucket; +} + +OHOS::NativeRdb::ValuesBucket ContactsUpdateHelper::GetUpdateSearchNameValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + if (isDelete) { + valuesBucket.PutNull(SearchContactColumns::SEARCH_NAME); + return valuesBucket; + } + std::string displayName; + if (linkDataDataValues.HasColumn(ContactDataColumns::DETAIL_INFO)) { + OHOS::NativeRdb::ValueObject typeValue; + linkDataDataValues.GetObject(ContactDataColumns::DETAIL_INFO, typeValue); + typeValue.GetString(displayName); + } + valuesBucket.PutString(RawContactColumns::DISPLAY_NAME, displayName); + return valuesBucket; +} + +OHOS::NativeRdb::ValuesBucket ContactsUpdateHelper::GetUpdateCompanyValuesBucket( + OHOS::NativeRdb::ValuesBucket linkDataDataValues, bool isDelete) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + if (isDelete) { + valuesBucket.PutNull(RawContactColumns::COMPANY); + valuesBucket.PutNull(RawContactColumns::POSITION); + return valuesBucket; + } + if (linkDataDataValues.HasColumn(ContactDataColumns::DETAIL_INFO)) { + std::string commpany; + OHOS::NativeRdb::ValueObject typeValue; + linkDataDataValues.GetObject(ContactDataColumns::DETAIL_INFO, typeValue); + typeValue.GetString(commpany); + valuesBucket.PutString(RawContactColumns::COMPANY, commpany); + } + if (linkDataDataValues.HasColumn(ContactDataColumns::POSITION)) { + std::string position; + OHOS::NativeRdb::ValueObject typeValue; + linkDataDataValues.GetObject(ContactDataColumns::POSITION, typeValue); + typeValue.GetString(position); + valuesBucket.PutString(RawContactColumns::POSITION, position); + } + return valuesBucket; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/profile_database.cpp b/dataBusiness/contacts/src/profile_database.cpp new file mode 100644 index 0000000..8c1cbfe --- /dev/null +++ b/dataBusiness/contacts/src/profile_database.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2021 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 "profile_database.h" + +#include +#include +#include + +#include "common.h" +#include "contacts_account.h" +#include "contacts_columns.h" +#include "contacts_type.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr ProfileDatabase::profileDatabase_ = nullptr; +std::shared_ptr ProfileDatabase::store_ = nullptr; +static std::string g_databaseName; +namespace { +std::mutex g_mtx; +} // namespace + +ProfileDatabase::ProfileDatabase() +{ + int errCode = OHOS::NativeRdb::E_OK; + g_databaseName = ContactsPath::RDB_PATH + "profile.db"; + OHOS::NativeRdb::RdbStoreConfig config(g_databaseName); + HILOG_INFO("ProfileDatabase g_databaseName :%{public}s", g_databaseName.c_str()); + SqliteOpenHelperProfileCallback sqliteOpenHelperCallback; + store_ = OHOS::NativeRdb::RdbHelper::GetRdbStore(config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode); + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ProfileDatabase errCode :%{public}d", errCode); + } else { + HILOG_INFO("ProfileDatabase errCode :%{public}d", errCode); + } + if (errCode != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ProfileDatabase rebase open error :%{public}d", errCode); + return; + } + std::shared_ptr contactsAccount = ContactsAccount::GetInstance(); + contactsAccount->PrepopulateCommonAccountTypes(store_); + ContactsType contactsType; + contactsType.PrepopulateCommonTypes(store_); +} + +std::shared_ptr ProfileDatabase::GetInstance() +{ + if (profileDatabase_ == nullptr) { + g_mtx.lock(); + profileDatabase_.reset(new ProfileDatabase()); + g_mtx.unlock(); + } + return profileDatabase_; +} + +void ProfileDatabase::DestroyInstanceAndRestore(std::string restorePath) +{ + g_mtx.lock(); + if (access(restorePath.c_str(), F_OK) != 0) { + HILOG_ERROR("Restore file %{public}s does not exist", restorePath.c_str()); + g_mtx.unlock(); + return; + } + OHOS::NativeRdb::RdbHelper::DeleteRdbStore(g_databaseName); + OHOS::NativeRdb::RdbHelper::ClearCache(); + profileDatabase_ = nullptr; + Restore(restorePath); + g_mtx.unlock(); +} + +bool ProfileDatabase::Restore(std::string restorePath) +{ + if (rename(restorePath.c_str(), g_databaseName.c_str())) { + HILOG_ERROR("Restore rename oldFileName = %{public}s to newFileName %{public}s", restorePath.c_str(), + g_databaseName.c_str()); + return true; + } + return false; +} + +int SqliteOpenHelperProfileCallback::OnCreate(OHOS::NativeRdb::RdbStore &store) +{ + store.ExecuteSql(CREATE_CONTACT); + store.ExecuteSql(CREATE_CONTACT_INDEX); + store.ExecuteSql(CREATE_RAW_CONTACT); + store.ExecuteSql(CREATE_RAW_CONTACT_INDEX); + store.ExecuteSql(CREATE_CONTACT_DATA); + store.ExecuteSql(CREATE_CONTACT_INDEX_DATA1); + store.ExecuteSql(CREATE_CONTACT_INDEX_DATA2); + store.ExecuteSql(CREATE_CONTACT_BLOCKLIST); + store.ExecuteSql(CREATE_LOCAL_LANG); + store.ExecuteSql(CREATE_ACCOUNT); + store.ExecuteSql(CREATE_PHOTO_FILES); + store.ExecuteSql(CREATE_CONTACT_TYPE); + store.ExecuteSql(CREATE_GROUPS); + store.ExecuteSql(CREATE_DELETED_RAW_CONTACT); + store.ExecuteSql(CREATE_SEARCH_CONTACT); + store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX1); + store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX2); + store.ExecuteSql(CREATE_SEARCH_CONTACT_VIEW); + store.ExecuteSql(MERGE_INFO); + store.ExecuteSql(CREATE_VIEW_CONTACT_DATA); + store.ExecuteSql(CREATE_VIEW_RAW_CONTACT); + store.ExecuteSql(CREATE_VIEW_CONTACT); + store.ExecuteSql(CREATE_VIEW_GROUPS); + store.ExecuteSql(CREATE_VIEW_DELETED); + store.ExecuteSql(INSERT_DELETE_RAW_CONTACT); + store.ExecuteSql(UPDATE_RAW_CONTACT_VERSION); + store.ExecuteSql(UPDATE_CONTACT_DATA_VERSION); + store.ExecuteSql(INSERT_CONTACT_QUICK_SEARCH); + store.ExecuteSql(CREATE_DATABASE_BACKUP_TASK); + store.ExecuteSql(CREATE_INSERT_BACKUP_TIME); + store.ExecuteSql(UPDATE_CONTACT_BY_INSERT_CONTACT_DATA); + store.ExecuteSql(UPDATE_CONTACT_BY_DELETE_CONTACT_DATA); + store.ExecuteSql(UPDATE_CONTACT_BY_UPDATE_CONTACT_DATA); + store.ExecuteSql(MERGE_INFO_INDEX); + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperProfileCallback::OnUpgrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnUpgrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion < newVersion && newVersion == DATABASE_NEW_VERSION) { + store.ExecuteSql("ALTER TABLE database_backup_task ADD COLUMN sync TEXT"); + } + store.SetVersion(newVersion); + return OHOS::NativeRdb::E_OK; +} + +int SqliteOpenHelperProfileCallback::OnDowngrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion) +{ + HILOG_INFO("OnDowngrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion); + if (oldVersion > newVersion && newVersion == DATABASE_OPEN_VERSION) { + store.ExecuteSql( + "CREATE TABLE IF NOT EXISTS database_backup (id INTEGER PRIMARY KEY AUTOINCREMENT, backup_time " + "TEXT, backup_path TEXT, remarks TEXT)"); + store.ExecuteSql( + "INSERT INTO database_backup(id, backup_time, backup_path, remarks) SELECT id, " + "backup_time, backup_path, remarks FROM database_backup_task"); + store.ExecuteSql("DROP table database_backup_task"); + store.ExecuteSql("ALTER table database_backup RENAME TO database_backup_task"); + store.ExecuteSql(CREATE_INSERT_BACKUP_TIME); + } + int ret = store.SetVersion(newVersion); + return ret; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/contacts/src/raw_contacts.cpp b/dataBusiness/contacts/src/raw_contacts.cpp new file mode 100644 index 0000000..0ba6514 --- /dev/null +++ b/dataBusiness/contacts/src/raw_contacts.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2021 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 "raw_contacts.h" + +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +RawContacts::RawContacts(void) +{ +} + +RawContacts::~RawContacts() +{ +} + +/** + * @brief RawContacts insert table raw_contact + * + * @param rdbStore Insert operation based on radStore + * @param rawContactValues Pass in parameter rawContactValues + * + * @return Insert database results code + */ +int RawContacts::InsertRawContact(std::shared_ptr rdbStore, int64_t &outRawContactId, + OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + int rowRet = rdbStore->Insert(outRawContactId, ContactTableName::RAW_CONTACT, rawContactValues); + if (rowRet != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("RawContacts InsertRawContact fail:%{public}d", rowRet); + } + return rowRet; +} + +/** + * @brief RawContacts update table raw_contact + * + * @param rdbStore Update operation based on radStore + * @param upRawContactValues Pass in parameter upRawContactValues + * @param whereClause Conditions for update operation + * @param whereArgs Conditions for update operation + * + * @return Insert database results code + */ +int RawContacts::UpdateRawContact(std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket upRawContactValues, std::string whereClause, std::vector whereArgs) +{ + int changedRows = OHOS::NativeRdb::E_OK; + int ret = rdbStore->Update(changedRows, ContactTableName::RAW_CONTACT, upRawContactValues, whereClause, whereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("RawContacts UpdateRawContact fail:%{public}d", ret); + } + return ret; +} + +int RawContacts::UpdateRawContactById(int &rawContactId, std::string type, + std::shared_ptr rdbStore, OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + std::string upWhereClause; + upWhereClause.append(ContactPublicColumns::ID).append(" = ?"); + std::vector upWhereArgs; + upWhereArgs.push_back(std::to_string(rawContactId)); + int changedRows = OHOS::NativeRdb::E_OK; + int ret = + rdbStore->Update(changedRows, ContactTableName::RAW_CONTACT, rawContactValues, upWhereClause, upWhereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("RawContacts UpdateRawContactById fail:%{public}d", ret); + } + return ret; +} + +int RawContacts::GetDeleteContactIdByAccountId(std::shared_ptr rdbStore, int accountId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("RawContacts GetDeleteContactIdByAccountId store_ is nullptr or accountId illegal"); + return RDB_OBJECT_EMPTY; + } + if (accountId < ID_EMPTITY) { + HILOG_ERROR("RawContacts GetDeleteContactIdByAccountId accountId illegal"); + return OPERATION_ERROR; + } + std::vector selectArgs; + selectArgs.push_back(std::to_string(accountId)); + selectArgs.push_back(std::to_string(accountId)); + std::string sql = ""; + sql.append("SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::ACCOUNT_ID) + .append(" = ? AND ") + .append(RawContactColumns::CONTACT_ID) + .append(" NOT NULL AND ") + .append(RawContactColumns::CONTACT_ID) + .append(" NOT IN (") + .append(" SELECT ") + .append(RawContactColumns::CONTACT_ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::ACCOUNT_ID) + .append(" != ?") + .append(" AND ") + .append(RawContactColumns::CONTACT_ID) + .append(" NOT NULL )"); + std::unique_ptr rawResult = store_->QuerySql(sql, selectArgs); + int resultSetNum = rawResult->GoToFirstRow(); + int currConcactIdValue = 0; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int currValueIndex = 0; + rawResult->GetColumnIndex(RawContactColumns::CONTACT_ID, currValueIndex); + rawResult->GetInt(currValueIndex, currConcactIdValue); + if (currConcactIdValue > 0) { + break; + } + resultSetNum = rawResult->GoToNextRow(); + } + rawResult->Close(); + return currConcactIdValue; +} + +int RawContacts::GetDeleteRawContactIdByAccountId(std::shared_ptr rdbStore, int accountId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("RawContacts GetDeleteRawContactIdByAccountId store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (accountId < ID_EMPTITY) { + HILOG_ERROR("RawContacts GetDeleteContactIdByAccountId accountId illegal"); + return OPERATION_ERROR; + } + std::vector selectArgs; + selectArgs.push_back(std::to_string(accountId)); + std::string sql = ""; + sql.append("SELECT ") + .append(RawContactColumns::ID) + .append(" FROM ") + .append(ContactTableName::RAW_CONTACT) + .append(" WHERE ") + .append(RawContactColumns::ACCOUNT_ID) + .append(" = ?") + .append(" AND ") + .append(RawContactColumns::ACCOUNT_ID) + .append(" NOT NULL"); + std::unique_ptr rawResult = store_->QuerySql(sql, selectArgs); + int resultSetNum = rawResult->GoToFirstRow(); + int currConcactIdValue = 0; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + rawResult->GetInt(0, currConcactIdValue); + if (currConcactIdValue > 0) { + break; + } + resultSetNum = rawResult->GoToNextRow(); + } + rawResult->Close(); + return currConcactIdValue; +} + +int RawContacts::DeleteRawcontactByRawId( + std::shared_ptr rdbStore, int needDeleteRawContactId) +{ + std::shared_ptr &store_ = rdbStore; + if (store_ == nullptr) { + HILOG_ERROR("RawContacts DeleteRawcontactByRawId store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (needDeleteRawContactId < ID_EMPTITY) { + HILOG_ERROR("RawContacts DeleteRawcontactByRawId needDeleteRawContactId illegal"); + return OPERATION_ERROR; + } + int rowId = OHOS::NativeRdb::E_OK; + std::vector whereArgs; + whereArgs.push_back(std::to_string(needDeleteRawContactId)); + std::string whereCase; + whereCase.append(RawContactColumns::ID).append(" = ?"); + int delRawContact = store_->Delete(rowId, ContactTableName::RAW_CONTACT, whereCase, whereArgs); + HILOG_INFO("DeleteRawcontactByRawId : status is %{public}d", delRawContact); + return delRawContact; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/quicksearch/include/contacts_search.h b/dataBusiness/quicksearch/include/contacts_search.h new file mode 100644 index 0000000..0215aad --- /dev/null +++ b/dataBusiness/quicksearch/include/contacts_search.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACT_SEARCH_H +#define CONTACT_SEARCH_H + +#include "rdb_store.h" + +namespace OHOS { +namespace Contacts { +class ContactsSearch { +public: + ContactsSearch(); + ~ContactsSearch(); + int64_t Insert(std::shared_ptr rdbStore, int64_t contactId, int64_t rawContactId, + OHOS::NativeRdb::ValuesBucket rawContactValues, int64_t &searchContactId); + // Convert the rawcontact table insert parameter to the searchcontact table parameter + OHOS::NativeRdb::ValuesBucket StructureSearchContactDataValueBucket( + OHOS::NativeRdb::ValuesBucket searchContactValues); + int UpdateSearchContact(int rawContactId, std::string type, std::shared_ptr rdbStore, + OHOS::NativeRdb::ValuesBucket linkDataDataValues); +}; +} // namespace Contacts +} // namespace OHOS +#endif // CONTACT_SEARCH_H diff --git a/dataBusiness/quicksearch/src/contacts_search.cpp b/dataBusiness/quicksearch/src/contacts_search.cpp new file mode 100644 index 0000000..8d60394 --- /dev/null +++ b/dataBusiness/quicksearch/src/contacts_search.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2021 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 "contacts_search.h" + +#include "rdb_errno.h" +#include "result_set.h" + +#include "character_transliterate.h" +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +ContactsSearch::ContactsSearch(void) +{ +} + +ContactsSearch::~ContactsSearch() +{ +} + +int64_t ContactsSearch::Insert(std::shared_ptr rdbStore, int64_t contactId, + int64_t rawContactId, OHOS::NativeRdb::ValuesBucket rawContactValues, int64_t &searchContactId) +{ + // searchContact insert data + OHOS::NativeRdb::ValuesBucket searchContactValues = StructureSearchContactDataValueBucket(rawContactValues); + // add raw_contact_id + searchContactValues.PutInt(SearchContactColumns::RAW_CONTACT_ID, rawContactId); + // add contact_id + searchContactValues.PutInt(SearchContactColumns::CONTACT_ID, contactId); + int rowSearchContactRet = rdbStore->Insert(searchContactId, ContactTableName::SEARCH_CONTACT, searchContactValues); + return rowSearchContactRet; +} + +/** + * @brief ContactsDataBase update by quick_search_key + * + * @param rawContactId Parameters to be passed for update operation + * @param type Parameters to be passed for update operation + * @param rdbStore Conditions for update operation + * @param searchContactValues Parameters to be passed for update operation + * + * @return The result returned by the update operation + */ +int ContactsSearch::UpdateSearchContact(int rawContactId, std::string type, + std::shared_ptr rdbStore, OHOS::NativeRdb::ValuesBucket searchContactValues) +{ + int ret = OHOS::NativeRdb::E_OK; + std::string upWhereClause; + upWhereClause.append(SearchContactColumns::RAW_CONTACT_ID).append(" = ?"); + std::vector upWhereArgs; + upWhereArgs.push_back(std::to_string(rawContactId)); + int changedRows; + // update search_contact table name + ret = rdbStore->Update( + changedRows, ContactTableName::SEARCH_CONTACT, searchContactValues, upWhereClause, upWhereArgs); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("ContactsUpdateHelper UpdateDisplay UpdateSearchContact fail:%{public}d", ret); + } + return ret; +} + +/** + * @brief Convert the rawcontact table insert parameter to the searchcontact table parameter + * + * @param rawContactValues Parameters to be passed for convert operation + * + * @return The result returned by the convert operation + */ +OHOS::NativeRdb::ValuesBucket ContactsSearch::StructureSearchContactDataValueBucket( + OHOS::NativeRdb::ValuesBucket rawContactValues) +{ + // Will raw_ Convert contact table data to searchcontact table data + OHOS::NativeRdb::ValuesBucket searchContactValueBucket; + if (rawContactValues.HasColumn(RawContactColumns::ACCOUNT_ID)) { + int accountId; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(RawContactColumns::ACCOUNT_ID, value); + value.GetInt(accountId); + searchContactValueBucket.PutInt(SearchContactColumns::ACCOUNT_ID, accountId); + } + if (rawContactValues.HasColumn(RawContactColumns::DISPLAY_NAME)) { + std::string disPlayName; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(RawContactColumns::DISPLAY_NAME, value); + value.GetString(disPlayName); + searchContactValueBucket.PutString(SearchContactColumns::DISPLAY_NAME, disPlayName); + } + if (rawContactValues.HasColumn(RawContactColumns::PHONETIC_NAME)) { + std::string phoneticName; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(RawContactColumns::PHONETIC_NAME, value); + value.GetString(phoneticName); + searchContactValueBucket.PutString(SearchContactColumns::PHONETIC_NAME, phoneticName); + } + if (rawContactValues.HasColumn(RawContactColumns::PHOTO_FILE_ID)) { + int photoFileId; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(RawContactColumns::PHOTO_FILE_ID, value); + value.GetInt(photoFileId); + searchContactValueBucket.PutInt(SearchContactColumns::PHOTO_FILE_ID, photoFileId); + } + if (rawContactValues.HasColumn(RawContactColumns::PHOTO_ID)) { + int photoId; + OHOS::NativeRdb::ValueObject value; + rawContactValues.GetObject(RawContactColumns::PHOTO_ID, value); + value.GetInt(photoId); + searchContactValueBucket.PutInt(SearchContactColumns::PHOTO_ID, photoId); + } + return searchContactValueBucket; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/dataBusiness/voicemail/include/voicemail_ability.h b/dataBusiness/voicemail/include/voicemail_ability.h new file mode 100644 index 0000000..f81d214 --- /dev/null +++ b/dataBusiness/voicemail/include/voicemail_ability.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef VOICEMAIL_ABILITY_H +#define VOICEMAIL_ABILITY_H + +#include "ability.h" +#include "ability_loader.h" +#include "voicemail_database.h" +#include "want.h" + +namespace OHOS { +namespace AppExecFwk { +class VoiceMailAbility : public Ability { +public: + VoiceMailAbility(); + ~VoiceMailAbility(); + virtual int Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) override; + virtual int BatchInsert(const Uri &uri, const std::vector &values) override; + virtual void OnStart(const Want &want) override; + virtual int Update(const Uri &uri, const NativeRdb::ValuesBucket &value, + const NativeRdb::DataAbilityPredicates &predicates) override; + virtual int Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual std::shared_ptr Query(const Uri &uri, + const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) override; + virtual void Dump(const std::string &extra) override; + +private: + static std::shared_ptr voiceMailDataBase_; + static std::map uriValueMap_; + int InsertExecute(const OHOS::Uri &uri, const NativeRdb::ValuesBucket &value); + void DataBaseNotifyChange(int code, Uri uri); + bool IsBeginTransactionOK(int code, std::mutex &mutex); + bool IsCommitOK(int code, std::mutex &mutex); + int UriParse(Uri &uri); +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // VOICEMAIL_ABILITY_H \ No newline at end of file diff --git a/dataBusiness/voicemail/include/voicemail_database.h b/dataBusiness/voicemail/include/voicemail_database.h new file mode 100644 index 0000000..1acb50e --- /dev/null +++ b/dataBusiness/voicemail/include/voicemail_database.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef VOICEMAIL_DATABASE_H +#define VOICEMAIL_DATABASE_H + +#include "data_ability_predicates.h" +#include "rdb_errno.h" +#include "rdb_helper.h" +#include "rdb_open_callback.h" +#include "rdb_predicates.h" +#include "rdb_store.h" +#include "result_set.h" +#include "value_object.h" + +#include "common.h" +#include "contacts_columns.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace Contacts { +class VoiceMailDataBase { +public: + static std::shared_ptr GetInstance(); + static std::shared_ptr store_; + int64_t InsertVoiceMail(std::string tableName, OHOS::NativeRdb::ValuesBucket insertValues); + int UpdateVoiceMail(OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates); + int DeleteVoiceMail(OHOS::NativeRdb::RdbPredicates &rdbPredicates); + std::unique_ptr Query( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, const std::vector columns); + int BeginTransaction(); + int Commit(); + int RollBack(); + +private: + VoiceMailDataBase(); + VoiceMailDataBase(const VoiceMailDataBase &); + const VoiceMailDataBase &operator=(const VoiceMailDataBase &); + static std::shared_ptr voiceMailDataBase_; +}; +} // namespace Contacts +} // namespace OHOS +#endif // VOICEMAIL_DATABASE_H diff --git a/dataBusiness/voicemail/src/voicemail_ability.cpp b/dataBusiness/voicemail/src/voicemail_ability.cpp new file mode 100644 index 0000000..5684100 --- /dev/null +++ b/dataBusiness/voicemail/src/voicemail_ability.cpp @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2021 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 "voicemail_ability.h" + +#include + +#include "ability_loader.h" +#include "common.h" +#include "contacts_columns.h" +#include "contacts_common_event.h" +#include "data_ability_predicates.h" +#include "file_utils.h" +#include "predicates_convert.h" +#include "rdb_predicates.h" +#include "sql_analyzer.h" +#include "uri_utils.h" + +namespace OHOS { +namespace AppExecFwk { +REGISTER_AA(VoiceMailAbility); +namespace { +std::mutex g_mutex; +} +std::shared_ptr VoiceMailAbility::voiceMailDataBase_ = nullptr; +std::map VoiceMailAbility::uriValueMap_ = { + {"/com.ohos.voicemailability/calls/voicemail", Contacts::VOICEMAIL}, + {"/com.ohos.voicemailability/calls/replaying", Contacts::REPLAYING} +}; + +VoiceMailAbility::VoiceMailAbility() +{ +} + +VoiceMailAbility::~VoiceMailAbility() +{ +} + +void VoiceMailAbility::Dump(const std::string &extra) +{ + HILOG_ERROR("VoiceMailAbility ====>Dump:%{public}s", extra.c_str()); + Contacts::FileUtils fileUtils; + std::string dirStr = Contacts::ContactsPath::DUMP_PATH; + fileUtils.WriteStringToFileAppend(dirStr, extra); +} + +void VoiceMailAbility::OnStart(const Want &want) +{ + Ability::OnStart(want); + std::string basePath = GetDatabaseDir(); + Contacts::ContactsPath::RDB_PATH = basePath + "/"; + Contacts::ContactsPath::RDB_BACKUP_PATH = basePath + "/backup/"; + Contacts::ContactsPath::DUMP_PATH = GetFilesDir() + "/"; +} + +/** + * @brief VoiceMailAbility BeginTransaction emptiness problems + * + * @param code the return number of BeginTransaction + * @param mutex transmission parameter : lock + * + * @return BeginTransaction emptiness true or false + */ +bool VoiceMailAbility::IsBeginTransactionOK(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsBeginTransactionOK fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief VoiceMailAbility Commit emptiness problems + * + * @param code the return number of Commit + * @param mutex transmission parameter : lock + * + * @return Commit emptiness true or false + */ +bool VoiceMailAbility::IsCommitOK(int code, std::mutex &mutex) +{ + mutex.try_lock(); + if (code != 0) { + HILOG_ERROR("IsCommitOK fail"); + mutex.unlock(); + return false; + } + return true; +} + +/** + * @brief VoiceMailAbility Insert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data value of the database + * + * @return Insert database results code + */ +int VoiceMailAbility::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value) +{ + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("VoiceMailAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + voiceMailDataBase_ = Contacts::VoiceMailDataBase::GetInstance(); + int rowRet = Contacts::RDB_EXECUTE_FAIL; + int ret = voiceMailDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + rowRet = InsertExecute(uri, value); + if (rowRet == Contacts::OPERATION_ERROR) { + ret = voiceMailDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::OPERATION_ERROR; + } + ret = voiceMailDataBase_->Commit(); + if (!IsCommitOK(ret, g_mutex)) { + voiceMailDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + return rowRet; +} + +int VoiceMailAbility::UriParse(Uri &uri) +{ + Contacts::UriUtils uriUtils; + int parseCode = uriUtils.UriParse(uri, uriValueMap_); + return parseCode; +} + +int VoiceMailAbility::InsertExecute(const OHOS::Uri &uri, const NativeRdb::ValuesBucket &initialValues) +{ + int rowId = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int code = UriParse(uriTemp); + switch (code) { + case Contacts::VOICEMAIL: + rowId = voiceMailDataBase_->InsertVoiceMail(Contacts::CallsTableName::VOICEMAIL, initialValues); + break; + case Contacts::REPLAYING: + rowId = voiceMailDataBase_->InsertVoiceMail(Contacts::CallsTableName::REPLYING, initialValues); + break; + default: + HILOG_ERROR("VoiceMailAbility ====>no match uri action"); + break; + } + return rowId; +} + +/** + * @brief VoiceMailAbility BatchInsert database + * + * @param uri Determine the data table name based on the URI + * @param value Insert the data values of the database + * + * @return BatchInsert database results code + */ +int VoiceMailAbility::BatchInsert(const Uri &uri, const std::vector &values) +{ + int size = values.size(); + if (size <= 0) { + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + voiceMailDataBase_ = Contacts::VoiceMailDataBase::GetInstance(); + int ret = voiceMailDataBase_->BeginTransaction(); + if (!IsBeginTransactionOK(ret, g_mutex)) { + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + int count = 0; + for (int i = 0; i < size; i++) { + ++count; + OHOS::NativeRdb::ValuesBucket rawContactValues = values[i]; + int code = InsertExecute(uri, rawContactValues); + if (code == Contacts::OPERATION_ERROR) { + voiceMailDataBase_->RollBack(); + g_mutex.unlock(); + return code; + } + if (count % Contacts::BATCH_INSERT_COUNT == 0) { + int markRet = voiceMailDataBase_->Commit(); + int beginRet = voiceMailDataBase_->BeginTransaction(); + if (!IsCommitOK(markRet, g_mutex) || !IsBeginTransactionOK(beginRet, g_mutex)) { + voiceMailDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + } + } + int markRet = voiceMailDataBase_->Commit(); + if (!IsCommitOK(markRet, g_mutex) ) { + voiceMailDataBase_->RollBack(); + g_mutex.unlock(); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_INSERT, uri); + return Contacts::RDB_EXECUTE_OK; +} + +/** + * @brief VoiceMailAbility Update database + * + * @param uri Determine the data table name based on the URI + * @param predicates Update the data value of the condition + * + * @return Update database results code + */ +int VoiceMailAbility::Update( + const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates) +{ + Contacts::SqlAnalyzer sqlAnalyzer; + bool isOk = sqlAnalyzer.CheckValuesBucket(value); + if (!isOk) { + HILOG_ERROR("VoiceMailAbility CheckValuesBucket is error"); + return Contacts::RDB_EXECUTE_FAIL; + } + g_mutex.lock(); + voiceMailDataBase_ = Contacts::VoiceMailDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + int ret = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int code = UriParse(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (code) { + case Contacts::VOICEMAIL: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::VOICEMAIL, dataAbilityPredicates); + ret = voiceMailDataBase_->UpdateVoiceMail(value, rdbPredicates); + break; + case Contacts::REPLAYING: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::REPLYING, dataAbilityPredicates); + ret = voiceMailDataBase_->UpdateVoiceMail(value, rdbPredicates); + break; + default: + HILOG_ERROR("VoiceMailAbility ====>no match uri action"); + break; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_UPDATE, uri); + return ret; +} + +/** + * @brief VoiceMailAbility Delete database + * + * @param uri Determine the data table name based on the URI + * @param predicates Delete the data values of the condition + * + * @return Delete database results code + */ +int VoiceMailAbility::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates) +{ + g_mutex.lock(); + voiceMailDataBase_ = Contacts::VoiceMailDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + int ret = Contacts::RDB_EXECUTE_FAIL; + OHOS::Uri uriTemp = uri; + int parseCode = UriParse(uriTemp); + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + switch (parseCode) { + case Contacts::VOICEMAIL: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::VOICEMAIL, dataAbilityPredicates); + ret = voiceMailDataBase_->DeleteVoiceMail(rdbPredicates); + break; + case Contacts::REPLAYING: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::REPLYING, dataAbilityPredicates); + ret = voiceMailDataBase_->DeleteVoiceMail(rdbPredicates); + break; + default: + HILOG_ERROR("VoiceMailAbility ====>no match uri action"); + break; + } + g_mutex.unlock(); + DataBaseNotifyChange(Contacts::CONTACT_DELETE, uri); + return ret; +} + +/** + * @brief VoiceMailAbility Query database + * + * @param uri Determine the data table name based on the URI + * @param columns Columns returned by query + * @param predicates Query the data values of the condition + * + * @return Query database results + */ +std::shared_ptr VoiceMailAbility::Query( + const Uri &uri, const std::vector &columns, const NativeRdb::DataAbilityPredicates &predicates) +{ + HILOG_ERROR("VoiceMailAbility ====>Query start"); + voiceMailDataBase_ = Contacts::VoiceMailDataBase::GetInstance(); + Contacts::PredicatesConvert predicatesConvert; + OHOS::Uri uriTemp = uri; + int parseCode = UriParse(uriTemp); + std::shared_ptr result; + OHOS::NativeRdb::DataAbilityPredicates dataAbilityPredicates = predicates; + OHOS::NativeRdb::RdbPredicates rdbPredicates(""); + std::vector columnsTemp = columns; + switch (parseCode) { + case Contacts::VOICEMAIL: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::VOICEMAIL, dataAbilityPredicates); + result = voiceMailDataBase_->Query(rdbPredicates, columnsTemp); + break; + case Contacts::REPLAYING: + rdbPredicates = + predicatesConvert.ConvertPredicates(Contacts::CallsTableName::REPLYING, dataAbilityPredicates); + result = voiceMailDataBase_->Query(rdbPredicates, columnsTemp); + break; + default: + HILOG_ERROR("VoiceMailAbility ====>no match uri action"); + break; + } + std::shared_ptr sharedPtrResult = std::move(result); + HILOG_ERROR("VoiceMailAbility ====>Query end"); + return sharedPtrResult; +} + +void VoiceMailAbility::DataBaseNotifyChange(int code, Uri uri) +{ + Contacts::ContactsCommonEvent::SendCallLogChange(code); + std::string path = uri.GetPath(); +} +} // namespace AppExecFwk +} // namespace OHOS diff --git a/dataBusiness/voicemail/src/voicemail_database.cpp b/dataBusiness/voicemail/src/voicemail_database.cpp new file mode 100644 index 0000000..369ef99 --- /dev/null +++ b/dataBusiness/voicemail/src/voicemail_database.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021 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 "voicemail_database.h" + +#include "calllog_database.h" +#include "predicates_convert.h" + +namespace OHOS { +namespace Contacts { +std::shared_ptr VoiceMailDataBase::voiceMailDataBase_ = nullptr; +std::shared_ptr VoiceMailDataBase::store_ = nullptr; + +VoiceMailDataBase::VoiceMailDataBase() +{ + store_ = CallLogDataBase::GetInstance()->store_; +} + +std::shared_ptr VoiceMailDataBase::GetInstance() +{ + if (voiceMailDataBase_ == nullptr) { + voiceMailDataBase_.reset(new VoiceMailDataBase()); + return voiceMailDataBase_; + } + return voiceMailDataBase_; +} + +int64_t VoiceMailDataBase::InsertVoiceMail(std::string tableName, OHOS::NativeRdb::ValuesBucket insertValues) +{ + int64_t outRowId = RDB_EXECUTE_FAIL; + if (store_ == nullptr) { + HILOG_ERROR("VoiceMailDataBase Insert store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + CallLogDataBase::GetInstance()->QueryContactsByInsertCalls(insertValues); + int ret = store_->Insert(outRowId, tableName, insertValues); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("VoiceMailDataBase InsertVoiceMail ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return outRowId; +} + +int VoiceMailDataBase::UpdateVoiceMail( + OHOS::NativeRdb::ValuesBucket values, OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + int changedRows = RDB_EXECUTE_FAIL; + if (store_ == nullptr) { + HILOG_ERROR("VoiceMailDataBase Update store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + if (values.HasColumn(CallLogColumns::PHONE_NUMBER)) { + CallLogDataBase::GetInstance()->QueryContactsByInsertCalls(values); + } + int ret = store_->Update(changedRows, values, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("VoiceMailDataBase Update ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +int VoiceMailDataBase::DeleteVoiceMail(OHOS::NativeRdb::RdbPredicates &rdbPredicates) +{ + int deletedRows = RDB_EXECUTE_FAIL; + if (store_ == nullptr) { + HILOG_ERROR("VoiceMailDataBase Delete store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->Delete(deletedRows, rdbPredicates); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("VoiceMailDataBase Delete ret :%{public}d", ret); + return RDB_EXECUTE_FAIL; + } + return ret; +} + +std::unique_ptr VoiceMailDataBase::Query( + OHOS::NativeRdb::RdbPredicates &rdbPredicates, const std::vector columns) +{ + if (store_ == nullptr) { + HILOG_ERROR("CallLogDataBase Delete store_ is nullptr"); + return nullptr; + } + std::unique_ptr resultSet = store_->Query(rdbPredicates, columns); + return resultSet; +} + +int VoiceMailDataBase::BeginTransaction() +{ + if (store_ == nullptr) { + HILOG_ERROR("VoiceMailDataBase BeginTransaction store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->BeginTransaction(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR("VoiceMailDataBase BeginTransaction fail :%{public}d", ret); + } + return ret; +} + +int VoiceMailDataBase::Commit() +{ + if (store_ == nullptr) { + HILOG_ERROR(" VoiceMailDataBase Commit store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->Commit(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR(" VoiceMailDataBase Commit fail :%{public}d", ret); + } + return ret; +} + +int VoiceMailDataBase::RollBack() +{ + if (store_ == nullptr) { + HILOG_ERROR(" VoiceMailDataBase RollBack store_ is nullptr"); + return RDB_OBJECT_EMPTY; + } + int ret = store_->RollBack(); + if (ret != OHOS::NativeRdb::E_OK) { + HILOG_ERROR(" VoiceMailDataBase RollBack fail :%{public}d", ret); + } + return ret; +} +} // namespace Contacts +} // namespace OHOS \ No newline at end of file diff --git a/figures/Image_architecture.png b/figures/Image_architecture.png new file mode 100644 index 0000000..168d523 Binary files /dev/null and b/figures/Image_architecture.png differ diff --git a/jstest/Calllog_test.js b/jstest/Calllog_test.js new file mode 100644 index 0000000..05e3012 --- /dev/null +++ b/jstest/Calllog_test.js @@ -0,0 +1,1297 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CALLLOG = "dataability:///com.ohos.calllogability"; +const calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +import common from './common.js'; + +describe('CalllogTest', function() { + console.log("----------CalllogTest is starting!----------"); + + async function calllogQueryForALL(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': calllogQueryByInsert start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ' : logMessage calllogQueryByInsert key = ' + key + + ' dbResult :' + dbresult + ' value : ' + value); + console.info(tag + ' : logMessage calllogQueryByInsert value ' + (value == dbresult)); + expect(value == dbresult).assertEqual(true); + } + } while (resultSet.goToNextRow()); + } + } + console.info(tag + " :logMessage calllogQueryByInsert: end"); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage calllogQueryByInsert: error = " + error); + } + } + + async function calllogQueryForDelete(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': calllogQueryForDelete start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage calllogQueryForDelete: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage calllogQueryForDelete: error = " + error); + } + } + + async function calllogQueryForBatchInsert(array, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': calllogQueryForBatchInsert start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", array[0].get("phone_number")); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + var size = array.size(); + console.info(tag + ' : logMessage calllogQueryForBatchInsert: size' + size); + expect(resultSet.rowCount == size).assertEqual(true); + var i = 0; + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of array[i]) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ' : logMessage calllogQueryForBatchInsert dbresult :' + dbresult + + ' value : ' + value); + console.info(tag + ' : logMessage calllogQueryForBatchInsert value ' + (value == dbresult)); + expect(value == dbresult).assertTrue(); + } + i++; + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage calllogQueryByInsert: error = " + error); + } + } + + async function calllogDelete(tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(calllogUri, condition); + console.info(tag + ': calllogDelete deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } + + /** + * @tc.number calllog_insert_test_100 + * @tc.name Insert call log + * @tc.desc Function test + */ + it("calllog_insert_test_100", 0, async function(done) { + console.info("--------logMessage calllog_insert_test_100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var calllogId = await DAHelper.insert(calllogUri, common.getCallLogInsert()); + console.info("logMessage calllog_insert_test_100: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + var map = common.getCallLogInsertMap() + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_insert_test_100"); + await calllogDelete("calllog_insert_test_100"); + done(); + } catch (error) { + console.info("logMessage calllog_insert_test_100: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_update_test_400 + * @tc.name Single call log update + * @tc.desc Function test + */ + it("calllog_update_test_400", 0, async function(done) { + console.info("--------logMessage calllog_update_test_400 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var calllogId = await DAHelper.insert(calllogUri, common.getCallLogInsert()); + console.info("logMessage calllog_update_test_400: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await UpdateOneCalllog(); + done(); + } catch (error) { + console.info("logMessage calllog_update_test_400: calllog insert error = " + error); + done(); + } + + async function UpdateOneCalllog() + { + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + var updateCode = await DAHelper.update(calllogUri, common.getCallLogUpdate(), condition); + console.info("logMessage calllog_update_test_400: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = common.getCallLogUpdateMap(); + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_update_test_400"); + await calllogDelete("calllog_update_test_400"); + } catch (error) { + console.info("logMessage calllog_update_test_400: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_update_test_500 + * @tc.name Update all call logs + * @tc.desc Function test + */ + it("calllog_update_test_500", 0, async function(done) { + console.info("--------logMessage calllog_update_test_500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "1122445566", "ring_duration" : "500"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_update_test_500: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await UpdateAllCalllog(); + done(); + } catch (error) { + console.info("logMessage calllog_update_test_500: calllog insert error = " + error); + done(); + } + async function UpdateAllCalllog() + { + var updateValues = {"answer_state" : "1"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var updateCode = await DAHelper.update(calllogUri, updateValues, condition) + console.info("logMessage calllog_update_test_500: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map([ [ "phone_number", "1122445566" ], [ "ring_duration", "500" ] ]) + map.set("id", calllogId.toString()); + map.set("answer_state", "1"); + await calllogQueryForALL(map, "calllog_update_test_500"); + await calllogDelete("calllog_update_test_500"); + } catch (error) { + console.info("logMessage calllog_update_test_500: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_delete_test_1300 + * @tc.name Delete call log + * @tc.desc Function test + */ + it("calllog_delete_test_1300", 0, async function(done) { + console.info("--------logMessage calllog_delete_test_1300 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "123456", "ring_duration" : "200"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_delete_test_1300: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await DeleteOneCalllog(); + done(); + } catch (error) { + console.info("logMessage calllog_delete_test_1300: calllog insert error = " + error); + done(); + } + + async function DeleteOneCalllog() + { + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + var deleteCode = await DAHelper.delete(calllogUri, condition); + console.info("logMessage calllog_delete_test_1300: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + await calllogQueryForDelete(map, "calllog_delete_test_1300"); + } catch (error) { + console.info("logMessage calllog_delete_test_1300: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_batchInset_test_1600 + * @tc.name Insert call logs in batches + * @tc.desc Function test + */ + it("calllog_batchInset_test_1600", 0, async function(done) { + console.info("--------logMessage calllog_batchInset_test_1600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var addBulk_value1 = {"phone_number" : "1600", "ring_duration" : "333"}; + var addBulk_value2 = {"phone_number" : "1600", "ring_duration" : "600"}; + var addBulk_value3 = {"phone_number" : "1600", "ring_duration" : "600"}; + var addBulk_value4 = {"phone_number" : "1600", "ring_duration" : "600"}; + var addBulk_value5 = {"phone_number" : "1600", "ring_duration" : "600"}; + var listAddBluk = []; + listAddBluk[0] = addBulk_value1; + listAddBluk[1] = addBulk_value2; + listAddBluk[2] = addBulk_value3; + listAddBluk[3] = addBulk_value4; + listAddBluk[4] = addBulk_value5; + try { + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + console.info("logMessage calllog_batchInset_test_1600: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await calllogQueryForBatchInsert(common.getCallLogBatchInsert(), "calllog_batchInset_test_1600"); + await calllogDelete("calllog_batchInset_test_1600"); + done(); + } catch (error) { + console.info("logMessage calllog_batchInset_test_1600: error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_query_test_1200 + * @tc.name Query all call logs + * @tc.desc Function test + */ + it("calllog_query_test_1200", 0, async function(done) { + console.info("------------calllog_query_test_1200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "123566456", "ring_duration" : "200"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_query_test_1200: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + var map = new Map([ [ "phone_number", "123566456" ], [ "ring_duration", "200" ] ]); + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_query_test_1200"); + await calllogDelete("calllog_query_test_1200"); + done(); + } catch (error) { + console.info("logMessage calllog_query_test_1200: calllog insert error = " + error); + } + }); + + /** + * @tc.number calllog_query_test_1100 + * @tc.name Query call logs of combined conditions + * @tc.desc Function test + */ + it("calllog_query_test_1100", 0, async function(done) { + console.info("------------calllog_query_test_1100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {"phone_number" : "44325008", "ring_duration" : "100"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_query_test_1100: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryCalllog(); + await calllogDelete("calllog_query_test_1100"); + done() + } catch (error) { + console.info("logMessage calllog_query_test_1100: calllog insert error = " + error); + done(); + } + + async function QueryCalllog() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.lessThan("ring_duration", "200").orderByAsc("id"); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage calllog_query_test_1100: columnNames:" + resultSet.columnNames); + console.info("logMessage calllog_query_test_1100: columnCount:" + resultSet.columnCount); + console.info('logMessage calllog_query_test_1100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == calllogId.toString()).assertTrue(); + console.info('logMessage calllog_query_test_1100: phone_number = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "44325008").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_query_test_1100: query error:" + error); + done(); + } + } + }); + + /** + * @tc.number calllog_query_test_800 + * @tc.name Query a single call log + * @tc.desc Function test + */ + it("calllog_query_test_800", 0, async function(done) { + console.info("------------calllog_query_test_800 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "88888888888", "ring_duration" : "100"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_query_test_800: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryOneCalllog(); + await calllogDelete("calllog_query_test_800"); + done(); + } catch (error) { + console.info("logMessage calllog_query_test_800: calllog insert error = " + error); + done(); + } + + async function QueryOneCalllog() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage calllog_query_test_800: columnNames:" + resultSet.columnNames); + console.info("logMessage calllog_query_test_800: columnCount:" + resultSet.columnCount); + console.info('logMessage calllog_query_test_800: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == calllogId.toString()).assertTrue(); + console.info('logMessage calllog_query_test_800: phone_number = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "88888888888").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_query_test_800: query error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_fuzzyquery_test_100 + * @tc.name Fuzzy query ability based on mobile phone number (beginning of a certain field) + * @tc.desc Function test + */ + it("calllog_fuzzyquery_test_100", 0, async function(done) { + console.info("------------calllog_fuzzyquery_test_100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "196320147"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_fuzzyquery_test_100: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryByStartsWithPhoneNumber(); + await calllogDelete("calllog_fuzzyquery_test_100"); + done(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_100: calllog insert error = " + error); + done(); + } + + async function QueryByStartsWithPhoneNumber() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phone_number", "196%"); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage calllog_fuzzyquery_test_100: columnNames:" + resultSet.columnNames); + console.info("logMessage calllog_fuzzyquery_test_100: columnCount:" + resultSet.columnCount); + console.info('logMessage calllog_fuzzyquery_test_100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == calllogId.toString()).assertTrue(); + console.info( + 'logMessage calllog_fuzzyquery_test_100: phone_number = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "196320147").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_100: query error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_fuzzyquery_test_200 + * @tc.name Fuzzy query ability based on mobile phone number (at the end of a certain field) + * @tc.desc Function test + */ + it("calllog_fuzzyquery_test_200", 0, async function(done) { + console.info("------------calllog_fuzzyquery_test_200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "126467821"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_fuzzyquery_test_200: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryByEndWithPhoneNumber(); + await calllogDelete("calllog_fuzzyquery_test_200"); + done(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_200: calllog insert error = " + error); + done(); + } + + async function QueryByEndWithPhoneNumber() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phone_number", "%821"); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage calllog_fuzzyquery_test_200: columnNames:" + resultSet.columnNames); + console.info("logMessage calllog_fuzzyquery_test_200: columnCount:" + resultSet.columnCount); + console.info('logMessage calllog_fuzzyquery_test_200: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == calllogId.toString()).assertTrue(); + console.info( + 'logMessage calllog_fuzzyquery_test_200: phone_number = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "126467821").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_200: query error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_fuzzyquery_test_300 + * @tc.name Fuzzy query ability based on mobile phone number (including a certain field) + * @tc.desc Function test + */ + it("calllog_fuzzyquery_test_300", 0, async function(done) { + console.info("------------calllog_fuzzyquery_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "1234567855557568"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_fuzzyquery_test_300: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryByPhoneNumberContainsField(); + await calllogDelete("calllog_fuzzyquery_test_300"); + done(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_300: calllog insert error = " + error); + done(); + } + + async function QueryByPhoneNumberContainsField() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phone_number", "%555%"); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage calllog_fuzzyquery_test_300: columnNames:" + resultSet.columnNames); + console.info("logMessage calllog_fuzzyquery_test_300: columnCount:" + resultSet.columnCount); + console.info('logMessage calllog_fuzzyquery_test_300: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == calllogId.toString()).assertTrue(); + console.info( + 'logMessage calllog_fuzzyquery_test_300: phone_number = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "1234567855557568").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_fuzzyquery_test_300: query error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_insert_test_200 + * @tc.name Abnormal use case, an incorrect field is passed in when inserting data + * @tc.desc Function test + */ + it("abnormal_calllog_insert_test_200", 0, async function(done) { + console.info("------------abnormal_calllog_insert_test_200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_numbers" : "1111111111"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_insert_test_200: calllogId = " + calllogId); + expect(calllogId == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_insert_test_200: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_calllog_insert_test_300 + * @tc.name Abnormal use case, an incorrect table name is passed in when inserting data + * @tc.desc Function test + */ + it("abnormal_calllog_insert_test_300", 0, async function(done) { + console.info("------------abnormal_calllog_insert_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/calllogs"; + + var insertValues = {"phone_number" : "456789410"}; + try { + var calllogId = await DAHelper.insert(errorUri, insertValues); + console.info("logMessage abnormal_calllog_insert_test_300: calllogId = " + calllogId); + expect(calllogId == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_insert_test_300: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_calllog_update_test_600 + * @tc.name Abnormal use case, passing in a wrong field when updating data + * @tc.desc Function test + */ + it("abnormal_calllog_update_test_600", 0, async function(done) { + console.info("------------abnormal_calllog_update_test_600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "1020202020"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_update_test_600: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await abnormalUpdate(); + await calllogDelete("abnormal_calllog_update_test_600"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_600: calllog insert error = " + error); + done(); + } + + async function abnormalUpdate() + { + var updateValues = {"phone_numbers" : "22001122"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", calllogId.toString()); + try { + var updataCode = await DAHelper.update(calllogUri, updateValues, condition); + console.info("logMessage abnormal_calllog_update_test_600: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("phone_number", "1020202020"); + await calllogQueryForALL(map, "abnormal_calllog_update_test_600"); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_600: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_update_test_700 + * @tc.name Abnormal use case, an incorrect table name is passed in when updating data + * @tc.desc Function test + */ + it("abnormal_calllog_update_test_700", 0, async function(done) { + console.info("------------abnormal_calllog_update_test_700 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/calllogs"; + + var insertValues = {"phone_number" : "9952364"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_update_test_700: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await abnormalUpdate(); + await calllogDelete("abnormal_calllog_update_test_700"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_700: calllog insert error = " + error); + done(); + } + + async function abnormalUpdate() + { + var updateValues = {"phone_numbers" : "22001122"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + try { + var updataCode = await DAHelper.update(errorUri, updateValues, condition); + console.info("logMessage abnormal_calllog_update_test_700: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("phone_number", "9952364"); + await calllogQueryForALL(map, "abnormal_calllog_update_test_700"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_700: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_delete_test_1400 + * @tc.name Abnormal use case, passing in a wrong field when deleting data + * @tc.desc Function test + */ + it("abnormal_calllog_delete_test_1400", 0, async function(done) { + console.info("------------abnormal_calllog_delete_test_1400 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "789130"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_delete_test_1400: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await abnormalDelete(); + await calllogDelete("abnormal_calllog_delete_test_1400"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_1400: calllog insert error = " + error); + done(); + } + + async function abnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", calllogId.toString()); + try { + var deleteCode = await DAHelper.delete(calllogUri, condition); + console.info("logMessage abnormal_calllog_delete_test_1400: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("phone_number", "789130"); + await calllogQueryForALL(map, "abnormal_calllog_delete_test_1400"); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_1400: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_delete_test_1500 + * @tc.name Abnormal use case, passing in an incorrect table name when deleting data + * @tc.desc Function test + */ + it("abnormal_calllog_delete_test_1500", 0, async function(done) { + console.info("------------abnormal_calllog_delete_test_1500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/calllogs"; + + var insertValues = {"phone_number" : "1564721"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_delete_test_1500: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await abnormalDelete(); + await calllogDelete("abnormal_calllog_delete_test_1500"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_1500: calllog insert error = " + error); + done(); + } + + async function abnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + try { + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info("logMessage abnormal_calllog_delete_test_1500: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + done() + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("phone_number", "1564721"); + await calllogQueryForALL(map, "abnormal_calllog_delete_test_1500"); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_1500: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_query_test_900 + * @tc.name Abnormal use case, an incorrect field is passed in when querying + * @tc.desc Function test + */ + it("abnormal_calllog_query_test_900", 0, async function(done) { + console.info("------------abnormal_calllog_query_test_900 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "1564721"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_query_test_900: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await abnormalQuery(); + await calllogDelete("abnormal_calllog_query_test_900"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_900: calllog insert error = " + error); + done(); + } + + async function abnormalQuery() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", calllogId.toString()); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + console.info('logMessage abnormal_calllog_query_test_900: goToFirstRow' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow()).assertEqual(false); + resultSet.close(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_900:query error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_batchinsert_test_1700 + * @tc.name abnormal_batchinsert + * @tc.desc Function test + */ + it("abnormal_calllog_batchinsert_test_1700", 0, async function(done) { + console.info("--------logMessage abnormal_calllog_batchinsert_test_1700 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var addBulk_value1 = {"phone_number" : "5555555555", "ring_duration" : "500"}; + var addBulk_value2 = {"phone_number" : "1511002", "ring_duration" : "100"}; + var addBulk_value3 = {"phone_numbers" : "1521003", "ring_duration" : "100"}; + var addBulk_value4 = {"phone_number" : "1521004", "ring_durations" : "100"}; + var addBulk_value5 = {"phone_number" : "1521005", "ring_duration" : "100"}; + var listAddBluk = []; + listAddBluk[0] = addBulk_value1; + listAddBluk[1] = addBulk_value2; + listAddBluk[2] = addBulk_value3; + listAddBluk[3] = addBulk_value4; + listAddBluk[4] = addBulk_value5; + try { + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + console.info("logMessage abnormal_calllog_batchinsert_test_1700: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_batchinsert_test_1700: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_delete_test_1800 + * @tc.name batchDelete + * @tc.desc Function test + */ + it("calllog_delete_test_1800", 0, async function(done) { + console.info("--------logMessage calllog_delete_test_1800 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var calllogId = await DAHelper.insert(calllogUri, common.getCallLogInsert()); + console.info("logMessage calllog_delete_test_1800: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + var map = common.getCallLogInsertMap() + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_delete_test_1800"); + await executeBatch(); + } catch (error) { + console.info("logMessage calllog_delete_test_1800: calllog insert error = " + error); + done(); + } + + async function executeBatch() + { + console.info("logMessage calllog_delete_test_1800: executeBatch start "); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + DAHelper.executeBatch(URI_CALLLOG, [ { + uri : calllogUri, + type : featureAbility.DataAbilityOperationType.TYPE_DELETE, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage calllog_delete_test_1800: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage calllog_delete_test_1800: data_3 = " + data); + console.info("logMessage calllog_delete_test_1800: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number calllog_update_test_1900 + * @tc.name batchUpdate + * @tc.desc Function test + */ + it("calllog_update_test_1900", 0, async function(done) { + console.info("--------logMessage calllog_update_test_1900 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var calllogId = await DAHelper.insert(calllogUri, common.getCallLogInsert()); + console.info("logMessage calllog_update_test_1900: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + var map = common.getCallLogInsertMap() + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_update_test_1900"); + await executeBatch(); + } catch (error) { + console.info("logMessage calllog_update_test_1900: calllog insert error = " + error); + done(); + } + + async function executeBatch() + { + var updateValues = {"phone_number" : "123456789"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + DAHelper.executeBatch(URI_CALLLOG, [ { + uri : calllogUri, + type : featureAbility.DataAbilityOperationType.TYPE_UPDATE, + valuesBucket : updateValues, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage calllog_update_test_1900: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage calllog_update_test_1900: data_3 = " + data); + console.info("logMessage calllog_update_test_1900: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number calllog_Delete_test_2000 + * @tc.name calllog Delete + * @tc.desc Function test + */ + it("calllog_Delete_test_2000", 0, async function(done) { + console.info("--------logMessage calllog_Delete_test_2000 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {"phone_number" : "123456", "ring_duration" : "200"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + var calllogIdThree = await DAHelper.insert(calllogUri, insertValues); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + expect(calllogIdThree > 0).assertTrue(); + await DeleteCalllog(); + done(); + } catch (error) { + console.info("logMessage calllog_Delete_test_2000: calllog insert error = " + error); + done(); + } + + async function DeleteCalllog() + { + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString()); + condition.or(); + condition.equalTo("id", calllogIdTwo.toString()); + condition.or(); + condition.equalTo("id", calllogIdThree.toString()); + var deleteCode = await DAHelper.delete(calllogUri, condition); + console.info("logMessage calllog_Delete_test_2000: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + var resultColumns = []; + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + expect(resultSet.rowCount == 0).assertTrue(); + resultSet.close(); + } catch (error) { + console.info("logMessage calllog_Delete_test_2000: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number calllog_Delete_test_2100 + * @tc.name calllog Delete + * @tc.desc Function test + */ + it("calllog_Delete_test_2100", 0, async function(done) { + console.info("--------logMessage calllog_Delete_test_2100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var calllogId = await DAHelper.insert(calllogUri, common.getCallLogInsert()); + console.info("logMessage calllog_Delete_test_2100: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + var map = common.getCallLogInsertMap() + map.set("id", calllogId.toString()); + await calllogQueryForALL(map, "calllog_Delete_test_2100"); + await calllogDelete("calllog_Delete_test_2100"); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId); + var resultColumns = []; + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + expect(resultSet.rowCount == 0).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage calllog_Delete_test_2100: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_queryContains_test_2200 + * @tc.name calllog Delete + * @tc.desc Function test + */ + it("calllog_queryContains_test_2200", 0, async function(done) { + console.info("--------logMessage calllog_queryContains_test_2200 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {"phone_number" : "123456789220099999"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage calllog_queryContains_test_2200: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + + var resultColumns = [ "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.contains("phone_number", "99999"); + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var phone = resultSet.getString(resultSet.getColumnIndex("phone_number")); + console.info("logMessage calllog_queryContains_test_2200: phone is = " + phone); + expect(phone == "123456789220099999").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + await calllogDelete(); + done(); + } catch (error) { + console.info("logMessage calllog_queryContains_test_2200: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_calllog_update_test_2300 + * @tc.name Update all call records, pass in a field that does not exist + * @tc.desc Function test + */ + it("abnormal_calllog_update_test_2300", 0, async function(done) { + console.info("--------logMessage abnormal_calllog_update_test_2300 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {phone_number : "15748646546", display_name : "name2300"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + await UpdateOneCalllog(); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_2300: calllog insert error = " + error); + done(); + } + async function UpdateOneCalllog() + { + try { + var insertValues = {phone_number : "15748646546", display_names : "nameUpdateError2300"}; + var condition = + new ohos_data_ability.DataAbilityPredicates(); + var updateCode = await DAHelper.update(calllogUri, insertValues, condition); + console.info("logMessage abnormal_calllog_update_test_2300: updateCode = " + updateCode); + expect(updateCode == -1).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("display_name", "name2300"); + await calllogQueryForALL(map, "abnormal_calllog_update_test_2300"); + map.set("id", calllogIdTwo.toString()); + await calllogQueryForALL(map, "abnormal_calllog_update_test_2300"); + await calllogDelete("calllog_update_test_2300"); + } catch (error) { + console.info("logMessage abnormal_calllog_update_test_2300: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_query_test_2400 + * @tc.name When querying call records based on combined conditions, incorrect field + * names and non-existent data are passed in + * @tc.desc Function test + */ + it("abnormal_calllog_query_test_2400", 0, async function(done) { + console.info("--------logMessage abnormal_calllog_query_test_2400 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {phone_number : "15748646546", display_name : "name2300"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", calllogId.toString() + "ksks"); + var resultColumns = [ "display_names" ]; + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + console.info("abnormal_calllog_query_test_2400: resultSet.rowCount = " + resultSet.rowCount); + expect(resultSet.rowCount == -1).assertTrue(); + resultSet.close(); + await calllogDelete("abnormal_calllog_query_test_2400"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_2400: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_calllog_query_test_2500 + * @tc.name When querying all call records based on combined conditions, incorrect field + * names and non-existent data are passed in + * @tc.desc Function test + */ + it("abnormal_calllog_query_test_2500", 0, async function(done) { + console.info("--------logMessage abnormal_calllog_query_test_2500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {phone_number : "15748646546", display_name : "name2300"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info('abnormal_calllog_query_test_2500 calllogId = ' + calllogId); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + console.info('abnormal_calllog_query_test_2500 calllogIdTwo = ' + calllogIdTwo); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + var resultColumns = [ "display_names" ]; + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + console.info('abnormal_calllog_query_test_2500 resultSet.goToFirstRow() = ' + resultSet.goToFirstRow()); + console.info('abnormal_calllog_query_test_2500 resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.goToFirstRow() == false).assertTrue(); + resultSet.close(); + await calllogDelete("abnormal_calllog_query_test_2500"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_2500: calllog insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_calllog_delete_test_2600 + * @tc.name Batch call records are added, and some of them fail, depending on the processing logic + * @tc.desc Function test + */ + it("abnormal_calllog_delete_test_2600", 0, async function(done) { + console.info("--------logMessage abnormal_calllog_delete_test_2600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {phone_number : "15748646546", display_name : "name2300"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_2600: calllog insert error = " + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", calllogIdTwo.toString()); + condition.or(); + condition.equalTo("id", calllogId.toString()); + var code = await DAHelper.delete(calllogUri, condition); + console.info("logMessage abnormal_calllog_delete_test_2600: code = " + code); + expect(code == -1).assertTrue(); + condition.clear(); + var resultColumns = []; + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + var count = 2; + expect(resultSet.rowCount == count).assertTrue(); + resultSet.close(); + await calllogDelete("abnormal_calllog_delete_test_2600"); + done(); + }); + + /** + * @tc.number abnormal_calllog_delete_test_2700 + * @tc.name When batch call records are modified, the wrong field or table name is passed in + * @tc.desc Function test + */ + it("abnormal_calllog_delete_test_2700", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {phone_number : "270015748646546", display_name : "name2700"} + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + var calllogIdTwo = await DAHelper.insert(calllogUri, insertValues); + expect(calllogId > 0).assertTrue(); + expect(calllogIdTwo > 0).assertTrue(); + await UpdateOneCalllog(); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_2700: calllog insert error = " + error); + done(); + } + async function UpdateOneCalllog() + { + try { + var insertValues = {phone_number : "270015748646546", display_names : "nameUpdateError2700"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", calllogIdTwo.toString()); + condition.or(); + condition.equalTo("id", calllogId.toString()); + var updateCode = await DAHelper.update(calllogUri, insertValues, condition); + console.info("logMessage abnormal_calllog_delete_test_2700: updateCode = " + updateCode); + expect(updateCode == -1).assertTrue(); + var map = new Map(); + map.set("id", calllogId.toString()); + map.set("display_name", "name2700"); + await calllogQueryForALL(map, "abnormal_calllog_delete_test_2700"); + map.set("id", calllogIdTwo.toString()); + await calllogQueryForALL(map, "abnormal_calllog_delete_test_2700"); + await calllogDelete("abnormal_calllog_delete_test_2700"); + } catch (error) { + console.info("logMessage abnormal_calllog_delete_test_2700: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_calllog_query_test_2800 + * @tc.name Fuzzy search query based on mobile phone number + * @tc.desc Function test + */ + it("abnormal_calllog_query_test_2800", 0, async function(done) { + console.info("------------abnormal_calllog_query_test_2800 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {"phone_number" : "196320147"}; + try { + var calllogId = await DAHelper.insert(calllogUri, insertValues); + console.info("logMessage abnormal_calllog_query_test_2800: calllogId = " + calllogId); + expect(calllogId > 0).assertTrue(); + await QueryByStartsWithPhoneNumberError(); + await calllogDelete("abnormal_calllog_query_test_2800"); + done(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_2800: calllog insert error = " + error); + done(); + } + + async function QueryByStartsWithPhoneNumberError() + { + var resultColumns = [ "id", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phone_numbers", "196%"); + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + console.info("logMessage abnormal_calllog_query_test_2800: resultSet.rowCount = " + resultSet.rowCount); + expect(resultSet.rowCount == -1).assertTrue(); + resultSet.close(); + } catch (error) { + console.info("logMessage abnormal_calllog_query_test_2800: query error = " + error); + done(); + } + } + }); + + afterAll(async function() { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('callllog afterAll logMessage get DAHelper success! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(calllogUri, condition); + console.info('callllog afterAll end logMessage deleteCode = ' + deleteCode); + }); +}) diff --git a/jstest/ContactCard_test.js b/jstest/ContactCard_test.js new file mode 100644 index 0000000..455e00d --- /dev/null +++ b/jstest/ContactCard_test.js @@ -0,0 +1,5341 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +import common from './common.js'; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const profilecontactUri = "dataability:///com.ohos.contactsdataability/profile/contact"; +const profileRawContactUri = "dataability:///com.ohos.contactsdataability/profile/raw_contact"; +const profileContactDataUri = "dataability:///com.ohos.contactsdataability/profile/contact_data"; +const profileGroupUri = "dataability:///com.ohos.contactsdataability/profile/groups"; +const profileBlocklistUri = "dataability:///com.ohos.contactsdataability/profile/contact_blocklist"; +const profilesearchContactUri = "dataability:///com.ohos.contactsdataability/profile/search_contact"; +const profileDeletedContactsUri = "dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact"; +const profile_deleted_raw_contact_record = + "dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact_record"; + +describe('ContactCardTest', function() { + console.info("-------ContactsTest is starting!--------"); + + var sleep_two = 2000; + var sleep_one = 1000; + var array_two = 2; + var array_three = 3; + var array_four = 4; + var result_size_five = 5 + + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + async function contactsQuery(map, tag, uri) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(uri, resultColumns, condition); + sleep(sleep_two); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ':logMessage contactsQuery key = ' + key + ' dbresult :' + dbresult + + ' value : ' + value); + expect(value == dbresult).assertEqual(true); + } + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + async function queryBatch(map, tag, size) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryBatch start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", map.get("raw_contact_id")); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info(tag + ': queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage resultSet.rowCount: error = " + error); + } + } + + async function queryIdForDelete(map, tag, uri) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryIdForDelete start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(uri, resultColumns, condition); + sleep(sleep_one); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage queryIdForDelete: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage queryIdForDelete: error = " + error); + } + } + + async function deleteAll(uri, tag) + { + try { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(uri, condition); + console.info(tag + ': deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info(tag + ': deleteAll error = ' + error); + } + } + + async function deleteRawContact(tag) + { + try { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + var deleteCode = await DAHelper.delete(profileRawContactUri, condition); + console.info(tag + ': deleteRawContact deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + sleep(sleep_one); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + var code = await DAHelper.delete(profileDeletedContactsUri, conditionAll); + console.info(tag + ': Completely delete code = ' + code); + expect(code == 0).assertTrue(); + } catch (error) { + console.info(tag + ': deleteRawContact error = ' + error); + } + } + + async function insertData(rawContactId, type, value, position) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var contactDataValues1 = + {"raw_contact_id" : rawContactId, "content_type" : type, "detail_info" : value, "position" : position}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues1); + console.info("logMessage : contactDataId " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage : contact_data name insert error = " + error); + } + return contactDataId; + } + + /** + * @tc.number contactCard_insert_test_100 + * @tc.name Insert contact data + * @tc.desc Function test + */ + it("contactCard_insert_test_100", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_100: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contactCard_insert_test_100", profileRawContactUri); + await deleteRawContact("contactCard_insert_test_100"); + done(); + } catch (error) { + console.info('logMessage contactCard_insert_test_100: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_insert_test_400 + * @tc.name Insert contact details (name, company, position, mobile phone number) + * @tc.desc Function test + */ + it("contactCard_insert_test_400", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insert_test_400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataNameInsert(DAHelper, rawContactId); + await dataCompanyInsert(DAHelper, rawContactId); + await dataPhoneInsert(DAHelper, rawContactId); + await deleteRawContact("contactCard_insert_test_400"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_400"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_400: raw_contact insert error = " + error); + done(); + } + }); + + async function dataNameInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xiaocheng" + }; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues1); + console.info("logMessage contactCard_insert_test_400: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "xiaocheng"); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contactCard_insert_test_400", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_400: contact_data name insert error = " + error); + done(); + } + } + + async function dataCompanyInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "TT", + "position" : "developer" + }; + try { + var contactDataId2 = await DAHelper.insert(profileContactDataUri, contactDataValues2); + console.info("logMessage contactCard_insert_test_400: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "TT"); + map.set("position", "developer"); + contactsQuery(map, "contactCard_insert_test_400", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_400: contact_data company insert error = " + error); + done(); + } + } + + async function dataPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "12345678" + }; + try { + var contactDataId3 = await DAHelper.insert(profileContactDataUri, contactDataValues3); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_400: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "12345678"); + await contactsQuery(map, "contactCard_insert_test_400", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_400: contact_data phone insert error = " + error); + done(); + } + } + + /** + * @tc.number contactCard_insert_test_500 + * @tc.name Insert contact details (nickname, email, home) + * @tc.desc Function test + */ + it("contactCard_insert_test_500", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insert_test_500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataEmailInsert(DAHelper, rawContactId); + await dataNickNameInsert(DAHelper, rawContactId); + await dataPostalAddressInsert(DAHelper, rawContactId); + await deleteRawContact("contactCard_insert_test_500"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_500"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_500: raw_contact insert error = " + error); + done(); + } + }); + + async function dataEmailInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "166@163.com" + }; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_500: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "166@163.com"); + await contactsQuery(map, "contactCard_insert_test_500_1", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_500: contact_data email insert error = " + error); + } + } + + async function dataNickNameInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "xiaocheng" + }; + try { + var contactDataId2 = await DAHelper.insert(profileContactDataUri, contactDataValues2); + console.info("logMessage contactCard_insert_test_500: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "xiaocheng"); + await contactsQuery(map, "contactCard_insert_test_500_2", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_500: contact_data nickname insert error = " + error); + } + } + + async function dataPostalAddressInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "NanJingSoftRoad" + }; + try { + var contactDataId3 = await DAHelper.insert(profileContactDataUri, contactDataValues3); + console.info("logMessage contactCard_insert_test_500: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "NanJingSoftRoad"); + await contactsQuery(map, "contactCard_insert_test_500_3", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_500: contact_data postal_address insert error = " + error); + } + } + + /** + * @tc.number contactCard_insert_test_600 + * @tc.name Insert contact details (remarks, AIM, birthday) + * @tc.desc Function test + */ + it("contactCard_insert_test_600", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues) + console.info("logMessage contactCard_insert_test_600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataNoteInsert(DAHelper, rawContactId); + await dataAimInsert(DAHelper, rawContactId); + await dataEventInsert(DAHelper, rawContactId); + await deleteRawContact("contactCard_insert_test_600"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_600"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_600: raw_contact insert error = " + error); + done(); + } + }); + + async function dataNoteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "note", + "detail_info" : "javaGangster" + }; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues1); + console.info("logMessage contactCard_insert_test_600: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "javaGangster"); + await contactsQuery(map, "contactCard_insert_test_600_1", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_600: contact_data note insert error = " + error); + done(); + } + } + + async function dataAimInsert(DAHelper, rawContactId) + { + var contactDataValues2 = {"raw_contact_id" : rawContactId, "content_type" : "im", "detail_info" : "aaaaa"}; + try { + var contactDataId2 = await DAHelper.insert(profileContactDataUri, contactDataValues2); + console.info("logMessage contactCard_insert_test_600: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "aaaaa"); + await contactsQuery(map, "contactCard_insert_test_600_2", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_600: contact_data aim insert error = " + error); + } + } + + async function dataEventInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_event", + "detail_info" : "19960229" + }; + try { + var contactDataId3 = await DAHelper.insert(profileContactDataUri, contactDataValues3); + console.info("logMessage contactCard_insert_test_600: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "19960229"); + await contactsQuery(map, "contactCard_insert_test_600_3", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_600: contact_data event insert error = " + error); + } + } + + /** + * @tc.number contactCard_insert_test_700 + * @tc.name Insert contact details (URL, assistant, group) + * @tc.desc Function test + */ + it("contactCard_insert_test_700", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insert_test_700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataWebsiteInsert(DAHelper, rawContactId); + await dataRelationInsert(DAHelper, rawContactId); + await dataWebsiteInsert(DAHelper, rawContactId); + await deleteRawContact("contactCard_insert_test_700"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_700"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_700: raw_contact insert error = " + error); + done(); + } + }); + + async function dataWebsiteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "website", + "detail_info" : "www.com" + }; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_700: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "www.com"); + await contactsQuery(map, "contactCard_insert_test_700_1", profileContactDataUri); + await ContactDataRelationInsert(); + } catch (error) { + console.info("logMessage contactCard_insert_test_700: contact_data website insert error = " + error); + } + } + + async function dataRelationInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "relation", + "detail_info" : "Secretary" + }; + try { + var contactDataId2 = await DAHelper.insert(profileContactDataUri, contactDataValues2); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_700: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "Secretary"); + await contactsQuery(map, "contactCard_insert_test_700_2", profileContactDataUri); + await ContactDataGroupInsert(); + } catch (error) { + console.info("logMessage contactCard_insert_test_700: contact_data relation insert error = " + error); + } + } + + async function dataGroupInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : "1" + }; + try { + var contactDataId3 = await DAHelper.insert(profileContactDataUri, contactDataValues3); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_700: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "1"); + await contactsQuery(map, "contactCard_insert_test_700_3", profileContactDataUri); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_700: contact_data group insert error = " + error); + } + } + + /** + * @tc.number contactCard_insert_test_800 + * @tc.name Insert contact details (phone ringtone) + * @tc.desc Function test + */ + it("contactCard_insert_test_800", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insert_test_800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataMiscInsert(DAHelper, rawContactId); + await deleteRawContact("contactCard_insert_test_800"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_800"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_800: raw_contact insert error = " + error); + done(); + } + }); + + async function dataMiscInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_misc", + "detail_info" : "1234" + }; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_800: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "1234"); + await contactsQuery(map, "contactCard_insert_test_800_1", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_800: contact_data misc insert error = " + error); + } + } + + /** + * @tc.number contactCard_update_test_900 + * @tc.name Update contact data + * @tc.desc Function test + */ + it("contactCard_update_test_900", 0, async function(done) { + console.info("------logMessage contactCard_update_test_900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "licheng", + "company" : "TT", + "position" : "developer", + "favorite" : 1, + "phonetic_name" : "licheng||lc" + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await rawContactUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_900"); + await deleteAll(profileContactDataUri, "contactCard_update_test_900"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_900: raw_contact insert error = " + error); + done(); + } + }); + + async function rawContactUpdate(DAHelper, rawContactId) + { + var updateValues = { + "display_name" : "dacheng", + "company" : "oo", + "position" : "Testers", + "favorite" : 0, + "phonetic_name" : "dacheng||dc" + }; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_900: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "dacheng"); + map.set("company", "oo"); + map.set("position", "Testers"); + map.set("favorite", "0"); + map.set("phonetic_name", "dacheng||dc"); + await contactsQuery(map, "contactCard_update_test_900", profileRawContactUri); + } catch (error) { + console.info('logMessage contactCard_update_test_900: raw_contact update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1200 + * @tc.name Update contact details (name) + * @tc.desc Function test + */ + it("contactCard_update_test_1200", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNameInsert(DAHelper, rawContactId); + await dataNameUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1200"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1200"); + done(); + } catch (error) { + console.info('logMessage contactCard_update_test_1200: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataNameInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "xiaoyuan"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1200: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1200: contact_data insert error = ' + error); + } + } + + async function dataNameUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "dayuan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1200: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "dayuan"); + await contactsQuery(map, "contactCard_update_test_1200", profileRawContactUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1200: contact_data update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1300 + * @tc.name Update contact details (company, position) + * @tc.desc Function test + */ + it("contactCard_update_test_1300", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataCompanyInsert(DAHelper, rawContactId); + await dataCompanyUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1300"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1300"); + done(); + } catch (error) { + console.info('logMessage contactCard_update_test_1300: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataCompanyInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "TT", + "position" : "Testers", + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1300: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1300: contact_data insert error = ' + error); + } + } + + async function dataCompanyUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "OOOO", "position" : "developer"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1300: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("company", "OOOO"); + map.set("position", "developer"); + await contactsQuery(map, "contactCard_update_test_1300", profileRawContactUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1300: contact_data update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1400 + * @tc.name Update contact details (mobile phone number) + * @tc.desc Function test + */ + it("contactCard_update_test_1400", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataPhoneInsert(DAHelper, rawContactId); + await dataPhoneUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1400"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1400"); + done(); + } catch (error) { + console.info('logMessage contactCard_update_test_1400: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforeDataPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "phone", "detail_info" : "123456"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1400: contact_data insert error = ' + error); + } + } + + async function dataPhoneUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "99663355"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1400: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "99663355"); + await contactsQuery(map, "contactCard_update_test_1400", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1400: contact_data update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1500 + * @tc.name Update contact details (nickname) + * @tc.desc Function test + */ + it("contactCard_update_test_1500", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNickNameInsert(DAHelper, rawContactId); + await dataNickNameUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1500"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1500"); + done(); + } catch (error) { + console.info('logMessage contactCard_update_test_1500: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataNickNameInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "xiaoyuan" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1500: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1500: contact_data insert error = ' + error); + } + } + + async function dataNickNameUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "fengyuan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1500: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "fengyuan"); + await contactsQuery(map, "contactCard_update_test_1500", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1500: contact_data update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1600 + * @tc.name Update contact details (email) + * @tc.desc Function test + */ + it("contactCard_update_test_1600", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataEmailInsert(DAHelper, rawContactId); + await dataEmailUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1600"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1600"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_1600: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataEmailInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "166@163.com" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1600: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1600: contact_data insert error = ' + error); + } + } + + async function dataEmailUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "199@163.com"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition) + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1600: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "199@163.com"); + await contactsQuery(map, "contactCard_update_test_1600", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1600: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1700 + * @tc.name Update Contact Details (Residential) + * @tc.desc Function test + */ + it("contactCard_update_test_1700", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataPostalInsert(DAHelper, rawContactId); + await dataPostalUpdate(); + await deleteRawContact("contactCard_update_test_1700"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1700"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_1700: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataPostalInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "NanJing" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1700: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_update_test_1700: contact_data insert error = " + error); + } + } + + async function dataPostalUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "BeiJing"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1700: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "BeiJing"); + await contactsQuery(map, "contactCard_update_test_1700", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1700: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1800 + * @tc.name Update contact details (remarks) + * @tc.desc Function test + */ + it("contactCard_update_test_1800", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_1800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNoteInsert(DAHelper, rawContactId); + await dataNoteUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1800"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1800"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_1800: raw_contact insert error = " + error); + done(); + } + }); + + async function beforedataNoteInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "note", "detail_info" : "Gangster"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1800: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_1800: contact_data insert error = ' + error); + } + } + + async function dataNoteUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "God"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1800: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "God"); + await contactsQuery(map, "contactCard_update_test_1800", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1800: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_1900 + * @tc.name Update Contact Details (AIM) + * @tc.desc Function test + */ + it("contactCard_update_test_1900", 0, async function(done) { + console.info("------logMessage contactCard_update_test_1900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues) + console.info("logMessage contactCard_update_test_1900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataAimInsert(DAHelper, rawContactId); + await dataAimUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_1900"); + await deleteAll(profileContactDataUri, "contactCard_update_test_1900"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_1900: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataAimInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "im", "detail_info" : "aaaaa"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1900: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_update_test_1900: contact_data insert error = " + error); + } + } + + async function dataAimUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "bbbbb"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_1900: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "bbbbb"); + await contactsQuery(map, "contactCard_update_test_1900", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_1900: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_2000 + * @tc.name Update Contact Details (Birthday) + * @tc.desc Function test + */ + it("contactCard_update_test_2000", 0, async function(done) { + console.info("------logMessage contactCard_update_test_2000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_2000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataEventInsert(DAHelper, rawContactId); + await dataEventUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_2000"); + await deleteAll(profileContactDataUri, "contactCard_update_test_2000"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_2000: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataEventInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_event", + "detail_info" : "19960229" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2000: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_2000: contact_data insert error = ' + error); + } + } + + async function dataEventUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "19971021"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2000: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "19971021"); + await contactsQuery(map, "contactCard_update_test_2000", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_2000: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_2100 + * @tc.name Update contact details (website) + * @tc.desc Function test + */ + it("contactCard_update_test_2100", 0, async function(done) { + console.info("------logMessage contactCard_update_test_2100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_2100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataWebsiteInsert(DAHelper, rawContactId); + await dataWebsiteUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_2100"); + await deleteAll(profileContactDataUri, "contactCard_update_test_2100"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_2100: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataWebsiteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "website", + "detail_info" : "www.com" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2100: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_2100: contact_data insert error = ' + error); + } + } + + async function dataWebsiteUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "www.123.com"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2100: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "www.123.com"); + await contactsQuery(map, "contactCard_update_test_2100", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_2100: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_2200 + * @tc.name Update contact details (assistant) + * @tc.desc Function test + */ + it("contactCard_update_test_2200", 0, async function(done) { + console.info("------logMessage contactCard_update_test_2200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_2200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataRelationInsert(DAHelper, rawContactId); + await dataRelationUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_2200"); + await deleteAll(profileContactDataUri, "contactCard_update_test_2200"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_2200: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataRelationInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "relation", + "detail_info" : "Secretary" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_update_test_2200: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_2200: contact_data insert error = ' + error); + } + } + + async function dataRelationUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "spouse"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2200: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "spouse"); + await contactsQuery(map, "contactCard_update_test_2200", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_2200: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_2300 + * @tc.name Update contact detail data table (group) + * @tc.desc Function test + */ + it("contactCard_update_test_2300", 0, async function(done) { + console.info("------logMessage contactCard_update_test_2300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_update_test_2300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataGroupInsert(DAHelper, rawContactId); + await dataGroupUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_2300"); + await deleteAll(profileContactDataUri, "contactCard_update_test_2300"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_2300: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataGroupInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : "2" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2300: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_2300: contact_data insert error = ' + error); + } + } + + async function dataGroupUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "7"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2300: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "3"); + await contactsQuery(map, "contactCard_update_test_2300", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_2300: update error = ' + error); + } + } + + /** + * @tc.number contactCard_update_test_2400 + * @tc.name Update contact detail data table (phone ringtone) + * @tc.desc Function test + */ + it("contactCard_update_test_2400", 0, async function(done) { + console.info("------logMessage contactCard_update_test_2400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_update_test_2400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataMiscInsert(DAHelper, rawContactId); + await dataMiscUpdate(DAHelper, rawContactId); + await deleteRawContact("contactCard_update_test_2400"); + await deleteAll(profileContactDataUri, "contactCard_update_test_2400"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_2400: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataMiscInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_misc", + "detail_info" : "1234" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contactCard_update_test_2400: contact_data insert error = ' + error); + } + } + + async function dataMiscUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "999"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contactCard_update_test_2400: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "999"); + await contactsQuery(map, "contactCard_update_test_2400", profileContactDataUri); + } catch (error) { + console.info('logMessage contactCard_update_test_2400: update error = ' + error); + } + } + + /** + * @tc.number contactCard_favorite_test_2500 + * @tc.name Favorite contacts + * @tc.desc Function test + */ + it("contactCard_favorite_test_2500", 0, async function(done) { + console.info("-------logMessage contactCard_favorite_test_2500 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaocai", "company" : "TT", "position" : "Testers"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues) + console.info('logMessage contactCard_favorite_test_2500: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await updateFavorite(DAHelper, rawContactId); + await deleteRawContact("contactCard_favorite_test_2500"); + done(); + } catch (error) { + console.info('logMessage contactCard_favorite_test_2500: raw_contact insert error = ' + error); + done(); + } + }); + + async function updateFavorite(DAHelper, rawContactId) + { + var updateValues = {"favorite" : 1}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contactCard_favorite_test_2500: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaocai"); + map.set("company", "TT"); + map.set("position", "Testers"); + map.set("favorite", "1"); + await contactsQuery(map, "contactCard_favorite_test_2500", profileRawContactUri); + } catch (error) { + console.info('logMessage contactCard_favorite_test_2500: update error = ' + error); + } + } + + /** + * @tc.number contactCard_unfavorite_test_2600 + * @tc.name Unfavorite contacts + * @tc.desc Function test + */ + it("contactCard_unfavorite_test_2600", 0, async function(done) { + console.info("-------logMessage contactCard_unfavorite_test_2600 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaohong", "company" : "TT", "position" : "Testers", "favorite" : 1}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info('logMessage contactCard_unfavorite_test_2600: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await updateUnFavorite(DAHelper, rawContactId); + await deleteRawContact("contactCard_unfavorite_test_2600"); + done(); + } catch (error) { + console.info('logMessage contactCard_unfavorite_test_2600: raw_contact insert error = ' + error); + done(); + } + }); + + async function updateUnFavorite(DAHelper, rawContactId) + { + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contactCard_unfavorite_test_2600: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaohong"); + map.set("company", "TT"); + map.set("position", "Testers"); + map.set("favorite", "0"); + await contactsQuery(map, "contactCard_unfavorite_test_2600", profileRawContactUri); + } catch (error) { + console.info("logMessage contactCard_unfavorite_test_2600: update error = " + error); + } + } + + /** + * @tc.number contactCard_insert_test_2700 + * @tc.name Insert contact blacklist + * @tc.desc Function test + */ + it("contactCard_insert_test_2700", 0, async function(done) { + console.info("-------logMessage contactCard_insert_test_2700 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var blocklistId = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_2700: blocklistId = ' + blocklistId); + expect(blocklistId > 0).assertTrue(); + var map = common.getProfileBlockListMap(); + map.set("id", blocklistId.toString()); + await contactsQuery(map, "contactCard_insert_test_2700", profileBlocklistUri); + await deleteAll(profileBlocklistUri, "contactCard_insert_test_2700"); + done(); + } catch (error) { + console.info('logMessage contactCard_insert_test_2700: blocklist insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_delete_test_2800 + * @tc.name Delete contact blacklist + * @tc.desc Function test + */ + it("contactCard_delete_test_2800", 0, async function(done) { + console.info("-------logMessage contactCard_delete_test_2800 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var blocklistId = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + sleep(sleep_one); + console.info('logMessage contactCard_delete_test_2800: blocklistId = ' + blocklistId); + expect(blocklistId > 0).assertTrue(); + await BlocklistDelete(); + done(); + } catch (error) { + console.info('logMessage contactCard_delete_test_2800: blocklist insert error = ' + error); + done(); + } + + async function BlocklistDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", blocklistId.toString()); + try { + var deleteCode = await DAHelper.delete(profileBlocklistUri, condition); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_2800: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", blocklistId.toString()); + await queryIdForDelete(map, "contactCard_delete_test_2800", profileBlocklistUri); + } catch (error) { + console.info('logMessage contactCard_delete_test_2800: delete error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_insert_test_2900 + * @tc.name Insert contact group + * @tc.desc Function test + */ + it("contactCard_insert_test_2900", 0, async function(done) { + console.info("-------logMessage contactCard_insert_test_2900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var groupValues = {"group_name" : "TestersThird"}; + try { + var groupId = await DAHelper.insert(profileGroupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_2900: groupId =" + groupId); + expect(groupId > 0).assertTrue(); + await groupRawContactInsert(DAHelper); + await deleteRawContact("contactCard_insert_test_2900"); + await deleteAll(profileGroupUri, "contactCard_insert_test_2900"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_2900"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_2900: group insert error =" + error); + done(); + } + }); + + async function groupRawContactInsert(DAHelper) + { + var rawContactValues = {"display_name" : "liyu"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_2900: rawContactId =" + rawContactId); + expect(rawContactId > 0).assertTrue(); + await groupDataInsert(DAHelper, rawContactId); + } catch (error) { + console.info("logMessage contactCard_insert_test_2900: raw_contact insert error =" + error); + } + } + + async function groupDataInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues) + sleep(sleep_one); + console.info("logMessage contactCard_insert_test_2900: contactDataId =" + contactDataId); + expect(contactDataId > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId); + map.set("raw_contact_id", rawContactId.toString()); + map.set("detail_info", groupId.toString()); + await contactsQuery(map, "contactCard_insert_test_2900", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_insert_test_2900: contact_data insert error =" + error); + } + } + + /** + * @tc.number contactCard_delete_test_3000 + * @tc.name Delete contact group + * @tc.desc Function test + */ + it("contactCard_delete_test_3000", 0, async function(done) { + console.info("-------logMessage contactCard_delete_test_3000 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var groupValues = {"group_name" : "TestersFourth"}; + try { + var groupId = await DAHelper.insert(profileGroupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_3000: groupId =" + groupId); + expect(groupId > 0).assertTrue(); + await groupAfterRawContactInsert(DAHelper); + await deleteRawContact("contactCard_delete_test_3000"); + await deleteAll(profileGroupUri, "contactCard_delete_test_3000"); + await deleteAll(profileContactDataUri, "contactCard_delete_test_3000"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_3000: group insert error =" + error); + done(); + } + }); + + async function groupAfterRawContactInsert(DAHelper) + { + var rawContactValues = {"display_name" : "liyuchen"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_3000: rawContactId =" + rawContactId); + expect(rawContactId > 0).assertTrue(); + await deleteGroupContactDataInsert(DAHelper, rawContactId); + } catch (error) { + console.info("logMessage contactCard_delete_test_3000: raw_contact insert error =" + error); + } + } + + async function deleteGroupContactDataInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info("logMessage contactCard_delete_test_3000: contactDataId =" + contactDataId); + expect(contactDataId > 0).assertTrue(); + await deleteGroup(DAHelper, contactDataId); + } catch (error) { + console.info("logMessage contactCard_delete_test_3000: contact_data insert error =" + error); + } + } + + async function deleteGroup(DAHelper, contactDataId) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactDataId.toString()); + try { + var deleteCode = await DAHelper.delete(profileContactDataUri, condition); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_3000: deleteCode =" + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + await queryIdForDelete(map, "contactCard_delete_test_3000", profileContactDataUri); + } catch (error) { + console.info("logMessage contactCard_delete_test_3000: delete error =" + error); + } + } + + /** + * @tc.number contactCard_query_test_3100 + * @tc.name Query basic information of a single contact + * @tc.desc Function test + */ + it("contactCard_query_test_3100", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactQuery(DAHelper, rawContactId); + await deleteRawContact("contactCard_query_test_3100"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3100: raw_contact insert error = " + error); + done(); + } + }); + + async function RawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_two); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId).assertEqual(true); + console.info('logMessage contactCard_query_test_3100: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyu").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_3100: query error = " + error); + } + } + + /** + * @tc.number contactCard_query_test_3200 + * @tc.name Query basic information of multiple contacts + * @tc.desc Function test + */ + it("contactCard_query_test_3200", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3200 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues1 = {"display_name" : "xiaoyu"}; + try { + var rawContactId1 = await DAHelper.insert(profileRawContactUri, rawContactValues1); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3200: rawContactId = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3200: raw_contact_1 insert error = " + error); + done(); + } + + var rawContactValues2 = {"display_name" : "xiaohong"}; + try { + var rawContactId2 = await DAHelper.insert(profileRawContactUri, rawContactValues2); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3200: rawContactId = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await queryTwoRaw(DAHelper, rawContactId1, rawContactId2); + await deleteRawContact("contactCard_query_test_3200"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3200: raw_contact_2 insert error = " + error); + done(); + } + }); + + async function queryTwoRaw(DAHelper, rawContactId1, rawContactId2) + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId1.toString()); + condition.or(); + condition.equalTo("id", rawContactId2.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info('logMessage contactCard_query_test_3200: goToFirstRow' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow()).assertEqual(true); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage contactCard_query_test_3200: columnNames :" + resultSet.columnNames); + console.info("logMessage contactCard_query_test_3200: columnCount:" + resultSet.columnCount); + console.info('logMessage contactCard_query_test_3200: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_query_test_3200: display_name = ' + resultSet.getString(1)); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_query_test_3200: query error' + error); + } + } + + /** + * @tc.number contactCard_query_test_3300 + * @tc.name Query basic information of all contacts + * @tc.desc Function test + */ + it("contactCard_query_test_3300", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3300 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues1 = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues1); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3300: raw_contact_1 insert error = " + error); + done(); + } + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3300: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contactCard_query_test_3300: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyu").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + await deleteRawContact("contactCard_query_test_3300"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3300: query error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_query_test_3400 + * @tc.name Query all information of a single contact + * @tc.desc Function test + */ + it("contactCard_query_test_3400", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3400 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = { + "display_name" : "xiaoyuzhou", + "company" : "TT", + "position" : "Testers", + "favorite" : 1, + "phonetic_name" : "xiaoyu||xy" + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryAllInformation(DAHelper, rawContactId); + await deleteRawContact("contactCard_query_test_3400"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3400: raw_contact insert error = " + error); + done(); + } + }); + + async function queryAllInformation(DAHelper, rawContactId) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + var id = resultSet.getString(resultSet.getColumnIndex("id")); + console.info('logMessage contactCard_query_test_3400: id = ' + id); + expect(id == rawContactId).assertEqual(true); + var favorite = resultSet.getString(resultSet.getColumnIndex("favorite")); + console.info('logMessage contactCard_query_test_3400: favorite = ' + favorite); + expect(favorite == "1").assertEqual(true); + var phonetic_name = resultSet.getString(resultSet.getColumnIndex("phonetic_name")); + console.info('logMessage contactCard_query_test_3400: phonetic_name = ' + phonetic_name); + expect(phonetic_name == "xiaoyu||xy").assertEqual(true); + var company = resultSet.getString(resultSet.getColumnIndex("company")); + console.info('logMessage contactCard_query_test_3400: company = ' + company); + expect(company == "TT").assertEqual(true); + var display_name = resultSet.getString(resultSet.getColumnIndex("display_name")); + console.info('logMessage contactCard_query_test_3400: display_name = ' + display_name); + expect(display_name == "xiaoyuzhou").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_query_test_3400: query error = ' + error); + } + } + + /** + * @tc.number contactCard_query_test_3500 + * @tc.name Query group member ability + * @tc.desc Function test + */ + it("contactCard_query_test_3500", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3500: raw_contact insert error = " + error); + done(); + } + var groupValues = {"group_name" : "BossBoard3500"}; + try { + var groupId = await DAHelper.insert(profileGroupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3500: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3500: group insert error = " + error); + done(); + } + await groupBossBoardInsert(DAHelper, rawContactId, groupId); + await deleteRawContact("contactCard_query_test_3500"); + await deleteAll(profileGroupUri, "contactCard_query_test_3500"); + await deleteAll(profileContactDataUri, "contactCard_query_test_3500"); + done(); + }); + + async function groupBossBoardInsert(DAHelper, rawContactId, groupId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3500: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + await groupBossBoardQuery(DAHelper, rawContactId, groupId); + } catch (error) { + console.info("logMessage contactCard_query_test_3500: query error = " + error); + } + } + + async function groupBossBoardQuery(DAHelper, rawContactId, groupId) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 9 data is group + condition.equalTo("type_id", "9"); + condition.and(); + condition.equalTo("detail_info", groupId.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3500: raw_contact_id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId).assertEqual(true); + console.info('logMessage contactCard_query_test_3500: detail_info = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == groupId.toString()).assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_3500: query error :" + error); + } + } + + /** + * @tc.number contactCard_query_test_3600 + * @tc.name Query favorite contacts + * @tc.desc Function test + */ + it("contactCard_query_test_3600", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou", "favorite" : 1}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryFavorite(); + await deleteRawContact("contactCard_query_test_3600"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3600: raw_contact insert error = " + error); + done(); + } + + async function queryFavorite() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("favorite", "1"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3600: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_query_test_3600: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyuzhou").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_3600: query error :" + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_query_test_3700 + * @tc.name Query recent contact ability + * @tc.desc Function test + */ + it("contactCard_query_test_3700", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3700 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou", "lastest_contacted_time" : 60}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryContacted(); + await deleteRawContact("contactCard_query_test_3700"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3700: raw_contact insert error = " + error); + done(); + } + + async function queryContacted() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.lessThan("lastest_contacted_time", "100"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3700: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_query_test_3700: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyuzhou").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_query_test_3700: query error' + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_query_test_3800 + * @tc.name Query recently deleted contacts + * @tc.desc Function test + */ + it("contactCard_query_test_3800", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3800 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaocai"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await rawContactDelete(DAHelper, rawContactId); + await deletedRawContactQuery(DAHelper, rawContactId); + await deleteAll(profileDeletedContactsUri, "contactCard_query_test_3800") + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3800: raw_contact insert error = " + error); + done(); + } + }); + + async function rawContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(profileRawContactUri, condition1); + sleep(sleep_one); + console.info('logMessage contactCard_query_test_3800: deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3800: raw_contact delete error = " + error); + done(); + } + } + + async function deletedRawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "display_name", "is_deleted" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedprofileRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info('logMessage contactCard_query_test_3800: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_query_test_3800: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contactCard_query_test_3800: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaocai").assertTrue(); + console.info('logMessage contactCard_query_test_3800: is_deleted = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == "1").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_3800: query error :" + error); + done(); + } + } + + /** + * @tc.number contactCard_query_test_3900 + * @tc.name Query all mobile phone numbers + * @tc.desc Function test + */ + it("contactCard_query_test_3900", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_3900 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaocai"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryPhoneInsert(); + await phoneQuery(rawContactId); + await deleteRawContact("contactCard_query_test_3900"); + await deleteAll(profileContactDataUri, "contactCard_query_test_3900"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_3900: raw_contact insert error = " + error); + done(); + } + }); + + async function queryPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "1853696321" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_3900: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_3900: contact_data insert error = " + error); + } + } + + async function phoneQuery(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 5 data is phone + condition.equalTo("content_type", "phone"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_3900: raw_contact_id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info('logMessage contactCard_query_test_3900: detail_info = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "1853696321").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_query_test_3900: query error' + error); + } + } + + /** + * @tc.number contactCard_query_test_4000 + * @tc.name Query all mailbox capabilities + * @tc.desc Function test + */ + it("contactCard_query_test_4000", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_4000 is starting!------------"); + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_4000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryEmailInsert(DAHelper, rawContactId); + await emailQuery(DAHelper, contactDataId, rawContactId); + await deleteRawContact("contactCard_query_test_4000"); + await deleteAll(profileContactDataUri, "contactCard_query_test_4000"); + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_4000: raw_contact insert error = " + error); + done(); + } + }); + + async function queryEmailInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "16658@163.com" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_4000: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_4000: contact_data insert error = " + error); + } + } + + async function emailQuery(DAHelper, contactDataId, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data content_type is email + condition.equalTo("type_id", "1").limitAs(array_three).orderByDesc("id"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_query_test_4000: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info('logMessage contactCard_query_test_4000: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contactCard_query_test_4000: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "16658@163.com").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_4000: query error :" + error); + } + } + + /** + * @tc.number contactCard_query_test_4100 + * @tc.name Query data information of a single contact + * @tc.desc Function test + */ + it("contactCard_query_test_4100", 0, async function(done) { + console.info("-----------logMessage contactCard_query_test_4100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_4100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryTwoDataInsert(DAHelper, rawContactId); + await queryTwoDataInsertCompany(DAHelper, rawContactId); + await queryTwo(DAHelper, rawContactId); + await deleteRawContact("contactCard_query_test_4100"); + await deleteAll(profileContactDataUri, "contactCard_query_test_4100"); + del + done(); + } catch (error) { + console.info("logMessage contactCard_query_test_4100: raw_contact insert error = " + error); + done(); + } + }); + + async function queryTwoDataInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "xiaoyu"}; + try { + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contactCard_query_test_4100: contactDataId = " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_4100: contact_data name insert error = " + error); + } + } + + async function queryTwoDataInsertCompany(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "OOOO", + "position" : "Testers" + }; + try { + var contactDataId2 = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info("logMessage contactCard_query_test_4100: contactDataId = " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_query_test_4100: contact_data company insert error = " + error); + } + } + + async function queryTwo(DAHelper, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info", "position" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + var array = [ {detail_info : "xiaoyu", position : ""}, {detail_info : "OOOO", position : "Testers"} ]; + var i = 0; + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage contactCard_query_test_4100: columnNames :" + resultSet.columnNames); + console.info("logMessage contactCard_query_test_4100: columnCount:" + resultSet.columnCount); + console.info('logMessage contactCard_query_test_4100: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_query_test_4100: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contactCard_query_test_4100: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == array[i].detail_info).assertEqual(true); + console.info('logMessage contactCard_query_test_4100: position = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == array[i].position).assertEqual(true); + i++; + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_query_test_4100: query error :" + error); + } + } + + /** + * @tc.number contactCard_delete_test_4400 + * @tc.name Delete the basic raw data of the contact and record the deleted basic raw data + * @tc.desc Function test + */ + it("contactCard_delete_test_4400", 0, async function(done) { + console.info("-------logMessage contactCard_delete_test_4400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await deleteRaw(DAHelper, rawContactId); + await queryDelete(DAHelper, rawContactId); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4400: raw_contact insert error :" + error); + done(); + } + }); + + async function deleteRaw(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(profileRawContactUri, condition1); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4400: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4400: delete error = " + error); + } + } + + async function queryDelete(DAHelper, rawContactId) + { + var resultColumns = [ "id", "delete_time", "display_name" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedprofileRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info("logMessage contactCard_delete_test_4400: columnNames:" + resultSet.columnNames); + console.info("logMessage contactCard_delete_test_4400: columnCount:" + resultSet.columnCount); + console.info('logMessage contactCard_delete_test_4400: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_delete_test_4400: delete_time = ' + resultSet.getString(1)); + console.info('logMessage contactCard_delete_test_4400: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaoming").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4400: query error:" + error); + } + } + + /** + * @tc.number contactCard_delete_test_4700 + * @tc.name Delete detailed contact data and record detailed data + * @tc.desc Function test + */ + it("contactCard_delete_test_4700", 0, async function(done) { + console.info("-------logMessage contactCard_delete_test_4700 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaozhang", "company" : "OOOO", "position" : "TestManager"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryDeleteCompanyData(DAHelper, rawContactId); + await rawContactDelete(DAHelper, rawContactId); + await companyRawContactDeleteQuery(DAHelper, rawContactId); + await deleteAll(profileContactDataUri, "contactCard_delete_test_4700"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4700: raw_contact insert error:" + error); + done(); + } + }); + + async function queryDeleteCompanyData(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "OOOO", + "position" : "TestManager" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4700: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4700: contact_data insert error:" + error); + } + } + + async function rawContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(profileRawContactUri, condition1); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4700: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4700: delete error = " + error); + done(); + } + } + + async function companyRawContactDeleteQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name", "backup_data" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedprofileRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info("logMessage contactCard_delete_test_4700: columnNames:" + resultSet.columnNames); + console.info("logMessage contactCard_delete_test_4700: columnCount:" + resultSet.columnCount); + console.info('logMessage contactCard_delete_test_4700: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_delete_test_4700: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaozhang").assertEqual(true); + console.info('logMessage contactCard_delete_test_4700: backup_data = ' + resultSet.getString(array_two)); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4700: query error:" + error); + } + } + + /** + * @tc.number contactCard_delete_test_4800 + * @tc.name Delete and record basic data of a single contact + * @tc.desc Function test + */ + it("contactCard_delete_test_4800", 0, async function(done) { + console.info("-------logMessage contactCard_delete_test_4800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaopeng"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDelete(DAHelper, rawContactId); + await DeletedRawContactQuery(DAHelper, rawContactId) + await deleteAll(profileContactDataUri, "contactCard_delete_test_4800"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4800: raw_contact insert error:" + error); + done(); + } + }); + + async function ContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("name_raw_contact_id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(profilecontactUri, condition1); + sleep(sleep_one); + console.info("logMessage contactCard_delete_test_4800: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4800: delete error = " + error); + } + } + + async function DeletedRawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "delete_time", "display_name" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedprofileRawContactUri, resultColumns, condition2); + sleep(sleep_one) + if (resultSet.goToFirstRow()) + { + console.info("logMessage contactCard_delete_test_4800: columnNames:" + resultSet.columnNames); + console.info("logMessage contactCard_delete_test_4800: columnCount:" + resultSet.columnCount); + console.info('logMessage contactCard_delete_test_4800: id = ' + resultSet.getString(0)); + console.info('logMessage contactCard_delete_test_4800: delete_time = ' + resultSet.getString(1)); + console.info('logMessage contactCard_delete_test_4800: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaopeng").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contactCard_delete_test_4800: query error:" + error); + } + } + + /** + * @tc.number contactCard_batchinsert_test_4900 + * @tc.name Insert contacts in batches(raw_contact) + * @tc.desc Function test + */ + it("contactCard_batchinsert_test_4900", 0, async function(done) { + console.info("--------logMessage contactCard_batchinsert_test_4900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.batchInsert(profileRawContactUri, common.getContactBatchCompany()); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_4900: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("company", "TT4900"); + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + console.info( + 'contactCard_batchinsert_test_4900 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == result_size_five).assertEqual(true); + resultSet.close(); + await deleteRawContact("contactCard_batchinsert_test_4900"); + done(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_4900: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_batchinsert_test_5000 + * @tc.name Insert contact_data in batches of address book + * @tc.desc Function test + */ + it("contactCard_batchinsert_test_5000", 0, async function(done) { + console.info("--------logMessage contactCard_batchinsert_test_5000 start!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaozhi"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_5000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataBatchInsert(); + done(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5000: raw_contact insert error = " + error); + done(); + } + async function ContactDataBatchInsert() + { + try { + var batchInsertCode = + await DAHelper.batchInsert(profileContactDataUri, common.getContactBatchCompanyTwo()); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_5000: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + var map = new Map(); + map.set("raw_contact_id", raw_contact_id.toString()); + await queryBatch(map, "contactCard_batchinsert_test_5000", result_size_five); + await deleteRawContact("contactCard_batchinsert_test_5000"); + done(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5000: batchInsert error = " + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_batchinsert_test_5400 + * @tc.name Batch operation of contact blacklist + * @tc.desc Function test + */ + it("contactCard_batchinsert_test_5400", 0, async function(done) { + console.info("--------logMessage contactCard_batchinsert_test_5400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.batchInsert(profileBlocklistUri, common.getPhoneNumberBatch()); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_5400: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await query(result_size_five); + await BlocklistDelete(); + done(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5400: batchInsert error = " + error); + done(); + } + + async function BlocklistDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "85525040585400"); + try { + var deleteCode = await DAHelper.delete(profileBlocklistUri, condition); + console.info("logMessage contactCard_batchinsert_test_5400: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + await query(0); + done(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5400: delete error = " + error); + done(); + } + } + + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "85525040585400"); + try { + var resultSet = await DAHelper.query(profileBlocklistUri, resultColumns, condition); + sleep(sleep_one); + console.info('contactCard_batchinsert_test_5400 : queryBatch start ! resultSet.rowCount = ' + + resultSet.rowCount); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contactCard_batchinsert_test_5400 logMessage resultSet.rowCount: error = " + error); + } + } + }); + + /** + * @tc.number contactCard_update_test_5300 + * @tc.name Bulk favorites and unfavorites of contacts + * @tc.desc Function test + */ + it("contactCard_update_test_5300", 0, async function(done) { + console.info("--------logMessage contactCard_update_test_5300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValuesOne = {"display_name" : "fengyuan", "favorite" : 1}; + var rawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactValuesThree = {"display_name" : "xiaoma", "favorite" : 1}; + var listAddBluk = [] + listAddBluk[0] = rawContactValuesOne; + listAddBluk[1] = rawContactValuesTwo; + listAddBluk[array_two] = rawContactValuesThree; + try { + var batchInsertCode = await DAHelper.batchInsert(profileRawContactUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contactCard_update_test_5300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await RawContactUpdateUnFavorites(DAHelper); + await queryUnFavorites(DAHelper); + await deleteRawContact("contactCard_update_test_5300"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_5300: batchInsert error = " + error); + done(); + } + }); + + async function RawContactUpdateUnFavorites(DAHelper) + { + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("display_name", "fengyuan"); + condition.or(); + condition.equalTo("display_name", "xiaoma"); + try { + var updateCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contactCard_update_test_5300: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_update_test_5300: update error = " + error); + } + } + + async function queryUnFavorites(DAHelper) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("display_name", "fengyuan"); + condition.or(); + condition.equalTo("display_name", "xiaoma"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info( + 'contactCard_update_test_5300 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == array_two).assertEqual(true); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var dbresult = resultSet.getString(resultSet.getColumnIndex("favorite")); + console.info(' contactCard_update_test_5300 :logMessage contactsQuery dbresult :' + dbresult + + ' value : ' + value); + expect(dbresult == "0").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(" contactCard_update_test_5300 logMessage resultSet.rowCount: error = " + error); + } + } + + /** + * @tc.number contactCard_batchinsert_test_5500 + * @tc.name Contacts are added to and removed from groups in batches + * @tc.desc Function test + */ + it("contactCard_batchinsert_test_5500", 0, async function(done) { + console.info("--------logMessage contactCard_batchinsert_test_5500 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var groupValues = {"group_name" : "ManagerGroup"}; + try { + var groupId = await DAHelper.insert(profileGroupUri, groupValues); + console.info("logMessage contactCard_batchinsert_test_5500: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: group insert error = " + error); + done(); + } + + try { + var rawContactValues1 = {"display_name" : "xiaohuang"}; + var rawContactId1 = await DAHelper.insert(profileRawContactUri, rawContactValues1); + console.info("logMessage contactCard_batchinsert_test_5500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: raw_contact_1 insert error = " + error); + done(); + } + + try { + var rawContactValues2 = {"display_name" : "xiaolv"}; + var rawContactId2 = await DAHelper.insert(profileRawContactUri, rawContactValues2); + console.info("logMessage contactCard_batchinsert_test_5500: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: raw_contact_2 insert error = " + error); + done(); + } + + try { + var rawContactValues3 = {"display_name" : "xiaobai"}; + var rawContactId3 = await DAHelper.insert(profileRawContactUri, rawContactValues3); + console.info("logMessage contactCard_batchinsert_test_5500: rawContactId3 = " + rawContactId3); + expect(rawContactId3 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: raw_contact_3 insert error = " + error); + done(); + } + await threeDataInsert(DAHelper, rawContactId1, rawContactId2, rawContactId3, groupId); + await deleteRawContact("contactCard_batchinsert_test_5500"); + await deleteAll(profileGroupUri, "contactCard_batchinsert_test_5500"); + await deleteAll(profileContactDataUri, "contactCard_batchinsert_test_5500"); + done(); + }); + + async function threeDataInsert(DAHelper, rawContactId1, rawContactId2, rawContactId3, groupId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId1, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var contactDataValues2 = { + "raw_contact_id" : rawContactId2, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var contactDataValues3 = { + "raw_contact_id" : rawContactId3, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValues1; + listAddBluk[1] = contactDataValues2; + listAddBluk[array_two] = contactDataValues3; + try { + var batchInsertCode = await DAHelper.batchInsert(profileContactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_5500: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await ContactDataDelete(DAHelper, rawContactId1, rawContactId3); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: batchInsert error = " + error); + } + } + + async function ContactDataDelete(DAHelper, rawContactId1, rawContactId3) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId1.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId3.toString()); + try { + var deleteCode = await DAHelper.delete(profileContactDataUri, condition); + sleep(sleep_one); + console.info("logMessage contactCard_batchinsert_test_5500: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + await queryTwoData(DAHelper, rawContactId1, rawContactId3); + } catch (error) { + console.info("logMessage contactCard_batchinsert_test_5500: delete error = " + error); + } + } + + async function queryTwoData(DAHelper, rawContactId1, rawContactId3) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId1.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId3.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + console.info( + 'contactCard_batchinsert_test_5500 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 0).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contactCard_batchinsert_test_5500 logMessage resultSet.rowCount: error = " + error); + } + } + + /** + * @tc.number contactCard_pinyin_query_test_200 + * @tc.name Contact name to pinyin (Chinese Simplified) + * @tc.desc Function test + */ + it("contactCard_pinyin_query_test_200", 0, async function(done) { + console.info("--------logMessage contactCard_pinyin_query_test_200 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "小黄"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info('logMessage contactCard_pinyin_query_test_200 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contactCard_pinyin_query_test_200"); + await deleteAll(profileContactDataUri, "contactCard_pinyin_query_test_200"); + done(); + } catch (error) { + console.info("logMessage contactCard_pinyin_query_test_200: raw_contact insert error = " + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xiaohuang" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_pinyin_query_test_200 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchQuery(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_200 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profilesearchContactUri, resultColumns, condition); + var map = common.getSearchMap(); + map.set("raw_contact_id", rawContactId.toString()); + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ':contactCard_pinyin_query_test_200 key = ' + key + + ' dbresult :' + dbresult + ' value : ' + value); + expect(value == dbresult).assertEqual(true); + } + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_200 query error = ' + error); + } + } + + /** + * @tc.number contactCard_pinyin_query_test_100 + * @tc.name Contact name to pinyin (Chinese Traditional) + * @tc.desc Function test + */ + it("contactCard_pinyin_query_test_100", 0, async function(done) { + console.info("--------logMessage contactCard_pinyin_query_test_100 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "鍵盤"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_pinyin_query_test_100 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contactCard_pinyin_query_test_100"); + await deleteAll(profileContactDataUri, "contactCard_pinyin_query_test_100"); + done(); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_100 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "鍵盤"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_pinyin_query_test_100 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchContactQueryChinese(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_100 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchContactQueryChinese(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profilesearchContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_pinyin_query_test_100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_pinyin_query_test_100: search_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "鍵盤||jianpan||jp").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_100 query error = ' + error); + } + } + + /** + * @tc.number contactCard_pinyin_query_test_300 + * @tc.name Contact name to pinyin (English) + * @tc.desc Function test + */ + it("contactCard_pinyin_query_test_300", 0, async function(done) { + console.info("--------logMessage contactCard_pinyin_query_test_300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "Tom"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_pinyin_query_test_300 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contactCard_pinyin_query_test_300"); + done(); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_300 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "Tom"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_pinyin_query_test_300 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchContactQuery(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_300 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profilesearchContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_pinyin_query_test_300: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_pinyin_query_test_300: search_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "Tom||Tom||Tom").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_pinyin_query_test_300 query error = ' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_400 + * @tc.name Contact fuzzy search query interface (name) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_400", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "400xiaoming400"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_400 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactNameQuery(); + await deleteRawContact("contactCard_fuzzyquery_test_400"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_400 raw_contact insert error = ' + error); + done(); + } + + async function RawContactNameQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("display_name", "%xiaoming40%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_400: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_400: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "400xiaoming400").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_400 query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_fuzzyquery_test_500 + * @tc.name Contact fuzzy search query interface (name pinyin, pinyin name) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_500", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_500 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var rawContactValues = {"display_name" : "500xiaoming500", "phonetic_name" : "500xiaoming500||xm"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_500 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactPhoneticNameQuery(); + await deleteRawContact("contactCard_fuzzyquery_test_500"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_500 raw_contact insert error = ' + error); + done(); + } + + async function RawContactPhoneticNameQuery() + { + var resultColumns = [ "id", "display_name", "phonetic_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phonetic_name", "%xiaoming%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + condition.or(); + condition.like("phonetic_name", "%xm%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_500: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_500: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "500xiaoming500").assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_500: phonetic_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "500xiaoming500||xm").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_500 query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_fuzzyquery_test_600 + * @tc.name Contact fuzzy search query interface (company, position) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_600", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_600 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming", "company" : "TT600", "position" : "Testers600"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_600 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactCompanyQuery(DAHelper, rawContactId); + await deleteRawContact("contactCard_fuzzyquery_test_600"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_600 raw_contact insert error = ' + error); + done(); + } + }); + + async function RawContactCompanyQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name", "company", "position" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("company", "%TT6%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + condition.or(); + condition.like("position", "%Testers6%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_600: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_600: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoming").assertEqual(true); + console.info('logMessage contactCard_fuzzyquery_test_600: company = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "TT600").assertEqual(true); + console.info('logMessage contactCard_fuzzyquery_test_600: position = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == "Testers600").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_600 query error = ' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_700 + * @tc.name Contact fuzzy search query interface (mobile phone number) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_700", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_700 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_700 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataPhoneInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_700"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_700"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_700 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataPhoneInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "14528963" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_700 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryPhone(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_700 contact_data insert error = ' + contactDataId); + done(); + } + } + }); + + async function fuzzyQueryPhone(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 5 data is phone + condition.like("detail_info", "%52896%"); + condition.and(); + condition.equalTo("type_id", "5"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_700: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_700: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contactCard_fuzzyquery_test_700: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "14528963").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_700 query error = ' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_800 + * @tc.name Contact fuzzy search query interface (nickname) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_800", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_800 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactNickNameInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_800"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_800"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_800 raw_contact insert error = ' + error); + done(); + } + + async function ContactNickNameInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "daming" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_fuzzyquery_test_800 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryPhoneNickName(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_800 contact_data insert error = ' + contactDataId); + done(); + } + } + }); + + async function fuzzyQueryPhoneNickName(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 3 data is nickname + condition.like("detail_info", "%daming%"); + condition.and(); + condition.equalTo("type_id", "3"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_800: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_800: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contactCard_fuzzyquery_test_800: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "daming").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_800 query error = ' + error); + } + } + /** + * @tc.number contactCard_fuzzyquery_test_900 + * @tc.name Contact fuzzy search query interface (mailbox) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_900", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_900 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataEmailInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_900"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_900"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_900 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataEmailInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "1564@163.com" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_fuzzyquery_test_900 ; = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryEmail(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_900 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryEmail(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data is email + condition.like("detail_info", "%1564%"); + condition.and(); + condition.equalTo("type_id", "1"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_900: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_900: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contactCard_fuzzyquery_test_900: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "1564@163.com").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_900 query error = ' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_1000 + * @tc.name Contact fuzzy search query interface (residential) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_1000", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_1000 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_1000 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataPostalInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_1000"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_1000"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1000 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataPostalInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "nanjing1000" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_1000 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryAddress(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1000 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryAddress(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data is postal_address + condition.like("detail_info", "%nanjing10%"); + condition.and(); + condition.equalTo("type_id", "7"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_1000: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_1000: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contactCard_fuzzyquery_test_1000: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "nanjing1000").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1000: query error' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_1100 + * @tc.name Contact fuzzy search query interface (remarks) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_1100", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_1100 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_1100 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataNoteInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_1100"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_1100"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1100 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataNoteInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "note", + "detail_info" : "java1100" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contactCard_fuzzyquery_test_1100 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryNote(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1100 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryNote(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 10 data is note + condition.like("detail_info", "%java11%"); + condition.and(); + condition.equalTo("type_id", "10"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_1100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_1100: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_1100: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "java1100").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1100: query error' + error); + } + } + + /** + * @tc.number contactCard_fuzzyquery_test_1200 + * @tc.name Contact fuzzy search query interface (AIM) + * @tc.desc Function test + */ + it("contactCard_fuzzyquery_test_1200", 0, async function(done) { + console.info("--------logMessage contactCard_fuzzyquery_test_1200 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info('logMessage contactCard_fuzzyquery_test_1200 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("contactCard_fuzzyquery_test_1200"); + await deleteAll(profileContactDataUri, "contactCard_fuzzyquery_test_1200"); + done(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1200 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "im", + "detail_info" : "aaaa1200" + }; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_fuzzyquery_test_1200 ; = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryIM(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1200 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryIM(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 10 data is im account number + condition.like("detail_info", "%aa12%"); + condition.and(); + condition.equalTo("type_id", "2"); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contactCard_fuzzyquery_test_1200: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_1200: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contactCard_fuzzyquery_test_1200: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "aaaa1200").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contactCard_fuzzyquery_test_1200: query error' + error); + } + } + + /** + * @tc.number abnormal_contactCard_insert_test_200 + * @tc.name Abnormal use case, an incorrect field is passed in when inserting + * @tc.desc Function test + */ + it("abnormal_contactCard_insert_test_200", 0, async function(done) { + console.info("------------abnormal_contactCard_insert_test_200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_names" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info("logMessage abnormal_contactCard_insert_test_200: rawContactId = " + rawContactId); + expect(rawContactId).assertEqual(-1); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_test_200: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contactCard_insert_test_300 + * @tc.name Abnormal use case, an incorrect table name is passed in when inserting + * @tc.desc Function test + */ + it("abnormal_contactCard_insert_test_300", 0, async function(done) { + console.info("------------abnormal_contactCard_insert_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(errorUri, rawContactValues); + console.info("logMessage abnormal_contactCard_insert_test_300: rawContactId = " + rawContactId); + expect(rawContactId == -1).assertTrue(); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_test_300: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contactCard_update_test_1100 + * @tc.name Abnormal use case, an incorrect field is passed in when updating + * @tc.desc Function test + */ + it("abnormal_contactCard_update_test_1100", 0, async function(done) { + console.info("------------abnormal_contactCard_update_test_1100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info("logMessage abnormal_contactCard_update_test_1100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalUpdate(); + await deleteRawContact("abnormal_contactCard_update_test_1100"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_update_test_1100: raw_contact insert error' + error); + done(); + } + + async function AbnormalUpdate() + { + var updateValues = {"display_names" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var updataCode = await DAHelper.update(profileRawContactUri, updateValues, condition) + console.info("logMessage abnormal_contactCard_update_test_1100: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contactCard_update_test_1100", profileRawContactUri); + } catch (error) { + console.info('logMessage abnormal_contactCard_update_test_1100: update error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_update_test_1000 + * @tc.name Abnormal use case, an incorrect table name is passed in when updating + * @tc.desc Function test + */ + it("abnormal_contactCard_update_test_1000", 0, async function(done) { + console.info("------------abnormal_contactCard_update_test_1000 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info("logMessage abnormal_contactCard_update_test_1000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalUpdate(); + await deleteRawContact("abnormal_contactCard_update_test_1000"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_update_test_1000: raw_contact insert error' + error); + done(); + } + + async function AbnormalUpdate() + { + var updateValues = {"display_name" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updataCode = await DAHelper.update(errorUri, updateValues, condition); + console.info("logMessage abnormal_contactCard_update_test_1000: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contactCard_update_test_1000", profileRawContactUri); + } catch (error) { + console.info("logMessage abnormal_contactCard_update_test_1000: updata error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_delete_test_4500 + * @tc.name Abnormal use case, an incorrect field is passed in when deleting + * @tc.desc Function test + */ + it("abnormal_contactCard_delete_test_4500", 0, async function(done) { + console.info("------------abnormal_contactCard_delete_test_4500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaozhi"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info("logMessage abnormal_contactCard_delete_test_4500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalDelete(); + await deleteRawContact("abnormal_contactCard_delete_test_4500"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_delete_test_4500: raw_contact insert error' + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(profileRawContactUri, condition); + console.info("logMessage abnormal_contactCard_delete_test_4500: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaozhi"); + await contactsQuery(map, "abnormal_contactCard_delete_test_4500", profileRawContactUri); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_delete_test_4500: delete error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_delete_test_4600 + * @tc.name Abnormal use case, an incorrect table name is passed in when deleting + * @tc.desc Function test + */ + it("abnormal_contactCard_delete_test_4600", 0, async function(done) { + console.info("------------abnormal_contactCard_delete_test_4600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info("logMessage abnormal_contactCard_delete_test_4600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalDelete(); + await deleteRawContact("abnormal_contactCard_delete_test_4600"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_delete_test_4600: raw_contact insert error' + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info("logMessage abnormal_contactCard_delete_test_4600: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contactCard_delete_test_4600", profileRawContactUri); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_delete_test_4600: delete error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_query_test_4200 + * @tc.name Abnormal use case, an incorrect field is passed in when querying + * @tc.desc Function test + */ + it("abnormal_contactCard_query_test_4200", 0, async function(done) { + console.info("------------abnormal_contactCard_query_test_4200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaozhicheng"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues) + console.info("logMessage abnormal_contactCard_query_test_4200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contactCard_query_test_4200"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_query_test_4200: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info( + 'logMessage abnormal_contactCard_query_test_4200: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contactCard_query_test_4200: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_batchinsert_test_5100 + * @tc.name Abnormal use cases, when adding data in batches, some of them failed, check the processing logic + * @tc.desc Function test + */ + it("abnormal_contactCard_batchinsert_test_5100", 0, async function(done) { + console.info("--------logMessage abnormal_contactCard_batchinsert_test_5100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var addBulk_value1 = {"display_name" : "zhangsan"}; + var addBulk_value2 = {"display_names" : "lisi"}; + var addBulk_value3 = {"display_name" : "wangwu"}; + var addBulk_value4 = {"display_names" : "laoliu"}; + var addBulk_value5 = {"display_name" : "xiaozhang"}; + var listAddBluk = []; + listAddBluk[0] = addBulk_value1; + listAddBluk[1] = addBulk_value2; + listAddBluk[array_two] = addBulk_value3; + listAddBluk[array_three] = addBulk_value4; + listAddBluk[array_four] = addBulk_value5; + try { + var batchInsertCode = await DAHelper.batchInsert(profileRawContactUri, listAddBluk); + console.info("logMessage abnormal_contactCard_batchinsert_test_5100: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_contactCard_batchinsert_test_5100: batch insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contactCard_insert_data_5300 + * @tc.name insert_data error no rawContactId + * @tc.desc Function test + */ + it("abnormal_contactCard_insert_data_5300", 0, async function(done) { + console.info("--------logMessage abnormal_contactCard_insert_data_5300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaotian"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage abnormal_contactCard_insert_data_5300 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("abnormal_contactCard_insert_data_5300"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_data_5300 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = {"content_type" : "im", "detail_info" : "aaaa"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage abnormal_contactCard_insert_data_5300 ; = ' + contactDataId); + expect(contactDataId == -1).assertTrue(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_data_5300 contact_data insert error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contactCard_insert_data_5400 + * @tc.name insert_data error no content_type + * @tc.desc Function test + */ + it("abnormal_contactCard_insert_data_5400", 0, async function(done) { + console.info("--------logMessage abnormal_contactCard_insert_data_5400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaotian"}; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, rawContactValues); + console.info('logMessage abnormal_contactCard_insert_data_5400 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("abnormal_contactCard_insert_data_5400"); + done(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_data_5400 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "detail_info" : "aaaa"}; + try { + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage abnormal_contactCard_insert_data_5400 ; = ' + contactDataId); + expect(contactDataId == -1).assertTrue(); + } catch (error) { + console.info('logMessage abnormal_contactCard_insert_data_5400 contact_data insert error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contactCard_delete_test_5500 + * @tc.name batchDelete + * @tc.desc Function test + */ + it("contactCard_delete_test_5500", 0, async function(done) { + console.info("--------logMessage contactCard_delete_test_5500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + console.info("logMessage contactCard_delete_test_5500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contactCard_delete_test_5500", profileRawContactUri); + await executeBatch(); + } catch (error) { + console.info("logMessage contactCard_delete_test_5500: insert error = " + error); + done(); + } + async function executeBatch() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + DAHelper.executeBatch(URI_CONTACTS, [ { + uri : profileRawContactUri, + type : featureAbility.DataAbilityOperationType.TYPE_DELETE, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info( + "logMessage contactCard_delete_test_5500: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage contactCard_delete_test_5500: data_3 = " + data); + console.info("logMessage contactCard_delete_test_5500: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number contactCard_update_test_5600 + * @tc.name batchUpdate + * @tc.desc Function test + */ + it("contactCard_update_test_5600", 0, async function(done) { + console.info("--------logMessage contactCard_update_test_5600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + console.info("logMessage contactCard_update_test_5600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contactCard_update_test_5600", profileRawContactUri); + await executeBatch(); + } catch (error) { + console.info("logMessage contactCard_update_test_5600: insert error = " + error); + done(); + } + + async function executeBatch() + { + var updateValues = {"display_name" : "xiaoxiaoxiao"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + DAHelper.executeBatch(URI_CONTACTS, [ { + uri : profileRawContactUri, + type : featureAbility.DataAbilityOperationType.TYPE_UPDATE, + valuesBucket : updateValues, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info( + "logMessage contactCard_update_test_5600: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage contactCard_update_test_5600: data_3 = " + data); + console.info("logMessage contactCard_update_test_5600: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number contactCard_insert_test_5700 + * @tc.name Insert Multiple raw_contact essential information + * @tc.desc Function test + */ + it("contactCard_insert_test_5700", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_5700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_5700: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contactCard_insert_test_5700", profileRawContactUri); + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_5700: rawContactIdOne = ' + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactIdOne.toString()); + await contactsQuery(map, "contactCard_insert_test_5700", profileRawContactUri); + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_5700: rawContactIdTwo = ' + rawContactIdTwo); + expect(rawContactIdTwo > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactIdTwo.toString()); + await contactsQuery(map, "contactCard_insert_test_5700", profileRawContactUri); + await deleteRawContact("contactCard_insert_test_5700"); + done(); + } catch (error) { + console.info('logMessage contactCard_insert_test_5700: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_insert_test_5800 + * @tc.name Add 20000 bytes of basic contact information and verify whether the text insertion is successful + * @tc.desc Function test + */ + it("contactCard_insert_test_5800", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_5800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var name; + for (var i = 0; i < 20000; i++) { + name += "i"; + } + var contcatvalues = {"display_name" : name} + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, contcatvalues); + sleep(sleep_one); + console.info('logMessage contactCard_insert_test_5800: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", name); + await contactsQuery(map, "contactCard_insert_test_5800", profileRawContactUri); + await deleteRawContact("contactCard_insert_test_5800"); + done(); + } catch (error) { + console.info('logMessage contactCard_insert_test_5800: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_insert_test_5900 + * @tc.name Add multiple contact details and verify that the insertion was successful + * @tc.desc Function test + */ + it("contactCard_insert_test_5900", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_5900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var contcatvalues = {"display_name" : "xiao5900"} + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, contcatvalues); + console.info('logMessage contactCard_insert_test_5900: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "19960229" + }; + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues1); + console.info('logMessage contactCard_insert_test_5900: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "19960229"); + await contactsQuery(map, "contactCard_insert_test_5900", profileContactDataUri); + + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, contcatvalues); + console.info('logMessage contactCard_insert_test_5900: rawContactId = ' + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + var contactDataValues2 = { + "raw_contact_id" : rawContactIdOne, + "content_type" : "phone", + "detail_info" : "111111032" + }; + var contactDataId1 = await DAHelper.insert(profileContactDataUri, contactDataValues2); + console.info('logMessage contactCard_insert_test_5900: contactDataId = ' + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "111111032"); + await contactsQuery(map, "contactCard_insert_test_5900", profileContactDataUri); + + await deleteRawContact("contactCard_insert_test_5900"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_5900"); + done(); + } catch (error) { + console.info('logMessage contactCard_insert_test_5900: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_insert_test_6000 + * @tc.name Add the basic information of a single contact and verify whether the insertion is successful (name, + * Pinyin, company, position, favorite) + * @tc.desc Function test + */ + it("contactCard_insert_test_6000", 0, async function(done) { + console.info("------logMessage contactCard_insert_test_6000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "licheng", + "company" : "TT", + "position" : "developer", + "favorite" : 1, + "phonetic_name" : "licheng||lc" + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insert_test_6000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "licheng"); + map.set("company", "TT"); + map.set("position", "developer"); + map.set("favorite", "1"); + map.set("phonetic_name", "licheng||lc"); + await contactsQuery(map, "contactCard_insert_test_6000", profileRawContactUri); + await deleteRawContact("contactCard_insert_test_6000"); + await deleteAll(profileContactDataUri, "contactCard_insert_test_6000"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_6000: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertData_test_6100 + * @tc.name To contact_data Add a full field data to the data table and verify whether the insertion is + * successful + * @tc.desc Function test + */ + it("contactCard_insertData_test_6100", 0, async function(done) { + console.info("------logMessage contactCard_insertData_test_6100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertData_test_6100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + console.info('logMessage contactCard_insertData_test_6100: contactDataValues["raw_contact_id"] = ' + + contactDataValues.raw_contact_id); + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_insertData_test_6100: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + var map = common.getProfileContactDataMap(); + map.set("id", contactDataId.toString()); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contactCard_insertData_test_6100", profileContactDataUri); + await deleteRawContact("contactCard_insertData_test_6100"); + await deleteAll(profileContactDataUri, "contactCard_insertData_test_6100"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertData_test_6100: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_update_test_6200 + * @tc.name Modify the basic information of multiple contacts and verify whether the modification is successful + * @tc.desc Function test + */ + it("contactCard_update_test_6200", 0, async function(done) { + console.info("--------logMessage contactCard_update_test_6200 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + expect(rawContactId > 0).assertTrue(); + console.info("logMessage contactCard_update_test_6200: rawContactId = " + rawContactId); + var insertRawContactValuesOne = { + "display_name" : "xiaocai1", + }; + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, insertRawContactValuesOne); + expect(rawContactIdOne > 0).assertTrue(); + console.info("logMessage contactCard_update_test_6200: rawContactIdOne = " + rawContactIdOne); + var insertRawContactValuesTwo = { + "display_name" : "xiaocai1", + }; + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, insertRawContactValuesTwo); + expect(rawContactIdTwo > 0).assertTrue(); + console.info("logMessage contactCard_update_test_6200: rawContactIdTwo = " + rawContactIdTwo); + + var updateValues = {"display_name" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + var updataCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + console.info("logMessage contactCard_update_test_6200: updataCode = " + updataCode); + expect(updataCode == 0).assertTrue(); + sleep(sleep_one); + await queryUpdateThree( + "contactCard_update_test_6200", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo); + await deleteRawContact("contactCard_update_test_6200"); + done(); + } catch (error) { + console.info("logMessage contactCard_update_test_6200: insert error = " + error); + done(); + } + }); + + async function queryUpdateThree(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = [ "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var name = resultSet.getString(resultSet.getColumnIndex("display_name")); + expect(name == "xiaosan").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + /** + * @tc.number contactCard_UpdateRawContcat_test_6300 + * @tc.name Update raw_contact The full field data of the contact table and verify whether the modification is + * successful + * @tc.desc Function test + */ + it("contactCard_UpdateRawContcat_test_6300", 0, async function(done) { + console.info("------logMessage contactCard_UpdateRawContcat_test_6300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + console.info("logMessage contactCard_UpdateRawContcat_test_6300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + sleep(sleep_two); + var updateValues = common.getProfileRawContactUpdate(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var updataCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + console.info('logMessage contactCard_UpdateRawContcat_test_6300: updataCode = ' + updataCode); + sleep(sleep_one); + var map = common.getProfileRawContactUpdateMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contactCard_UpdateRawContcat_test_6300", profileRawContactUri); + await deleteRawContact("contactCard_UpdateRawContcat_test_6300"); + await deleteAll(profileContactDataUri, "contactCard_UpdateRawContcat_test_6300"); + done(); + } catch (error) { + console.info("logMessage contactCard_UpdateRawContcat_test_6300: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertDataUpdate_test_6400 + * @tc.name Update contact_data table, and verify whether the modification is successful + * @tc.desc Function test + */ + it("contactCard_insertDataUpdate_test_6400", 0, async function(done) { + console.info("------logMessage contactCard_insertDataUpdate_test_6400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataUpdate_test_6400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + console.info('logMessage contactCard_insertDataUpdate_test_6400: contactDataValues.raw_contact_id = ' + + contactDataValues.raw_contact_id); + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_insertDataUpdate_test_6400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + + var updateValues = common.getProfileContactDataUpdate(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactDataId.toString()); + var updataCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + console.info('logMessage contactCard_insertDataUpdate_test_6400: updataCode = ' + updataCode); + sleep(sleep_one); + var map = common.getProfileContactDataUpdateMap(); + map.set("id", contactDataId.toString()); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contactCard_insertDataUpdate_test_6400", profileContactDataUri); + await deleteRawContact("contactCard_insertDataUpdate_test_6400"); + await deleteAll(profileContactDataUri, "contactCard_insertDataUpdate_test_6400"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertDataUpdate_test_6400: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertDataUpdateAll_test_6500 + * @tc.name Update all contact details and verify that the modification was successful + * @tc.desc Function test + */ + it("contactCard_insertDataUpdateAll_test_6500", 0, async function(done) { + console.info("------logMessage contactCard_insertDataUpdateAll_test_6500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataUpdateAll_test_6500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await insertData(rawContactId, "name", "xiaocai", ""); + await insertData(rawContactId, "phone", "6500", ""); + await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await insertData(rawContactId, "nickname", "xxxxcai", ""); + await insertData(rawContactId, "email", "111@fox.com", ""); + await insertData(rawContactId, "postal_address", "dddd", ""); + await insertData(rawContactId, "note", "caicai", ""); + await insertData(rawContactId, "im", "999999999", ""); + await insertData(rawContactId, "contact_event", "1125", ""); + await insertData(rawContactId, "website", "wwww.xxx.com", ""); + await insertData(rawContactId, "relation", "xiaobai", ""); + await insertData(rawContactId, "group_membership", 1, ""); + await insertData(rawContactId, "contact_misc", "5678", ""); + var updateValues = {"detail_info" : "xiaocai"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + var updataCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + console.info('logMessage contactCard_insertDataUpdateAll_test_6500: updataCode = ' + updataCode); + sleep(sleep_one); + await queryUpdateAllData("contactCard_insertDataUpdateAll_test_6500", DAHelper, rawContactId); + await deleteRawContact("contactCard_insertDataUpdateAll_test_6500"); + await deleteAll(profileContactDataUri, "contactCard_insertDataUpdateAll_test_6500"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertDataUpdateAll_test_6500: raw_contact insert error = " + error); + done(); + } + }); + + async function queryUpdateAllData(tag, DAHelper, rawContactId) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("row_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var detail_info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + expect(detail_info == "xiaocai").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + /** + * @tc.number contactCard_insertFavorite_test_6600 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Function test + */ + it("contactCard_insertFavorite_test_6600", 0, async function(done) { + console.info("------logMessage contactCard_insertFavorite_test_6600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = {"display_name" : "xiaocai", "favorite" : 1}; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertFavorite_test_6600: rawContactId = " + rawContactId); + + var insertRawContactValuesOne = {"display_name" : "xiaotian", "favorite" : 1}; + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, insertRawContactValuesOne); + console.info("logMessage contactCard_insertFavorite_test_6600: rawContactId = " + rawContactIdOne); + + var insertRawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, insertRawContactValuesTwo); + console.info("logMessage contactCard_insertFavorite_test_6600: rawContactId = " + rawContactIdTwo); + + sleep(sleep_one); + await queryThreeFavorite( + "contactCard_insertFavorite_test_6600", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 1); + await deleteRawContact("contactCard_insertFavorite_test_6600"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertFavorite_test_6600: raw_contact insert error = " + error); + done(); + } + }); + + async function queryThreeFavorite(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, favoritevalue) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryThreeFavorite start ! DAHelper = ' + DAHelper); + var resultColumns = [ "favorite" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var favorite = resultSet.getInt(resultSet.getColumnIndex("favorite")); + expect(favorite == favoritevalue).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryThreeFavorite: error = " + error); + } + } + + /** + * @tc.number contactCard_unFavorite_test_6700 + * @tc.name Remove favorites from multiple contacts and verify that the favorites field has changed + * @tc.desc Function test + */ + it("contactCard_unFavorite_test_6700", 0, async function(done) { + console.info("------logMessage contactCard_unFavorite_test_6700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = {"display_name" : "xiaocai", "favorite" : 1}; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_unFavorite_test_6700: rawContactId = " + rawContactId); + + var insertRawContactValuesOne = {"display_name" : "xiaotian", "favorite" : 1}; + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, insertRawContactValuesOne); + console.info("logMessage contactCard_unFavorite_test_6700: rawContactId = " + rawContactIdOne); + + var insertRawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, insertRawContactValuesTwo); + console.info("logMessage contactCard_unFavorite_test_6700: rawContactId = " + rawContactIdTwo); + + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + var updataCode = await DAHelper.update(profileRawContactUri, updateValues, condition); + console.info("logMessage contactCard_unFavorite_test_6700: updataCode = " + updataCode); + sleep(sleep_one); + await queryThreeFavorite( + "contactCard_unFavorite_test_6700", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 0); + await deleteRawContact("contactCard_unFavorite_test_6700"); + done(); + } catch (error) { + console.info("logMessage contactCard_unFavorite_test_6700: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertContactBlocklist_test_6800 + * @tc.name Add multiple records to the blacklist and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contactCard_insertContactBlocklist_test_6800", 0, async function(done) { + console.info("--------logMessage contactCard_insertContactBlocklist_test_6800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contactCard_insertContactBlocklist_test_6800: insert = " + batchInsertCode); + var batchInsertCodeOne = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contactCard_insertContactBlocklist_test_6800: insert = " + batchInsertCodeOne); + var batchInsertCodeTwo = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contactCard_insertContactBlocklist_test_6800: insert = " + batchInsertCodeTwo); + sleep(sleep_one); + expect(batchInsertCode > 0).assertTrue(); + await query(array_three); + await deleteAll(profileBlocklistUri, "contactCard_insertContactBlocklist_test_6800"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertContactBlocklist_test_6800: batchInsert error = " + error); + done(); + } + + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "123456789"); + try { + var resultSet = await DAHelper.query(profileBlocklistUri, resultColumns, condition); + sleep(sleep_one); + console.info('contactCard_insertContactBlocklist_test_6800 :resultSet.goToFirstRow() = ' + + resultSet.goToFirstRow()); + console.info( + 'contactCard_insertContactBlocklist_test_6800 : query result is = ' + resultSet.rowCount == size); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contactCard_insertContactBlocklist_test_6800 error = " + error); + } + } + }); + + /** + * @tc.number contactCard_removeContactBlocklist_test_6900 + * @tc.name Delete multiple records from the blacklist and verify whether the deletion is successful + * @tc.desc Function test + */ + it("contactCard_removeContactBlocklist_test_6900", 0, async function(done) { + console.info("--------logMessage contactCard_removeContactBlocklist_test_6900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info( + "logMessage contactCard_removeContactBlocklist_test_6900: batchInsertCode = " + batchInsertCode); + var batchInsertCodeOne = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contactCard_removeContactBlocklist_test_6900: insert = " + batchInsertCodeOne); + var batchInsertCodeTwo = await DAHelper.insert(profileBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contactCard_removeContactBlocklist_test_6900: insert = " + batchInsertCodeTwo); + sleep(sleep_one); + expect(batchInsertCode > 0).assertTrue(); + await deleteAll(profileBlocklistUri, "contactCard_removeContactBlocklist_test_6900"); + await query(0); + done(); + } catch (error) { + console.info("logMessage contactCard_removeContactBlocklist_test_6900: batchInsert error = " + error); + done(); + } + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "123456789"); + try { + var resultSet = await DAHelper.query(profileBlocklistUri, resultColumns, condition); + console.info('contactCard_removeContactBlocklist_test_6900 : resultSet = ' + resultSet); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contactCard_removeContactBlocklist_test_6900 error = " + error); + } + } + }); + + /** + * @tc.number contactCard_insertGroup_test_7000 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Function test + */ + it("contactCard_insertGroup_test_7000", 0, async function(done) { + console.info("------logMessage contactCard_insertGroup_test_7000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertGroup_test_7000: rawContactId = " + rawContactId); + await insertData(rawContactId, "group_membership", 1, ""); + + var insertRawContactValuesOne = { + "display_name" : "xiaotian", + }; + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, insertRawContactValuesOne); + console.info("logMessage contactCard_insertGroup_test_7000: rawContactId = " + rawContactIdOne); + await insertData(rawContactIdOne, "group_membership", 1, ""); + var insertRawContactValuesTwo = { + "display_name" : "xiaoli", + }; + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, insertRawContactValuesTwo); + console.info("logMessage contactCard_insertGroup_test_7000: rawContactId = " + rawContactIdTwo); + await insertData(rawContactIdTwo, "group_membership", 1, ""); + sleep(sleep_one); + await queryThreeGroup( + "contactCard_insertGroup_test_7000", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 1); + await deleteRawContact("contactCard_insertGroup_test_7000"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertGroup_test_7000: raw_contact insert error = " + error); + done(); + } + }); + + async function queryThreeGroup(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, groupId) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryThreeGroup start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var group = resultSet.getInt(resultSet.getColumnIndex("detail_info")); + expect(group == groupId).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryThreeGroup: error = " + error); + } + } + + /** + * @tc.number contactCard_insert_test_7100 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contactCard_insert_test_7100", 0, async function(done) { + console.info("---------logMessage contactCard_insert_test_7100 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(profileGroupUri, common.getProfileGroup()); + console.info("logMessage contactCard_insert_test_7100: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await contactsQuery(map, "contactCard_insert_test_7100", profileGroupUri); + await deleteAll(profileGroupUri, "contactCard_insert_test_7100"); + done(); + } catch (error) { + console.info("logMessage contactCard_insert_test_7100: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_delete_test_7200 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contactCard_delete_test_7200", 0, async function(done) { + console.info("------logMessage contactCard_delete_test_7200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_delete_test_7200: rawContactId = " + rawContactId); + await insertData(rawContactId, "group_membership", 1, ""); + + var insertRawContactValuesOne = { + "display_name" : "xiaotian", + }; + var rawContactIdOne = await DAHelper.insert(profileRawContactUri, insertRawContactValuesOne); + console.info("logMessage contactCard_delete_test_7200: rawContactId = " + rawContactIdOne); + await insertData(rawContactIdOne, "group_membership", 1, ""); + var insertRawContactValuesTwo = { + "display_name" : "xiaoli", + }; + var rawContactIdTwo = await DAHelper.insert(profileRawContactUri, insertRawContactValuesTwo); + console.info("logMessage contactCard_delete_test_7200: rawContactId = " + rawContactIdTwo); + await insertData(rawContactIdTwo, "group_membership", 1, ""); + sleep(sleep_one); + await deleteAll(profileContactDataUri, "contactCard_delete_test_7200"); + sleep(sleep_one); + await queryZeroGroup( + "contactCard_delete_test_7200", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo); + await deleteRawContact("contactCard_delete_test_7200"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_7200: raw_contact insert error = " + error); + done(); + } + }); + + async function queryZeroGroup(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryZeroGroup start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + console.info(tag + ': queryZeroGroup! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 0).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryZeroGroup: error = " + error); + } + } + + /** + * @tc.number contactCard_delete_test_7300 + * @tc.name Delete the full field data of a groups table and verify whether the deletion is successful + * @tc.desc Function test + */ + it("contactCard_delete_test_7300", 0, async function(done) { + console.info("---------logMessage contactCard_delete_test_7300 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(profileGroupUri, common.getProfileGroup()); + console.info("logMessage contactCard_delete_test_7300: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await contactsQuery(map, "contactCard_delete_test_7300", profileGroupUri); + await deleteAll(profileGroupUri, "contactCard_delete_test_7300"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_7300: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_delete_test_7400 + * @tc.name Add a raw_contact all fields, delete raw_contact + * @tc.desc Function test + */ + it("contactCard_delete_test_7400", 0, async function(done) { + console.info("------logMessage contactCard_delete_test_7400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contactCard_delete_test_7400: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + map.set("version", "2"); + map.set("is_deleted", "1"); + await deleteAll(profileRawContactUri, "contactCard_delete_test_7400"); + sleep(sleep_one); + await contactsQuery(map, "contactCard_delete_test_7400", profileRawContactUri); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + var code = await DAHelper.delete(profileDeletedContactsUri, conditionAll); + console.info('contactCard_delete_test_7400 : Completely delete code = ' + code); + expect(code == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contactCard_delete_test_7400: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contactCard_delete_test_7500 + * @tc.name Delete contact_data Single full field data in data table + * @tc.desc Function test + */ + it("contactCard_delete_test_7500", 0, async function(done) { + console.info("------logMessage contactCard_delete_test_7500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_delete_test_7500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + var contactDataId = await DAHelper.insert(profileContactDataUri, contactDataValues); + console.info('logMessage contactCard_delete_test_7500: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await deleteAll(profileContactDataUri, "contactCard_delete_test_7500"); + var map = new Map(); + map.set("id", contactDataId.toString()); + await queryIdForDelete(map, "contactCard_delete_test_7500", profileContactDataUri); + await deleteRawContact("contactCard_delete_test_7500"); + done(); + } catch (error) { + console.info("logMessage contactCard_delete_test_7500: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertDataAll_test_7600 + * @tc.name Add all details of a single contact and verify whether the insertion is successful (name, mobile + * number, company, position, nickname, email, home, remarks, aim) + * @tc.desc Function test + */ + it("contactCard_insertDataAll_test_7600", 0, async function(done) { + console.info("------logMessage contactCard_insertDataAll_test_7600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataAll_test_7600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactdata1 = await insertData(rawContactId, "name", "xiaocai", ""); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdata1, "xiaocai"); + var contactdata2 = await insertData(rawContactId, "phone", "6500", ""); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdata2, "6500"); + var contactdatd3 = await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd3, "TTTTT"); + var contactdatd4 = await insertData(rawContactId, "nickname", "xxxxcai", ""); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd4, "xxxxcai"); + var contactdatd5 = await insertData(rawContactId, "email", "111@fox.com", ""); + await queryAlldata( + "contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd5, "111@fox.com"); + var contactdatd6 = await insertData(rawContactId, "postal_address", "dddd", ""); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd6, "dddd"); + var contactdatd7 = await insertData(rawContactId, "note", "caicai", ""); + await queryAlldata("contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd7, "caicai"); + var contactdatd8 = await insertData(rawContactId, "im", "999999999", ""); + await queryAlldata( + "contactCard_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd8, "999999999"); + sleep(sleep_one); + await deleteRawContact("contactCard_insertDataAll_test_7600"); + await deleteAll(profileContactDataUri, "contactCard_insertDataAll_test_7600"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertDataAll_test_7600: raw_contact insert error = " + error); + done(); + } + }); + + async function queryAlldata(tag, DAHelper, rawContactId, contactdata, values) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactdata.toString()); + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var id = resultSet.getString(resultSet.getColumnIndex("raw_contact_id")); + console.info(tag + " result raw_contact_id = " + id); + expect(id == rawContactId).assertEqual(true); + var info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + console.info(tag + "result info = " + info + " value = " + values); + expect(info == values).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage queryIdForDelete: error = " + error); + } + } + + /** + * @tc.number contactCard_insertDataAll_test_7700 + * @tc.name Add all details of a single contact and verify whether the insertion is successful (name, mobile + * number, company, position, nickname, email, home, remarks, aim, birthday, website, assistant, group, phone ring) + * @tc.desc Function test + */ + it("contactCard_insertDataAll_test_7700", 0, async function(done) { + console.info("------logMessage contactCard_insertDataAll_test_7700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataAll_test_7700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactdata1 = await insertData(rawContactId, "name", "xiaocai", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdata1, "xiaocai"); + var contactdata2 = await insertData(rawContactId, "phone", "6500", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdata2, "6500"); + var contactdatd3 = await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd3, "TTTTT"); + var contactdatd4 = await insertData(rawContactId, "nickname", "xxxxcai", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd4, "xxxxcai"); + var contactdatd5 = await insertData(rawContactId, "email", "111@fox.com", ""); + await queryAlldata( + "contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd5, "111@fox.com"); + var contactdatd6 = await insertData(rawContactId, "postal_address", "dddd", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd6, "dddd"); + var contactdatd7 = await insertData(rawContactId, "note", "caicai", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd7, "caicai"); + var contactdatd8 = await insertData(rawContactId, "im", "999999999", ""); + await queryAlldata( + "contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd8, "999999999"); + var contactdatd9 = await insertData(rawContactId, "contact_event", "1125", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd9, "1125"); + var contactdatd10 = await insertData(rawContactId, "website", "wwww.xxx.com", ""); + await queryAlldata( + "contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd10, "wwww.xxx.com"); + var contactdatd11 = await insertData(rawContactId, "relation", "xiaobai", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd11, "xiaobai"); + var contactdatd12 = await insertData(rawContactId, "group_membership", 1, ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd12, 1); + var contactdatd13 = await insertData(rawContactId, "contact_misc", "5678", ""); + await queryAlldata("contactCard_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd13, "5678"); + sleep(sleep_one); + await deleteRawContact("contactCard_insertDataAll_test_7700"); + await deleteAll(profileContactDataUri, "contactCard_insertDataAll_test_7700"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertDataAll_test_7700: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contactCard_insertDataUpdateMore_test_7800 + * @tc.name Modify multiple contact details and verify whether the modification is successful + * @tc.desc Function test + */ + it("contactCard_insertDataUpdateMore_test_7800", 0, async function(done) { + console.info("------logMessage contactCard_insertDataUpdateMore_test_7800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xiaocai"}; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataUpdateMore_test_7800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + + var insertRawContactValues = {"display_name" : "xiaotian"}; + var rawContactId1 = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_insertDataUpdateMore_test_7800: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await insertData(rawContactId, "name", "xiaotian", ""); + + var updateValues = {"detail_info" : "xiaocai7800"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId1.toString()) + var updataCode = await DAHelper.update(profileContactDataUri, updateValues, condition); + console.info('logMessage contactCard_insertDataUpdateMore_test_7800: updataCode = ' + updataCode); + sleep(sleep_one); + await insertDataUpdateMoreQuery( + "contactCard_insertDataUpdateMore_test_7800", DAHelper, rawContactId, rawContactId1); + await deleteRawContact("contactCard_insertDataUpdateMore_test_7800"); + await deleteAll(profileContactDataUri, "contactCard_insertDataUpdateMore_test_7800"); + done(); + } catch (error) { + console.info("logMessage contactCard_insertDataUpdateMore_test_7800: raw_contact insert error = " + error); + done(); + } + }); + + async function insertDataUpdateMoreQuery(tag, DAHelper, rawContactId, rawContactId1) + { + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId1.toString()) + try { + var resultSet = await DAHelper.query(profileContactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + console.info(tag + "result info = " + info); + expect(info == "xiaocai7800").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage : error = " + error); + } + } + + /** + * @tc.number contactCard_deleterestore_test_7900 + * @tc.name Modify multiple contact details and verify whether the modification is successful + * @tc.desc Function test + */ + it("contactCard_deleterestore_test_7900", 0, async function(done) { + console.info("------logMessage contactCard_deleterestore_test_7900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xaioli7900"}; + var rawContactId = await DAHelper.insert(profileRawContactUri, insertRawContactValues); + console.info("logMessage contactCard_deleterestore_test_7900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + sleep(sleep_one); + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(profileRawContactUri, condition1); + console.info("contactCard_deleterestore_test_7900 : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + sleep(sleep_one); + + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("id", rawContactId.toString()); + var updatevalue = {"is_deleted" : 0}; + var updateCode = await DAHelper.update(profileRawContactUri, updatevalue, condition2); + console.info('contactCard_deleterestore_test_7900 : update = ' + updateCode); + sleep(sleep_one); + + var condition3 = new ohos_data_ability.DataAbilityPredicates(); + condition3.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(profile_deleted_raw_contact_record, condition3); + + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("is_deleted", "0"); + await contactsQuery(map, "contactCard_deleterestore_test_7900", profileRawContactUri); + done(); + } catch (error) { + console.info("logMessage contactCard_deleterestore_test_7900: raw_contact insert error = " + error); + done(); + } + }); + + afterAll(async function() { + var tag = "Contacts_test_start_deleted"; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var DAHelperContact = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': start ! DAHelperContact = ' + DAHelperContact); + var deleteBlockList = await DAHelperContact.delete(profileBlocklistUri, condition); + console.info(tag + " : logMessage : deleteBlockList = " + deleteBlockList); + var deletedGroup = await DAHelperContact.delete(profileGroupUri, condition); + console.info(tag + " : logMessage : deletedGroup = " + deletedGroup); + var dataDeletedCode = await DAHelperContact.delete(profileContactDataUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : dataDeletedCode = " + dataDeletedCode); + var rawContactDeleted = await DAHelperContact.delete(profileRawContactUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : rawContactDeleted = " + rawContactDeleted); + var deleted = await DAHelperContact.delete(profileDeletedContactsUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : deleted = " + deleted); + }); +}); diff --git a/jstest/ContactMerge_test.js b/jstest/ContactMerge_test.js new file mode 100644 index 0000000..5817a99 --- /dev/null +++ b/jstest/ContactMerge_test.js @@ -0,0 +1,1778 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; + +const autoMergeUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_merge"; +const splitUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact/split_contact"; +const manualMergeUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact/manual_merge"; +const uriQueryMergeList = "dataability:///com.ohos.contactsdataability/contacts/raw_contact/query_merge_list"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + +describe('ContactMergeTest', function() { + console.info("ContactMergeTest start!"); + + var sleep_two = 2000; + var sleep_one = 1000; + var sleep_three = 3000; + var result_two = 2; + var result_three = 3; + var array_two = 2; + + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + async function ContactDataInsert1(DAHelper, rawContactId1) + { + var contactDataValues = {"raw_contact_id" : rawContactId1, "content_type" : "name", "detail_info" : "xiaoli"}; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_auto_merge_and_spilt_test_100: contactDataId1 = " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_auto_merge_and_spilt_test_100: contact_data_1 insert error = ' + error); + } + } + + async function ContactDataInsert2(DAHelper, rawContactId2) + { + var contactDataValues = {"raw_contact_id" : rawContactId2, "content_type" : "name", "detail_info" : "xiaoli"}; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_auto_merge_and_spilt_test_100: contactDataId2 = " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_auto_merge_and_spilt_test_100: contact_data_2 insert error = ' + error); + } + } + + async function AutoMerge(DAHelper, rawContactId1) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + console.info("logMessage contact_auto_merge_and_spilt_test_100: autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_auto_merge_and_spilt_test_100", result_two); + sleep(sleep_two); + await ContactSplit(DAHelper, rawContactId1); + await deleteAll(rawContactUri, "contact_auto_merge_and_spilt_test_100"); + await deleteAll(contactDataUri, "contact_auto_merge_and_spilt_test_100"); + } catch (error) { + console.info("logMessage contact_auto_merge_and_spilt_test_100: auto_merge error = " + error); + } + } + + async function ContactSplit(DAHelper, rawContactId1) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + var array = [ rawContactId1.toString() ]; + condition2.in("raw_contact_id", array); + var updateValues2 = {}; + try { + var splitCode = await DAHelper.update(splitUri, updateValues2, condition2); + sleep(sleep_three); + console.info('logMessage contact_auto_merge_and_spilt_test_100 splitCode = ' + splitCode); + expect(splitCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_auto_merge_and_spilt_test_100", 1); + } catch (error) { + console.info('logMessage contact_auto_merge_and_spilt_test_100 split error = ' + error); + } + } + + async function deleteAll(uri, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(uri, condition); + console.info(tag + ': deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } + + async function ContactMergeQuery(map, tag, size) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ' : ContactMergeQuery start ! DAHelper = ' + DAHelper); + var resultColumns = [ "contact_id" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + console.info(tag + ' : map_id = ' + map.get("id")); + condition.equalTo("id", map.get("id")); + try { + var resultSetID = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + var conatctID; + if (resultSetID.goToFirstRow()) { + do { + conatctID = resultSetID.getString(resultSetID.getColumnIndex("contact_id")); + console.info(tag + ' : contact_id = ' + conatctID); + } while (resultSetID.goToNextRow()); + } + resultSetID.close(); + var pre = new ohos_data_ability.DataAbilityPredicates(); + pre.equalTo("contact_id", conatctID); + var newResultColumns = []; + var resultSet = await DAHelper.query(rawContactUri, newResultColumns, pre); + sleep(sleep_one); + console.info(tag + ' : ContactMergeQuery start ! rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(tag + " : logMessage ContactMergeQuery: error = " + error); + } + } + + async function updateContactData(updateDataValue, contactDataId, testName) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var updateValues = {"detail_info" : updateDataValue}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactDataId.toString()); + var code = await DAHelper.update(contactDataUri, updateValues, condition); + console.info(testName + " updateContactData: code = " + code); + sleep(sleep_three); + } + + async function insertContactData(DAHelper, rawContactId, detailInfo, types, tag) + { + var size = detailInfo.length; + for (var i = 0; i < size; i++) { + var contactDataValues = { + "raw_contact_id" : rawContactId.toString(), + "content_type" : types[i], + "detail_info" : detailInfo[i] + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_two); + expect(contactDataId > 0).assertTrue(); + console.info(tag + ' logMessage : insert contactDataId = ' + contactDataId); + } catch (error) { + console.info('logMessage : contact_data_1 insert error = ' + error); + } + } + } + + async function insertContactDataSingle(DAHelper, rawContactId, detailInfo, type) + { + var size = detailInfo.length; + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : type, "detail_info" : detailInfo}; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + expect(contactDataId1 > 0).assertTrue(); + } catch (error) { + console.info('logMessage : contact_data_1 insert error = ' + error); + } + return contactDataId1; + } + + async function ManualMergeList(DAHelper, rawContactList, testName) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.in("raw_contact_id", rawContactList); + var updateValues2 = {}; + try { + var ManualMergeCode = await DAHelper.update(manualMergeUri, updateValues2, condition2); + sleep(sleep_one); + console.info("logMessage " + testName + " ManualMergeCode = " + ManualMergeCode); + expect(ManualMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactList[0].toString()); + await ContactMergeQuery(map, testName, rawContactList.length); + await deleteAll(rawContactUri, testName); + await deleteAll(contactDataUri, testName); + } catch (error) { + console.info("logMessage " + testName + " manual_merge error = " + error); + } + } + + /** + * @tc.number contact_autoMerge_and_spilt_test_100 + * @tc.name Two contacts without mobile phone number with the same name are automatically merged and split + * @tc.desc Function test + */ + it("contact_autoMerge_and_spilt_test_100", 0, async function(done) { + console.info("------logMessage contact_autoMerge_and_spilt_test_100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues1 = {"display_name" : "xiaoli"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_and_spilt_test_100: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await ContactDataInsert1(DAHelper, rawContactId1); + } catch (error) { + console.info('logMessage contact_autoMerge_and_spilt_test_100: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaoli"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_and_spilt_test_100: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await ContactDataInsert2(DAHelper, rawContactId2); + } catch (error) { + console.info('logMessage contact_autoMerge_and_spilt_test_100: raw_contact_2 insert error = ' + error); + done(); + } + await AutoMerge(DAHelper, rawContactId1); + done(); + }); + + /** + * @tc.number contact_manualMerge_test_200 + * @tc.name Two contacts with the same name, one with a mobile phone number and the other without a mobile phone + * number, call the manual merge interface + * @tc.desc Function test + */ + it("contact_manualMerge_test_200", 0, async function(done) { + console.info("------logMessage contact_manualMerge_test_200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues1 = {"display_name" : "xiaoming"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_200: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await manualMergeDataInsert(DAHelper, rawContactId1); + } catch (error) { + console.info('logMessage contact_manualMerge_test_200: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaoming"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_200: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await manualMergeDataInsertTwo(DAHelper, rawContactId2); + } catch (error) { + console.info('logMessage contact_manualMerge_test_200: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_2000"); + done(); + }); + + async function manualMergeDataInsert(DAHelper, rawContactId1) + { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId1, + "content_type" : "name", + "detail_info" : "xiaoming" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId1, + "content_type" : "phone", + "detail_info" : "123456789", + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_200: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_200: batch insert error = " + error) + } + } + + async function manualMergeDataInsertTwo(DAHelper, rawContactId2) + { + var contactDataValues = {"raw_contact_id" : rawContactId2, "content_type" : "name", "detail_info" : "xiaoming"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_200: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_200: contact_data_2 insert error = " + error) + } + } + + /** + * @tc.number contact_autoMerge_test_300 + * @tc.name Two contacts with the same name have a mobile phone number, and the mobile phone numbers are the + * same. Call the automatic merge interface + * @tc.desc Function test + */ + it("contact_autoMerge_test_300", 0, async function(done) { + console.info("------logMessage contact_autoMerge_test_300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues1 = {"display_name" : "xiaohong"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_300: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await autoMergeDataInsert(DAHelper, rawContactId1); + } catch (error) { + console.info('logMessage contact_autoMerge_test_300: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaohong"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_300: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await autoMergeDataInsertTwo(DAHelper, rawContactId2); + } catch (error) { + console.info('logMessage contact_autoMerge_test_300: raw_contact_2 insert error = ' + error); + done(); + } + + await AutoMerger(DAHelper, rawContactId1, "contact_autoMerge_test_300"); + done(); + }); + + async function autoMergeDataInsert(DAHelper, rawContactId1) + { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId1, + "content_type" : "name", + "detail_info" : "xiaohong" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId1, + "content_type" : "phone", + "detail_info" : "123465", + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_autoMerge_test_300: batch insert1 error = " + error) + } + } + + async function autoMergeDataInsertTwo(DAHelper, rawContactId2) + { + var contactDataValuesThree = { + "raw_contact_id" : rawContactId2, + "content_type" : "name", + "detail_info" : "xiaohong" + }; + var contactDataValuesFour = { + "raw_contact_id" : rawContactId2, + "content_type" : "phone", + "detail_info" : "123465", + }; + var listAddBluk2 = []; + listAddBluk2[0] = contactDataValuesThree; + listAddBluk2[1] = contactDataValuesFour; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk2); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_autoMerge_test_300: batch insert2 error = " + error) + } + } + + async function AutoMerger(DAHelper, rawContactId1, testName) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage " + testName + "autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, testName, result_two); + await deleteAll(rawContactUri, testName); + await deleteAll(contactDataUri, testName); + } catch (error) { + console.info("logMessage " + testName + "auto_merge error =" + error); + } + } + + async function AutoNotMerger(DAHelper, rawContactId1, testName) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + sleep(sleep_two); + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + console.info("logMessage " + testName + "autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, testName, 1); + await deleteAll(rawContactUri, testName); + await deleteAll(contactDataUri, testName); + } catch (error) { + console.info("logMessage " + testName + "auto_merge error =" + error); + } + } + + /** + * @tc.number contact_manualMerge_test_400 + * @tc.name Two contacts with the same name have a mobile phone number, and the mobile phone numbers are + * different. Call the manual merge interface + * @tc.desc Function test + */ + it("contact_manualMerge_test_400", 0, async function(done) { + console.info("------logMessage contact_manualMerge_test_400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues1 = {"display_name" : "xiaozhang"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_400: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await noequalPhoneDataInsert(DAHelper, rawContactId1) + } catch (error) { + console.info('logMessage contact_manualMerge_test_400: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaozhang"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_400: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await noequalPhoneDataInsertTwo(DAHelper, rawContactId2) + } catch (error) { + console.info('logMessage contact_manualMerge_test_400: raw_contact_2 insert error = ' + error); + done(); + } + + await noequalManualMerge(DAHelper, rawContactId1, rawContactId2); + done(); + }); + + async function noequalPhoneDataInsert(DAHelper, rawContactId1) + { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId1, + "content_type" : "name", + "detail_info" : "xiaozhang" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId1, + "content_type" : "phone", + "detail_info" : "147852", + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_400: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_400: batch insert1 error = " + error) + } + } + + async function noequalPhoneDataInsertTwo(DAHelper, rawContactId2) + { + var contactDataValuesThree = { + "raw_contact_id" : rawContactId2, + "content_type" : "name", + "detail_info" : "xiaozhang" + }; + var contactDataValuesFour = { + "raw_contact_id" : rawContactId2, + "content_type" : "phone", + "detail_info" : "996369", + }; + var listAddBluk2 = []; + listAddBluk2[0] = contactDataValuesThree; + listAddBluk2[1] = contactDataValuesFour; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_400: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_400: batch insert2 error = " + error) + } + } + + async function noequalManualMerge(DAHelper, rawContactId1, rawContactId2) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + var id = [ rawContactId1.toString(), rawContactId2.toString() ]; + condition2.in("raw_contact_id", id); + var updateValues2 = {}; + try { + var ManualMergeCode = await DAHelper.update(manualMergeUri, updateValues2, condition2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_400 ManualMergeCode = " + ManualMergeCode); + expect(ManualMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_manualMerge_test_400", result_two); + await deleteAll(rawContactUri, "contact_manualMerge_test_400"); + await deleteAll(contactDataUri, "contact_manualMerge_test_400"); + } catch (error) { + console.info("logMessage contact_manualMerge_test_400 manual_merge error = " + error); + } + } + + /** + * @tc.number contact_manualMerge_test_500 + * @tc.name Two contacts with the same name, one with two mobile phone numbers and the other without mobile phone + * numbers, call the manual merge interface + * @tc.desc Function test + */ + it("contact_manualMerge_test_500", 0, async function(done) { + console.info("------logMessage contact_manualMerge_test_500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues1 = {"display_name" : "xiaozhou"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await manualDataInsert(DAHelper, rawContactId1) + } catch (error) { + console.info('logMessage contact_manualMerge_test_500: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaozhou"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_500: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await manualDataInsertTwo(DAHelper, rawContactId2) + } catch (error) { + console.info('logMessage contact_manualMerge_test_500: raw_contact_2 insert error = ' + error); + done(); + } + await hasOneNoPhoneManualMerge(DAHelper, rawContactId1, rawContactId2); + done(); + }); + + async function manualDataInsert(DAHelper, rawContactId1) + { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId1, + "content_type" : "name", + "detail_info" : "xiaozhou" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId1, + "content_type" : "phone", + "detail_info" : "123456789", + }; + var contactDataValuesThree = { + "raw_contact_id" : rawContactId1, + "content_type" : "phone", + "detail_info" : "996632", + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + listAddBluk[array_two] = contactDataValuesThree; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_500: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_500: batch insert1 error = " + error) + } + } + + async function manualDataInsertTwo(DAHelper, rawContactId2) + { + var contactDataValuesFour = { + "raw_contact_id" : rawContactId2, + "content_type" : "name", + "detail_info" : "xiaozhou" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValuesFour); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_500: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_manualMerge_test_500: contact_data insert error = " + error) + } + } + + async function hasOneNoPhoneManualMerge(DAHelper, rawContactId1, rawContactId2) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + var id = [ rawContactId1.toString(), rawContactId2.toString() ]; + condition2.in("raw_contact_id", id); + var updateValues2 = {}; + try { + var ManualMergeCode = await DAHelper.update(manualMergeUri, updateValues2, condition2); + sleep(sleep_one); + console.info("logMessage contact_manualMerge_test_500 ManualMergeCode = " + ManualMergeCode); + expect(ManualMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_manualMerge_test_500", result_two); + await deleteAll(rawContactUri, "contact_manualMerge_test_500"); + await deleteAll(contactDataUri, "contact_manualMerge_test_500"); + } catch (error) { + console.info("logMessage contact_manualMerge_test_500 manual_merge error = " + error); + } + } + + /** + * @tc.number contact_autoMerge_test_600 + * @tc.name Batch add contacts, then call auto merge interface. + * @tc.desc Function test + */ + it("contact_autoMerge_test_600", 0, async function(done) { + console.info("------logMessage contact_autoMerge_test_600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues1 = {"display_name" : "xiaoliu"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_600: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_autoMerge_test_600: raw_contact_1 insert error = ' + error); + done(); + } + + try { + var insertRawContactValues2 = {"display_name" : "xiaoliu"}; + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_600: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_autoMerge_test_600: raw_contact_2 insert error = ' + error); + done(); + } + + try { + var insertRawContactValues3 = {"display_name" : "xiaoliu"}; + var rawContactId3 = await DAHelper.insert(rawContactUri, insertRawContactValues3); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_600: rawContactId3 = " + rawContactId3); + expect(rawContactId3 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_autoMerge_test_600: raw_contact_3 insert error = ' + error); + done(); + } + + await ContactDataBatchInsert(); + done(); + }); + + async function ContactDataBatchInsert(DAHelper, rawContactId1, rawContactId2, rawContactId3) + { + var contactDataValues1 = {"raw_contact_id" : rawContactId1, "content_type" : "name", "detail_info" : "xiaoliu"}; + var contactDataValues2 = {"raw_contact_id" : rawContactId2, "content_type" : "name", "detail_info" : "xiaoliu"}; + var contactDataValues3 = {"raw_contact_id" : rawContactId3, "content_type" : "name", "detail_info" : "xiaoliu"}; + var listAddBluk = []; + listAddBluk[0] = contactDataValues1; + listAddBluk[1] = contactDataValues2; + listAddBluk[array_two] = contactDataValues3; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_two); + console.info("logMessage contact_autoMerge_test_600: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await threeAutoMerger(); + await deleteAll(rawContactUri, "contact_autoMerge_test_600"); + await deleteAll(contactDataUri, "contact_autoMerge_test_600"); + } catch (error) { + console.info('logMessage contact_autoMerge_test_600: raw_contact insert error = ' + error); + } + } + + async function threeAutoMerger(DAHelper, rawContactId1) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contact_autoMerge_test_600 autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_autoMerge_test_600", result_three); + } catch (error) { + console.info("logMessage contact_autoMerge_test_600 auto_merge error = " + error); + } + } + + /** + * @tc.number contact_query_merge_list_test_700 + * @tc.name Query contacts to be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_700", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_700 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "xiaowu"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_700: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await queryContactDataInsert(DAHelper, rawContactId1); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_700: raw_contact_1 insert error = ' + error); + done(); + } + + var insertRawContactValues2 = {"display_name" : "xiaowu"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_700: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await queryContactDataInsertTwo(DAHelper, rawContactId2); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_700: raw_contact_2 insert error = ' + error); + done(); + } + await queryMergeList(DAHelper, rawContactId1, rawContactId2, "contact_query_merge_list_test_700"); + done(); + }); + + async function queryContactDataInsert(DAHelper, rawContactId1) + { + var contactDataValues = {"raw_contact_id" : rawContactId1, "content_type" : "name", "detail_info" : "xiaowu"}; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_700: contactDataId1 = " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_700: contact_data_1 insert error = ' + error); + } + } + + async function queryContactDataInsertTwo(DAHelper, rawContactId2) + { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId2, + "content_type" : "name", + "detail_info" : "xiaowu" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId2, + "content_type" : "phone", + "detail_info" : "002563" + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_700: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_700: contact_data_2 insert error = ' + error); + } + } + + async function queryMergeList(DAHelper, rawContactId1, rawContactId2, testName) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var columns = []; + var predicates = new ohos_data_ability.DataAbilityPredicates(); + try { + sleep(sleep_three); + var resultSet = await DAHelper.query(uriQueryMergeList, columns, predicates); + var array = [ rawContactId1, rawContactId2 ]; + var i = 0; + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var rawContactId = resultSet.getInt(resultSet.getColumnIndex("raw_contact_id")); + console.info(testName + (array[i] == rawContactId)); + expect(array[i] == rawContactId).assertTrue(); + console.info(testName + rawContactId); + i++; + } while (resultSet.goToNextRow()) + } + } + resultSet.close(); + await deleteAll(rawContactUri, testName); + await deleteAll(contactDataUri, testName); + } catch (error) { + console.info(testName + ": query error = " + error); + } + } + + /** + * @tc.number contact_query_merge_list_test_800 + * @tc.name Insert contacts with the same name and different mobile phone numbers, + * and check whether the database can query contacts that can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_800", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_800 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "xiaowuu"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_800: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "xiaowuu", "1854154" ]; + var types = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_800"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_800: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "xiaowuu"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_800: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "xiaowuu", "1854154414242" ]; + var types1 = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_800"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_800: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_800"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_900 + * @tc.name Insert two contacts with different names to see if the database can + * query contacts that can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_900", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_900 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "xiaowusu"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_900: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "xiaowusu" ]; + var types = [ "name" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_900"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_900: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "kxiaowusu"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_900: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "kxiaowusu" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_900"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_900: raw_contact_2 insert error = ' + error); + done(); + } + await ManualNotMerge(DAHelper, rawContactId1, rawContactId2, "contact_query_merge_list_test_900"); + done(); + }); + + async function ManualNotMerge(DAHelper, rawContactId1, rawContactId2, tag) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + var id = [ rawContactId1.toString(), rawContactId2.toString() ]; + condition2.in("raw_contact_id", id); + var updateValues2 = {}; + try { + var ManualMergeCode = await DAHelper.update(manualMergeUri, updateValues2, condition2); + sleep(sleep_one); + console.info(tag + "logMessage ManualMergeCode = " + ManualMergeCode); + expect(ManualMergeCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, tag, 1); + await deleteAll(rawContactUri, tag); + await deleteAll(contactDataUri, tag); + } catch (error) { + console.info(tag + "logMessage manual_merge error = " + error); + } + } + + /** + * @tc.number contact_query_merge_list_test_1000 + * @tc.name Insert contacts with the same name and phone number, and check whether + * the database can query contacts that can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1000", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1000 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "xiaotiantian"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1000: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "xiaotiantian", "1854154414242441" ]; + var types = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1000"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1000: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "xiaotiantian"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1000: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "xiaotiantian", "1854154414242441" ]; + var types1 = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1000"); + sleep(sleep_two); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1000: raw_contact_2 insert error = ' + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + sleep(sleep_three); + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + console.info("logMessage contact_query_merge_list_test_1000: autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_query_merge_list_test_1000", result_two); + await deleteAll(rawContactUri, "contact_query_merge_list_test_1000"); + await deleteAll(contactDataUri, "contact_query_merge_list_test_1000"); + done(); + } catch (error) { + console.info("logMessage contact_query_merge_list_test_1000: auto_merge error = " + error); + } + }); + + /** + * @tc.number contact_query_merge_list_test_1100 + * @tc.name Insert contacts with different names and different mobile phone numbers, + and check whether the database can query contacts that can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1100", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1100 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "wsxiuklkk"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1100: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "wsxiuklkk", "56465465" ]; + var types = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1100"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1100: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "xiaolilili"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1100: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "xiaolilili", "8954598595" ]; + var types1 = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1100"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1100: raw_contact_2 insert error = ' + error); + done(); + } + await ManualNotMerge(DAHelper, rawContactId1, rawContactId2, "contact_query_merge_list_test_1100"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1200 + * @tc.name Insert two contacts with the same name. Contacts A and B have two + same mobile phone numbers, and check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1200 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "lwsxiuklkk"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1200: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "lwsxiuklkk", "122504", "122505" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1200"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1200: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "lwsxiuklkk"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1200: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "lwsxiuklkk", "122504", "122505" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1200"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1200: raw_contact_2 insert error = ' + error); + done(); + } + await AutoMerger(DAHelper, rawContactId1, "contact_query_merge_list_test_1200"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1300 + * @tc.name Insert two contacts with the same name. Contacts A and B have two + * identical mobile phone numbers. Check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1300", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1300 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "xiaowuuklkk"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1300: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "xiaowuuklkk", "56465465", "122504" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1300"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1300: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "xiaowuuklkk"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1300: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "xiaowuuklkk", "8954598595", "1225054" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1300"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1300: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_1300"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1400 + * @tc.name Insert two contacts with the same name. Contacts A and B have two mobile phone + * numbers, one of which is the same. Check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1400", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1400 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "limingm"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1400: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "limingm", "122504555", "1122505" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1400"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1400: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "limingm"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1400: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "limingm", "122504555", "1225056" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1400"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1400: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_1400"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1500 + * @tc.name Insert two contacts with the same name, contact A has two mobile phone numbers, + * and contact B has one mobile phone number which is the same as one of the mobile phone + * numbers of A, and check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1500", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1500 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "kplimingm"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "kplimingm", "7122504555", "1122505" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1500"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1500: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "kplimingm"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1500: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "kplimingm", "7122504555" ]; + var types1 = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1500"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1500: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_1500"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1600 + * @tc.name Insert two contacts with the same name, contact A has two mobile phone numbers, + * and contact B has a mobile phone number different from that of A, check whether + * the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1600 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "pkplimingm"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1600: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "pkplimingm", "87122504555", "11122505" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1600"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1600: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "pkplimingm"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1600: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "pkplimingm", "7122554504555", "11122505" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1600"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1600: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_1600"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1700 + * @tc.name Insert multiple manually merged contacts to check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1700", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1700 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "llllllk"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1700: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "llllllk", "87122504555", "11122505" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1700"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1700: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "llllllk"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1700: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "llllllk", "7555", "02505" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1700"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1700: raw_contact_2 insert error = ' + error); + done(); + } + var insertRawContactValues3 = {"display_name" : "llllllk"}; + try { + var rawContactId3 = await DAHelper.insert(rawContactUri, insertRawContactValues3); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1700: rawContactId2 = " + rawContactId3); + expect(rawContactId3 > 0).assertTrue(); + var detailInfo1 = [ "llllllk", "87555", "002505" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId3, detailInfo1, types1, "contact_query_merge_list_test_1700"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1700: raw_contact_2 insert error = ' + error); + done(); + } + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "", rawContactId3 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_1700"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1800 + * @tc.name Import multiple automatically merged contacts to check whether the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1800", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1800 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "jggbgbk"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1800: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "jggbgbk", "85555", "996174" ]; + var types = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "contact_query_merge_list_test_1800"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1800: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "jggbgbk"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1800: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "jggbgbk", "85555", "996174" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "contact_query_merge_list_test_1800"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1800: raw_contact_2 insert error = ' + error); + done(); + } + var insertRawContactValues3 = {"display_name" : "jggbgbk"}; + try { + var rawContactId3 = await DAHelper.insert(rawContactUri, insertRawContactValues3); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1800: rawContactId2 = " + rawContactId3); + expect(rawContactId3 > 0).assertTrue(); + var detailInfo1 = [ "jggbgbk", "85555", "996174" ]; + var types1 = [ "name", "phone", "phone" ]; + await insertContactData(DAHelper, rawContactId3, detailInfo1, types1, "contact_query_merge_list_test_1800"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1800: raw_contact_2 insert error = ' + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + try { + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1800 autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactMergeQuery(map, "contact_query_merge_list_test_1800", result_three); + await deleteAll(rawContactUri, "contact_query_merge_list_test_1800"); + await deleteAll(contactDataUri, "contact_query_merge_list_test_1800"); + } catch (error) { + console.info("contact_query_merge_list_test_1800 auto_merge error =" + error); + } + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_1900 + * @tc.name Insert two contacts with the same name, contact A has two mobile phone numbers, + * and contact B has a mobile phone number different from that of A, check whether + * the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_1900", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_1900 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "owjiuh"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1900: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var dataId = insertContactDataSingle(DAHelper, rawContactId1, "owjiuh", "name"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1900: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "owjiuh"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_1900: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var dataId = insertContactDataSingle(DAHelper, rawContactId1, "owjiuh", "name"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_1900: raw_contact_2 insert error = ' + error); + done(); + } + await updateContactData("owjiuh111", dataId, "contact_query_merge_list_test_1900"); + await AutoNotMerger(DAHelper, rawContactId1, "contact_query_merge_list_test_1900"); + done(); + }); + + /** + * @tc.number contact_query_merge_list_test_2000 + * @tc.name Insert two automatically merged contacts, modify the phone number of A, and then + * merge the contacts manually to check whether the database can be merged + * the database can be merged + * @tc.desc Function test + */ + it("contact_query_merge_list_test_2000", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage contact_query_merge_list_test_2000 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "ollwjiuh"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_2000: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await insertContactDataSingle(DAHelper, rawContactId1, "ollwjiuh", "name"); + var dataIdTwo = await insertContactDataSingle(DAHelper, rawContactId1, "8554544", "phone"); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_2000: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "ollwjiuh"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_merge_list_test_2000: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + await insertContactDataSingle(DAHelper, rawContactId2, "ollwjiuh", "name"); + await insertContactDataSingle(DAHelper, rawContactId2, "8554544", "phone"); + sleep(sleep_two); + } catch (error) { + console.info('logMessage contact_query_merge_list_test_2000: raw_contact_2 insert error = ' + error); + done(); + } + await updateContactData("8554544444", dataIdTwo, "contact_query_merge_list_test_2000"); + sleep(sleep_three); + var rawContactIds = [ rawContactId1 + "", rawContactId2 + "" ]; + await ManualMergeList(DAHelper, rawContactIds, "contact_query_merge_list_test_2000"); + done(); + }); + + /** + * @tc.number abnormal_merge_Update_test_2100 + * @tc.name Insert two contacts with different names for automatic and manual merging operations + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2100", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2100 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2100mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2100: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2100mergeTest" ]; + var types = [ "name" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2100"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2100: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2100mergeTestTwo"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2100: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2100mergeTestTwo" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2100"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2100: raw_contact_2 insert error = ' + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + console.info("logMessage abnormal_merge_Update_test_2100 autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == -1).assertTrue(); + await ManualNotMerge(DAHelper, rawContactId1, rawContactId2, "abnormal_merge_Update_test_2100"); + done(); + }); + + /** + * @tc.number abnormal_merge_Update_test_2200 + * @tc.name Insert two contacts with same names for automatic and manual merging operations + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2200 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2200mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2200: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2200mergeTest", "45544" ]; + var types = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2200"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2200: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2200mergeTestTwo"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2200: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2200mergeTestTwo", "55134865" ]; + var types1 = [ "name", "phone" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2200"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2200: raw_contact_2 insert error = ' + error); + done(); + } + await queryMergeListError(DAHelper, rawContactId1, rawContactId2, "abnormal_merge_Update_test_2200"); + done(); + }); + + async function queryMergeListError(DAHelper, rawContactId1, rawContactId2, testName) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var columns = [ "display_names" ]; + var predicates = new ohos_data_ability.DataAbilityPredicates(); + try { + sleep(sleep_three); + var resultSet = await DAHelper.query(uriQueryMergeList, columns, predicates); + console.info(testName + 'resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 0).assertTrue(); + resultSet.close(); + await deleteAll(rawContactUri, testName); + await deleteAll(contactDataUri, testName); + } catch (error) { + console.info(testName + ": query error = " + error); + } + } + + /** + * @tc.number abnormal_merge_Update_test_2300 + * @tc.name Insert two contacts with different names, and then automatically merge them to + * see if the database can be merged + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2300", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2300 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2300mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2300: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2300mergeTest" ]; + var types = [ "name" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2300"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2300: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2300mergeTestName"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2300: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2300mergeTestName" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2300"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2300: raw_contact_2 insert error = ' + error); + done(); + } + await AutoNotMerger(DAHelper, rawContactId1, "abnormal_merge_Update_test_2300"); + done(); + }); + + /** + * @tc.number abnormal_merge_Update_test_2400 + * @tc.name Insert two contacts with different names, and then automatically merge them to + * see if the database can be merged + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2400", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2400 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2400mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2400: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2400mergeTest" ]; + var types = [ "namee" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2400"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2400: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2400mergeTest"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2400: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2400mergeTest" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2400"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2400: raw_contact_2 insert error = ' + error); + done(); + } + await AutoNotMerger(DAHelper, rawContactId1, "abnormal_merge_Update_test_2400"); + done(); + }); + + /** + * @tc.number abnormal_merge_Update_test_2500 + * @tc.name Pass 0 after merging to split + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2500", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2500 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2500mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2500mergeTest" ]; + var types = [ "name" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2500"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2500: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2500mergeTest"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2500: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2500mergeTest" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2500"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2500: raw_contact_2 insert error = ' + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2500 autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactNotSplit(DAHelper, 0, "abnormal_merge_Update_test_2500"); + await ContactMergeQuery(map, "abnormal_merge_Update_test_2500", result_two); + await deleteAll(rawContactUri, "abnormal_merge_Update_test_2500"); + await deleteAll(contactDataUri, "abnormal_merge_Update_test_2500"); + done(); + }); + + /** + * @tc.number abnormal_merge_Update_test_2600 + * @tc.name Pass -1 after merging to split + * @tc.desc Function test + */ + it("abnormal_merge_Update_test_2600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('before delete_all: start ! DAHelper = ' + DAHelper); + console.info("------logMessage abnormal_merge_Update_test_2600 is starting!-----"); + var insertRawContactValues1 = {"display_name" : "2600mergeTest"}; + try { + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2600: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var detailInfo = [ "2600mergeTest" ]; + var types = [ "name" ]; + await insertContactData(DAHelper, rawContactId1, detailInfo, types, "abnormal_merge_Update_test_2600"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2600: raw_contact_1 insert error = ' + error); + done(); + } + var insertRawContactValues2 = {"display_name" : "2600mergeTest"}; + try { + var rawContactId2 = await DAHelper.insert(rawContactUri, insertRawContactValues2); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2600: rawContactId2 = " + rawContactId2); + expect(rawContactId2 > 0).assertTrue(); + var detailInfo1 = [ "2600mergeTest" ]; + var types1 = [ "name" ]; + await insertContactData(DAHelper, rawContactId2, detailInfo1, types1, "abnormal_merge_Update_test_2600"); + } catch (error) { + console.info('logMessage abnormal_merge_Update_test_2600: raw_contact_2 insert error = ' + error); + done(); + } + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {}; + var autoMergeCode = await DAHelper.update(autoMergeUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage abnormal_merge_Update_test_2600 autoMergeCode = " + autoMergeCode); + expect(autoMergeCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId1.toString()); + await ContactNotSplit(DAHelper, -1, "abnormal_merge_Update_test_2600"); + await ContactMergeQuery(map, "abnormal_merge_Update_test_2600", result_two); + await deleteAll(rawContactUri, "abnormal_merge_Update_test_2600"); + await deleteAll(contactDataUri, "abnormal_merge_Update_test_2600"); + done(); + }); + + async function ContactNotSplit(DAHelper, rawContactId1, testName) + { + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + var array = [ rawContactId1.toString() ]; + condition2.in("raw_contact_id", array); + var updateValues2 = {}; + try { + var splitCode = await DAHelper.update(splitUri, updateValues2, condition2); + sleep(4000); + console.info(testName + 'logMessage splitCode = ' + splitCode); + expect(splitCode == -1).assertTrue(); + } catch (error) { + console.info(testName + 'logMessage split error = ' + error); + } + } + + afterAll(async function() { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('merge afterAll delete_All: start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + var deletedAll = await DAHelper.delete(deletedUri, condition); + sleep(4000); + console.info('merge afterAll delete_All : deletedAll ! DAHelper = ' + deletedAll); + }); +}); diff --git a/jstest/Contacts_test.js b/jstest/Contacts_test.js new file mode 100644 index 0000000..73a5282 --- /dev/null +++ b/jstest/Contacts_test.js @@ -0,0 +1,6141 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +import common from './common.js'; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const contactUri = "dataability:///com.ohos.contactsdataability/contacts/contact"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +const groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; +const contactBlocklistUri = "dataability:///com.ohos.contactsdataability/contacts/contact_blocklist"; +const deletedRawContactUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; +const searchContactUri = "dataability:///com.ohos.contactsdataability/contacts/search_contact"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; +const deleted_raw_contact_record = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact_record"; + +describe('ContactsTest', function() { + console.info("-------ContactsTest is starting!--------"); + + var sleep_two = 2000; + var sleep_one = 1000; + var array_two = 2; + var array_three = 3; + var array_four = 4; + + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + async function contactsQuery(map, tag, uri) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(uri, resultColumns, condition); + sleep(sleep_two); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ' :logMessage contactsQuery key = ' + key + ' dbresult :' + dbresult + + ' value : ' + value); + expect(value == dbresult).assertEqual(true); + } + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + async function queryBatch(map, tag, size) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryBatch start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", map.get("raw_contact_id")); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info(tag + ': queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage resultSet.rowCount: error = " + error); + } + } + + async function queryIdForDelete(map, tag, uri) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryIdForDelete start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(uri, resultColumns, condition); + sleep(sleep_one); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage queryIdForDelete: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage queryIdForDelete: error = " + error); + } + } + + async function deleteAll(uri, tag) + { + try { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(uri, condition); + console.info(tag + ': deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info(tag + ': deleteAll error = ' + error); + } + } + + async function deleteRawContact(tag) + { + try { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + var deleteCode = await DAHelper.delete(rawContactUri, condition); + console.info(tag + ': deleteRawContact deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + sleep(sleep_one); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + var code = await DAHelper.delete(deletedUri, conditionAll); + console.info(tag + ': Completely delete code = ' + code); + expect(code == 0).assertTrue(); + } catch (error) { + console.info(tag + ': deleteRawContact error = ' + error); + } + } + + async function insertData(rawContactId, type, value, position) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var contactDataValues1 = + {"raw_contact_id" : rawContactId, "content_type" : type, "detail_info" : value, "position" : position}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info("logMessage : contactDataId1 " + contactDataId1); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage : contact_data name insert error = " + error); + } + return contactDataId; + } + + /** + * @tc.number contact_insert_test_100 + * @tc.name Insert contact data + * @tc.desc Function test + */ + it("contact_insert_test_100", 0, async function(done) { + console.info("------logMessage contact_insert_test_100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contact_insert_test_100: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contact_insert_test_100", rawContactUri); + await deleteRawContact("contact_insert_test_100"); + done(); + } catch (error) { + console.info('logMessage contact_insert_test_100: insert error = ' + error); + done(); + } + }); + + var f = { add:function(){}, add:function(){}} + + /** + * @tc.number contact_insert_test_400 + * @tc.name Insert contact details (name, company, position, mobile phone number) + * @tc.desc Function test + */ + it("contact_insert_test_400", 0, async function(done) { + console.info("------logMessage contact_insert_test_400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insert_test_400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataNameInsert(DAHelper, rawContactId); + await dataCompanyInsert(DAHelper, rawContactId); + await dataPhoneInsert(DAHelper, rawContactId); + await deleteRawContact("contact_insert_test_400"); + await deleteAll(contactDataUri, "contact_insert_test_400"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_400: raw_contact insert error = " + error); + done(); + } + }); + + async function dataNameInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xiaocheng" + }; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info("logMessage contact_insert_test_400: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "xiaocheng"); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contact_insert_test_400", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_400: contact_data name insert error = " + error); + done(); + } + } + + async function dataCompanyInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "TT", + "position" : "developer" + }; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues2); + console.info("logMessage contact_insert_test_400: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "TT"); + map.set("position", "developer"); + contactsQuery(map, "contact_insert_test_400", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_400: contact_data company insert error = " + error); + done(); + } + } + + async function dataPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "12345678" + }; + try { + var contactDataId3 = await DAHelper.insert(contactDataUri, contactDataValues3); + sleep(sleep_one); + console.info("logMessage contact_insert_test_400: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "12345678"); + await contactsQuery(map, "contact_insert_test_400", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_400: contact_data phone insert error = " + error); + done(); + } + } + + /** + * @tc.number contact_insert_test_500 + * @tc.name Insert contact details (nickname, email, home) + * @tc.desc Function test + */ + it("contact_insert_test_500", 0, async function(done) { + console.info("------logMessage contact_insert_test_500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insert_test_500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataEmailInsert(DAHelper, rawContactId); + await dataNickNameInsert(DAHelper, rawContactId); + await dataPostalAddressInsert(DAHelper, rawContactId); + await deleteRawContact("contact_insert_test_500"); + await deleteAll(contactDataUri, "contact_insert_test_500"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_500: raw_contact insert error = " + error); + done(); + } + }); + + async function dataEmailInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "166@163.com" + }; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contact_insert_test_500: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "166@163.com"); + await contactsQuery(map, "contact_insert_test_500_1", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_500: contact_data email insert error = " + error); + } + } + + async function dataNickNameInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "xiaocheng" + }; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues2); + console.info("logMessage contact_insert_test_500: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "xiaocheng"); + await contactsQuery(map, "contact_insert_test_500_2", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_500: contact_data nickname insert error = " + error); + } + } + + async function dataPostalAddressInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "NanJingSoftRoad" + }; + try { + var contactDataId3 = await DAHelper.insert(contactDataUri, contactDataValues3); + console.info("logMessage contact_insert_test_500: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "NanJingSoftRoad"); + await contactsQuery(map, "contact_insert_test_500_3", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_500: contact_data postal_address insert error = " + error); + } + } + + /** + * @tc.number contact_insert_test_600 + * @tc.name Insert contact details (remarks, AIM, birthday) + * @tc.desc Function test + */ + it("contact_insert_test_600", 0, async function(done) { + console.info("------logMessage contact_insert_test_600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues) + console.info("logMessage contact_insert_test_600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataNoteInsert(DAHelper, rawContactId); + await dataAimInsert(DAHelper, rawContactId); + await dataEventInsert(DAHelper, rawContactId); + await deleteRawContact("contact_insert_test_600"); + await deleteAll(contactDataUri, "contact_insert_test_600"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_600: raw_contact insert error = " + error); + done(); + } + }); + + async function dataNoteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "note", + "detail_info" : "javaGangster" + }; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info("logMessage contact_insert_test_600: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "javaGangster"); + await contactsQuery(map, "contact_insert_test_600_1", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_600: contact_data note insert error = " + error); + done(); + } + } + + async function dataAimInsert(DAHelper, rawContactId) + { + var contactDataValues2 = {"raw_contact_id" : rawContactId, "content_type" : "im", "detail_info" : "aaaaa"}; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues2); + console.info("logMessage contact_insert_test_600: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "aaaaa"); + await contactsQuery(map, "contact_insert_test_600_2", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_600: contact_data aim insert error = " + error); + } + } + + async function dataEventInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_event", + "detail_info" : "19960229" + }; + try { + var contactDataId3 = await DAHelper.insert(contactDataUri, contactDataValues3); + console.info("logMessage contact_insert_test_600: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "19960229"); + await contactsQuery(map, "contact_insert_test_600_3", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_600: contact_data event insert error = " + error); + } + } + + /** + * @tc.number contact_insert_test_700 + * @tc.name Insert contact details (URL, assistant, group) + * @tc.desc Function test + */ + it("contact_insert_test_700", 0, async function(done) { + console.info("------logMessage contact_insert_test_700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insert_test_700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataWebsiteInsert(DAHelper, rawContactId); + await dataRelationInsert(DAHelper, rawContactId); + await dataWebsiteInsert(DAHelper, rawContactId); + await deleteRawContact("contact_insert_test_700"); + await deleteAll(contactDataUri, "contact_insert_test_700"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_700: raw_contact insert error = " + error); + done(); + } + }); + + async function dataWebsiteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "website", + "detail_info" : "www.com" + }; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contact_insert_test_700: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "www.com"); + await contactsQuery(map, "contact_insert_test_700_1", contactDataUri); + await ContactDataRelationInsert(); + } catch (error) { + console.info("logMessage contact_insert_test_700: contact_data website insert error = " + error); + } + } + + async function dataRelationInsert(DAHelper, rawContactId) + { + var contactDataValues2 = { + "raw_contact_id" : rawContactId, + "content_type" : "relation", + "detail_info" : "Secretary" + }; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues2); + sleep(sleep_one); + console.info("logMessage contact_insert_test_700: contactDataId2 " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId2.toString()); + map.set("detail_info", "Secretary"); + await contactsQuery(map, "contact_insert_test_700_2", contactDataUri); + await ContactDataGroupInsert(); + } catch (error) { + console.info("logMessage contact_insert_test_700: contact_data relation insert error = " + error); + } + } + + async function dataGroupInsert(DAHelper, rawContactId) + { + var contactDataValues3 = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : "1" + }; + try { + var contactDataId3 = await DAHelper.insert(contactDataUri, contactDataValues3); + sleep(sleep_one); + console.info("logMessage contact_insert_test_700: contactDataId3 " + contactDataId3); + expect(contactDataId3 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId3.toString()); + map.set("detail_info", "1"); + await contactsQuery(map, "contact_insert_test_700_3", contactDataUri); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_700: contact_data group insert error = " + error); + } + } + + /** + * @tc.number contact_insert_test_800 + * @tc.name Insert contact details (phone ringtone) + * @tc.desc Function test + */ + it("contact_insert_test_800", 0, async function(done) { + console.info("------logMessage contact_insert_test_800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocheng", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insert_test_800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await dataMiscInsert(DAHelper, rawContactId); + await deleteRawContact("contact_insert_test_800"); + await deleteAll(contactDataUri, "contact_insert_test_800"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_800: raw_contact insert error = " + error); + done(); + } + }); + + async function dataMiscInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_misc", + "detail_info" : "1234" + }; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info("logMessage contact_insert_test_800: contactDataId1 " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "1234"); + await contactsQuery(map, "contact_insert_test_800_1", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_800: contact_data misc insert error = " + error); + } + } + + /** + * @tc.number contact_update_test_900 + * @tc.name Update contact data + * @tc.desc Function test + */ + it("contact_update_test_900", 0, async function(done) { + console.info("------logMessage contact_update_test_900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "licheng", + "company" : "TT", + "position" : "developer", + "favorite" : 1, + "phonetic_name" : "licheng||lc" + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await rawContactUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_900"); + await deleteAll(contactDataUri, "contact_update_test_900"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_900: raw_contact insert error = " + error); + done(); + } + }); + + async function rawContactUpdate(DAHelper, rawContactId) + { + var updateValues = { + "display_name" : "dacheng", + "company" : "oo", + "position" : "Testers", + "favorite" : 0, + "phonetic_name" : "dacheng||dc" + }; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_900: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "dacheng"); + map.set("company", "oo"); + map.set("position", "Testers"); + map.set("favorite", "0"); + map.set("phonetic_name", "dacheng||dc"); + await contactsQuery(map, "contact_update_test_900", rawContactUri); + } catch (error) { + console.info('logMessage contact_update_test_900: raw_contact update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1200 + * @tc.name Update contact details (name) + * @tc.desc Function test + */ + it("contact_update_test_1200", 0, async function(done) { + console.info("------logMessage contact_update_test_1200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNameInsert(DAHelper, rawContactId); + await dataNameUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1200"); + await deleteAll(contactDataUri, "contact_update_test_1200"); + done(); + } catch (error) { + console.info('logMessage contact_update_test_1200: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataNameInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "xiaoyuan"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1200: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1200: contact_data insert error = ' + error); + } + } + + async function dataNameUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "dayuan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1200: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "dayuan"); + await contactsQuery(map, "contact_update_test_1200", rawContactUri); + } catch (error) { + console.info('logMessage contact_update_test_1200: contact_data update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1300 + * @tc.name Update contact details (company, position) + * @tc.desc Function test + */ + it("contact_update_test_1300", 0, async function(done) { + console.info("------logMessage contact_update_test_1300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataCompanyInsert(DAHelper, rawContactId); + await dataCompanyUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1300"); + await deleteAll(contactDataUri, "contact_update_test_1300"); + done(); + } catch (error) { + console.info('logMessage contact_update_test_1300: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataCompanyInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "TT", + "position" : "Testers", + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1300: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1300: contact_data insert error = ' + error); + } + } + + async function dataCompanyUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "OOOO", "position" : "developer"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1300: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("company", "OOOO"); + map.set("position", "developer"); + await contactsQuery(map, "contact_update_test_1300", rawContactUri); + } catch (error) { + console.info('logMessage contact_update_test_1300: contact_data update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1400 + * @tc.name Update contact details (mobile phone number) + * @tc.desc Function test + */ + it("contact_update_test_1400", 0, async function(done) { + console.info("------logMessage contact_update_test_1400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataPhoneInsert(DAHelper, rawContactId); + await dataPhoneUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1400"); + await deleteAll(contactDataUri, "contact_update_test_1400"); + done(); + } catch (error) { + console.info('logMessage contact_update_test_1400: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforeDataPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "phone", "detail_info" : "123456"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1400: contact_data insert error = ' + error); + } + } + + async function dataPhoneUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "99663355"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1400: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "99663355"); + await contactsQuery(map, "contact_update_test_1400", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1400: contact_data update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1500 + * @tc.name Update contact details (nickname) + * @tc.desc Function test + */ + it("contact_update_test_1500", 0, async function(done) { + console.info("------logMessage contact_update_test_1500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNickNameInsert(DAHelper, rawContactId); + await dataNickNameUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1500"); + await deleteAll(contactDataUri, "contact_update_test_1500"); + done(); + } catch (error) { + console.info('logMessage contact_update_test_1500: raw_contact insert error = ' + error); + done(); + } + }); + + async function beforedataNickNameInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "xiaoyuan" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1500: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1500: contact_data insert error = ' + error); + } + } + + async function dataNickNameUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "fengyuan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1500: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "fengyuan"); + await contactsQuery(map, "contact_update_test_1500", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1500: contact_data update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1600 + * @tc.name Update contact details (email) + * @tc.desc Function test + */ + it("contact_update_test_1600", 0, async function(done) { + console.info("------logMessage contact_update_test_1600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataEmailInsert(DAHelper, rawContactId); + await dataEmailUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1600"); + await deleteAll(contactDataUri, "contact_update_test_1600"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_1600: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataEmailInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "166@163.com" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1600: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1600: contact_data insert error = ' + error); + } + } + + async function dataEmailUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "199@163.com"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition) + sleep(sleep_one); + console.info('logMessage contact_update_test_1600: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "199@163.com"); + await contactsQuery(map, "contact_update_test_1600", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1600: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1700 + * @tc.name Update Contact Details (Residential) + * @tc.desc Function test + */ + it("contact_update_test_1700", 0, async function(done) { + console.info("------logMessage contact_update_test_1700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataPostalInsert(DAHelper, rawContactId); + await dataPostalUpdate(); + await deleteRawContact("contact_update_test_1700"); + await deleteAll(contactDataUri, "contact_update_test_1700"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_1700: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataPostalInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "NanJing" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1700: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_update_test_1700: contact_data insert error = " + error); + } + } + + async function dataPostalUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "BeiJing"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1700: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "BeiJing"); + await contactsQuery(map, "contact_update_test_1700", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1700: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1800 + * @tc.name Update contact details (remarks) + * @tc.desc Function test + */ + it("contact_update_test_1800", 0, async function(done) { + console.info("------logMessage contact_update_test_1800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_1800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforedataNoteInsert(DAHelper, rawContactId); + await dataNoteUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1800"); + await deleteAll(contactDataUri, "contact_update_test_1800"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_1800: raw_contact insert error = " + error); + done(); + } + }); + + async function beforedataNoteInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "note", "detail_info" : "Gangster"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1800: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_1800: contact_data insert error = ' + error); + } + } + + async function dataNoteUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "God"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1800: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "God"); + await contactsQuery(map, "contact_update_test_1800", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1800: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_1900 + * @tc.name Update Contact Details (AIM) + * @tc.desc Function test + */ + it("contact_update_test_1900", 0, async function(done) { + console.info("------logMessage contact_update_test_1900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues) + console.info("logMessage contact_update_test_1900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataAimInsert(DAHelper, rawContactId); + await dataAimUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_1900"); + await deleteAll(contactDataUri, "contact_update_test_1900"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_1900: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataAimInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "im", "detail_info" : "aaaaa"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_1900: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_update_test_1900: contact_data insert error = " + error); + } + } + + async function dataAimUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "bbbbb"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_1900: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "bbbbb"); + await contactsQuery(map, "contact_update_test_1900", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_1900: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_2000 + * @tc.name Update Contact Details (Birthday) + * @tc.desc Function test + */ + it("contact_update_test_2000", 0, async function(done) { + console.info("------logMessage contact_update_test_2000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_2000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataEventInsert(DAHelper, rawContactId); + await dataEventUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_2000"); + await deleteAll(contactDataUri, "contact_update_test_2000"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_2000: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataEventInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_event", + "detail_info" : "19960229" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contact_update_test_2000: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_2000: contact_data insert error = ' + error); + } + } + + async function dataEventUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "19971021"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_2000: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "19971021"); + await contactsQuery(map, "contact_update_test_2000", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_2000: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_2100 + * @tc.name Update contact details (website) + * @tc.desc Function test + */ + it("contact_update_test_2100", 0, async function(done) { + console.info("------logMessage contact_update_test_2100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_2100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataWebsiteInsert(DAHelper, rawContactId); + await dataWebsiteUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_2100"); + await deleteAll(contactDataUri, "contact_update_test_2100"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_2100: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataWebsiteInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "website", + "detail_info" : "www.com" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contact_update_test_2100: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_2100: contact_data insert error = ' + error); + } + } + + async function dataWebsiteUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "www.123.com"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_2100: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "www.123.com"); + await contactsQuery(map, "contact_update_test_2100", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_2100: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_2200 + * @tc.name Update contact details (assistant) + * @tc.desc Function test + */ + it("contact_update_test_2200", 0, async function(done) { + console.info("------logMessage contact_update_test_2200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_2200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataRelationInsert(DAHelper, rawContactId); + await dataRelationUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_2200"); + await deleteAll(contactDataUri, "contact_update_test_2200"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_2200: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataRelationInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "relation", + "detail_info" : "Secretary" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_update_test_2200: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_2200: contact_data insert error = ' + error); + } + } + + async function dataRelationUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "spouse"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_2200: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "spouse"); + await contactsQuery(map, "contact_update_test_2200", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_2200: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_2300 + * @tc.name Update contact detail data table (group) + * @tc.desc Function test + */ + it("contact_update_test_2300", 0, async function(done) { + console.info("------logMessage contact_update_test_2300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_update_test_2300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataGroupInsert(DAHelper, rawContactId); + await dataGroupUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_2300"); + await deleteAll(contactDataUri, "contact_update_test_2300"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_2300: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataGroupInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : "2" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_update_test_2300: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_2300: contact_data insert error = ' + error); + } + } + + async function dataGroupUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "7"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_2300: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "3"); + await contactsQuery(map, "contact_update_test_2300", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_2300: update error = ' + error); + } + } + + /** + * @tc.number contact_update_test_2400 + * @tc.name Update contact detail data table (phone ringtone) + * @tc.desc Function test + */ + it("contact_update_test_2400", 0, async function(done) { + console.info("------logMessage contact_update_test_2400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoyuan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contact_update_test_2400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await beforeDataMiscInsert(DAHelper, rawContactId); + await dataMiscUpdate(DAHelper, rawContactId); + await deleteRawContact("contact_update_test_2400"); + await deleteAll(contactDataUri, "contact_update_test_2400"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_2400: raw_contact insert error = " + error); + done(); + } + }); + + async function beforeDataMiscInsert(DAHelper, rawContactId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "contact_misc", + "detail_info" : "1234" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + sleep(sleep_one); + console.info('logMessage contact_update_test_2400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info('logMessage contact_update_test_2400: contact_data insert error = ' + error); + } + } + + async function dataMiscUpdate(DAHelper, rawContactId) + { + var updateValues = {"detail_info" : "999"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(sleep_one); + console.info('logMessage contact_update_test_2400: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "999"); + await contactsQuery(map, "contact_update_test_2400", contactDataUri); + } catch (error) { + console.info('logMessage contact_update_test_2400: update error = ' + error); + } + } + + /** + * @tc.number contact_favorite_test_2500 + * @tc.name Favorite contacts + * @tc.desc Function test + */ + it("contact_favorite_test_2500", 0, async function(done) { + console.info("-------logMessage contact_favorite_test_2500 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaocai", "company" : "TT", "position" : "Testers"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues) + console.info('logMessage contact_favorite_test_2500: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await updateFavorite(DAHelper, rawContactId); + await deleteRawContact("contact_favorite_test_2500"); + done(); + } catch (error) { + console.info('logMessage contact_favorite_test_2500: raw_contact insert error = ' + error); + done(); + } + }); + + async function updateFavorite(DAHelper, rawContactId) + { + var updateValues = {"favorite" : 1}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contact_favorite_test_2500: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaocai"); + map.set("company", "TT"); + map.set("position", "Testers"); + map.set("favorite", "1"); + await contactsQuery(map, "contact_favorite_test_2500", rawContactUri); + } catch (error) { + console.info('logMessage contact_favorite_test_2500: update error = ' + error); + } + } + + /** + * @tc.number contact_unfavorite_test_2600 + * @tc.name Unfavorite contacts + * @tc.desc Function test + */ + it("contact_unfavorite_test_2600", 0, async function(done) { + console.info("-------logMessage contact_unfavorite_test_2600 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaohong", "company" : "TT", "position" : "Testers", "favorite" : 1}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info('logMessage contact_unfavorite_test_2600: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await updateUnFavorite(DAHelper, rawContactId); + await deleteRawContact("contact_unfavorite_test_2600"); + done(); + } catch (error) { + console.info('logMessage contact_unfavorite_test_2600: raw_contact insert error = ' + error); + done(); + } + }); + + async function updateUnFavorite(DAHelper, rawContactId) + { + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contact_unfavorite_test_2600: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaohong"); + map.set("company", "TT"); + map.set("position", "Testers"); + map.set("favorite", "0"); + await contactsQuery(map, "contact_favorite_test_2500", rawContactUri); + } catch (error) { + console.info("logMessage contact_unfavorite_test_2600: update error = " + error); + } + } + + /** + * @tc.number contact_insert_test_2700 + * @tc.name Insert contact blacklist + * @tc.desc Function test + */ + it("contact_insert_test_2700", 0, async function(done) { + console.info("-------logMessage contact_insert_test_2700 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var blocklistId = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + sleep(sleep_one); + console.info('logMessage contact_insert_test_2700: blocklistId = ' + blocklistId); + expect(blocklistId > 0).assertTrue(); + var map = common.getProfileBlockListMap(); + map.set("id", blocklistId.toString()); + await contactsQuery(map, "contact_insert_test_2700", contactBlocklistUri); + await deleteAll(contactBlocklistUri, "contact_insert_test_2700"); + done(); + } catch (error) { + console.info('logMessage contact_insert_test_2700: blocklist insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_delete_test_2800 + * @tc.name Delete contact blacklist + * @tc.desc Function test + */ + it("contact_delete_test_2800", 0, async function(done) { + console.info("-------logMessage contact_delete_test_2800 is starting!------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var blocklistId = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + sleep(sleep_one); + console.info('logMessage contact_delete_test_2800: blocklistId = ' + blocklistId); + expect(blocklistId > 0).assertTrue(); + await BlocklistDelete(); + done(); + } catch (error) { + console.info('logMessage contact_delete_test_2800: blocklist insert error = ' + error); + done(); + } + + async function BlocklistDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", blocklistId.toString()); + try { + var deleteCode = await DAHelper.delete(contactBlocklistUri, condition); + sleep(sleep_one); + console.info("logMessage contact_delete_test_2800: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", blocklistId.toString()); + await queryIdForDelete(map, "contact_delete_test_2800", contactBlocklistUri); + } catch (error) { + console.info('logMessage contact_delete_test_2800: delete error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contact_insert_test_2900 + * @tc.name Insert contact group + * @tc.desc Function test + */ + it("contact_insert_test_2900", 0, async function(done) { + console.info("-------logMessage contact_insert_test_2900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var groupValues = {"group_name" : "TestersThird"}; + try { + var groupId = await DAHelper.insert(groupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contact_insert_test_2900: groupId =" + groupId); + expect(groupId > 0).assertTrue(); + await groupRawContactInsert(DAHelper); + await deleteRawContact("contact_insert_test_2900"); + await deleteAll(groupUri, "contact_insert_test_2900"); + await deleteAll(contactDataUri, "contact_insert_test_2900"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_2900: group insert error =" + error); + done(); + } + }); + + async function groupRawContactInsert(DAHelper) + { + var rawContactValues = {"display_name" : "liyu"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_insert_test_2900: rawContactId =" + rawContactId); + expect(rawContactId > 0).assertTrue(); + await groupDataInsert(DAHelper, rawContactId); + } catch (error) { + console.info("logMessage contact_insert_test_2900: raw_contact insert error =" + error); + } + } + + async function groupDataInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues) + sleep(sleep_one); + console.info("logMessage contact_insert_test_2900: contactDataId =" + contactDataId); + expect(contactDataId > 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId); + map.set("raw_contact_id", rawContactId.toString()); + map.set("detail_info", groupId.toString()); + await contactsQuery(map, "contact_insert_test_2900", contactDataUri); + } catch (error) { + console.info("logMessage contact_insert_test_2900: contact_data insert error =" + error); + } + } + + /** + * @tc.number contact_delete_test_3000 + * @tc.name Delete contact group + * @tc.desc Function test + */ + it("contact_delete_test_3000", 0, async function(done) { + console.info("-------logMessage contact_delete_test_3000 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var groupValues = {"group_name" : "TestersFourth"}; + try { + var groupId = await DAHelper.insert(groupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_3000: groupId =" + groupId); + expect(groupId > 0).assertTrue(); + await groupAfterRawContactInsert(DAHelper); + await deleteRawContact("contact_delete_test_3000"); + await deleteAll(groupUri, "contact_delete_test_3000"); + await deleteAll(contactDataUri, "contact_delete_test_3000"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_3000: group insert error =" + error); + done(); + } + }); + + async function groupAfterRawContactInsert(DAHelper) + { + var rawContactValues = {"display_name" : "liyuchen"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_3000: rawContactId =" + rawContactId); + expect(rawContactId > 0).assertTrue(); + await deleteGroupContactDataInsert(DAHelper, rawContactId); + } catch (error) { + console.info("logMessage contact_delete_test_3000: raw_contact insert error =" + error); + } + } + + async function deleteGroupContactDataInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info("logMessage contact_delete_test_3000: contactDataId =" + contactDataId); + expect(contactDataId > 0).assertTrue(); + await deleteGroup(DAHelper, contactDataId); + } catch (error) { + console.info("logMessage contact_delete_test_3000: contact_data insert error =" + error); + } + } + + async function deleteGroup(DAHelper, contactDataId) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactDataId.toString()); + try { + var deleteCode = await DAHelper.delete(contactDataUri, condition); + sleep(sleep_one); + console.info("logMessage contact_delete_test_3000: deleteCode =" + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + await queryIdForDelete(map, "contact_delete_test_3000", contactDataUri); + } catch (error) { + console.info("logMessage contact_delete_test_3000: delete error =" + error); + } + } + + /** + * @tc.number contact_query_test_3100 + * @tc.name Query basic information of a single contact + * @tc.desc Function test + */ + it("contact_query_test_3100", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactQuery(DAHelper, rawContactId); + await deleteRawContact("contact_query_test_3100"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3100: raw_contact insert error = " + error); + done(); + } + }); + + async function RawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_two); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId).assertEqual(true); + console.info('logMessage contact_query_test_3100: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyu").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_3100: query error = " + error); + } + } + + /** + * @tc.number contact_query_test_3200 + * @tc.name Query basic information of multiple contacts + * @tc.desc Function test + */ + it("contact_query_test_3200", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3200 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues1 = {"display_name" : "xiaoyu"}; + try { + var rawContactIdOne = await DAHelper.insert(rawContactUri, rawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_test_3200: rawContactId = " + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3200: raw_contact_1 insert error = " + error); + done(); + } + + var rawContactValues2 = {"display_name" : "xiaohong"}; + try { + var rawContactIdTwo = await DAHelper.insert(rawContactUri, rawContactValues2); + sleep(sleep_one); + console.info("logMessage contact_query_test_3200: rawContactId = " + rawContactIdTwo); + expect(rawContactIdTwo > 0).assertTrue(); + await queryTwoRaw(DAHelper, rawContactIdOne, rawContactIdTwo); + await deleteRawContact("contact_query_test_3200"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3200: raw_contact_2 insert error = " + error); + done(); + } + }); + + async function queryTwoRaw(DAHelper, rawContactIdOne, rawContactIdTwo) + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info('logMessage contact_query_test_3200: goToFirstRow' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow()).assertEqual(true); + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage contact_query_test_3200: columnNames :" + resultSet.columnNames); + console.info("logMessage contact_query_test_3200: columnCount:" + resultSet.columnCount); + console.info('logMessage contact_query_test_3200: id = ' + resultSet.getString(0)); + console.info('logMessage contact_query_test_3200: display_name = ' + resultSet.getString(1)); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_query_test_3200: query error' + error); + } + } + + /** + * @tc.number contact_query_test_3300 + * @tc.name Query basic information of all contacts + * @tc.desc Function test + */ + it("contact_query_test_3300", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3300 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues1 = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues1); + sleep(sleep_one); + console.info("logMessage contact_query_test_3300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3300: raw_contact_1 insert error = " + error); + done(); + } + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(profileRawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3300: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_query_test_3300: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyu").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + await deleteRawContact("contact_query_test_3300"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3300: query error = " + error); + done(); + } + }); + + /** + * @tc.number contact_query_test_3400 + * @tc.name Query all information of a single contact + * @tc.desc Function test + */ + it("contact_query_test_3400", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3400 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = { + "display_name" : "xiaoyuzhou", + "company" : "TT", + "position" : "Testers", + "favorite" : 1, + "phonetic_name" : "xiaoyu||xy" + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryAllInformation(DAHelper, rawContactId); + await deleteRawContact("contact_query_test_3400"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3400: raw_contact insert error = " + error); + done(); + } + }); + + async function queryAllInformation(DAHelper, rawContactId) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + var id = resultSet.getString(resultSet.getColumnIndex("id")); + console.info('logMessage contact_query_test_3400: id = ' + id); + expect(id == rawContactId).assertEqual(true); + var favorite = resultSet.getString(resultSet.getColumnIndex("favorite")); + console.info('logMessage contact_query_test_3400: favorite = ' + favorite); + expect(favorite == "1").assertEqual(true); + var phonetic_name = resultSet.getString(resultSet.getColumnIndex("phonetic_name")); + console.info('logMessage contact_query_test_3400: phonetic_name = ' + phonetic_name); + expect(phonetic_name == "xiaoyu||xy").assertEqual(true); + var company = resultSet.getString(resultSet.getColumnIndex("company")); + console.info('logMessage contact_query_test_3400: company = ' + company); + expect(company == "TT").assertEqual(true); + var display_name = resultSet.getString(resultSet.getColumnIndex("display_name")); + console.info('logMessage contact_query_test_3400: display_name = ' + display_name); + expect(display_name == "xiaoyuzhou").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_query_test_3400: query error = ' + error); + } + } + + /** + * @tc.number contact_query_test_3500 + * @tc.name Query group member ability + * @tc.desc Function test + */ + it("contact_query_test_3500", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3500: raw_contact insert error = " + error); + done(); + } + var groupValues = {"group_name" : "BossBoard3500"}; + try { + var groupId = await DAHelper.insert(groupUri, groupValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3500: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3500: group insert error = " + error); + done(); + } + await groupBossBoardInsert(DAHelper, rawContactId, groupId); + await deleteRawContact("contact_query_test_3500"); + await deleteAll(groupUri, "contact_query_test_3500"); + await deleteAll(contactDataUri, "contact_query_test_3500"); + done(); + }); + + async function groupBossBoardInsert(DAHelper, rawContactId, groupId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3500: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + await groupBossBoardQuery(DAHelper, rawContactId, groupId); + } catch (error) { + console.info("logMessage contact_query_test_3500: query error = " + error); + } + } + + async function groupBossBoardQuery(DAHelper, rawContactId, groupId) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 9 data is group + condition.equalTo("type_id", "9"); + condition.and(); + condition.equalTo("detail_info", groupId.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3500: raw_contact_id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId).assertEqual(true); + console.info('logMessage contact_query_test_3500: detail_info = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == groupId.toString()).assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_3500: query error :" + error); + } + } + + /** + * @tc.number contact_query_test_3600 + * @tc.name Query favorite contacts + * @tc.desc Function test + */ + it("contact_query_test_3600", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou", "favorite" : 1}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryFavorite(); + await deleteRawContact("contact_query_test_3600"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3600: raw_contact insert error = " + error); + done(); + } + + async function queryFavorite() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("favorite", "1"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3600: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_query_test_3600: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyuzhou").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_3600: query error :" + error); + done(); + } + } + }); + + /** + * @tc.number contact_query_test_3700 + * @tc.name Query recent contact ability + * @tc.desc Function test + */ + it("contact_query_test_3700", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3700 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaoyuzhou", "lastest_contacted_time" : 60}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryContacted(); + await deleteRawContact("contact_query_test_3700"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3700: raw_contact insert error = " + error); + done(); + } + + async function queryContacted() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.lessThan("lastest_contacted_time", "100"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3700: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_query_test_3700: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoyuzhou").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_query_test_3700: query error' + error); + done(); + } + } + }); + + /** + * @tc.number contact_query_test_3800 + * @tc.name Query recently deleted contacts + * @tc.desc Function test + */ + it("contact_query_test_3800", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3800 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaocai"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await rawContactDelete(DAHelper, rawContactId); + await deletedRawContactQuery(DAHelper, rawContactId); + await deleteAll(deletedUri, "contact_query_test_3800") + done(); + } catch (error) { + console.info("logMessage contact_query_test_3800: raw_contact insert error = " + error); + done(); + } + }); + + async function rawContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(rawContactUri, condition1); + sleep(sleep_one); + console.info('logMessage contact_query_test_3800: deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3800: raw_contact delete error = " + error); + done(); + } + } + + async function deletedRawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "display_name", "is_deleted" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info('logMessage contact_query_test_3800: id = ' + resultSet.getString(0)); + console.info('logMessage contact_query_test_3800: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_query_test_3800: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaocai").assertTrue(); + console.info('logMessage contact_query_test_3800: is_deleted = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == "1").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_3800: query error :" + error); + done(); + } + } + + /** + * @tc.number contact_query_test_3900 + * @tc.name Query all mobile phone numbers + * @tc.desc Function test + */ + it("contact_query_test_3900", 0, async function(done) { + console.info("-----------logMessage contact_query_test_3900 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaocai"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryPhoneInsert(); + await phoneQuery(rawContactId); + await deleteRawContact("contact_query_test_3900"); + await deleteAll(contactDataUri, "contact_query_test_3900"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_3900: raw_contact insert error = " + error); + done(); + } + }); + + async function queryPhoneInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "1853696321" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_3900: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_3900: contact_data insert error = " + error); + } + } + + async function phoneQuery(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 5 data is phone + condition.equalTo("content_type", "phone"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_3900: raw_contact_id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_query_test_3900: detail_info = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "1853696321").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_query_test_3900: query error' + error); + } + } + + /** + * @tc.number contact_query_test_4000 + * @tc.name Query all mailbox capabilities + * @tc.desc Function test + */ + it("contact_query_test_4000", 0, async function(done) { + console.info("-----------logMessage contact_query_test_4000 is starting!------------"); + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_4000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryEmailInsert(DAHelper, rawContactId); + await emailQuery(DAHelper, contactDataId, rawContactId); + await deleteRawContact("contact_query_test_4000"); + await deleteAll(contactDataUri, "contact_query_test_4000"); + done(); + } catch (error) { + console.info("logMessage contact_query_test_4000: raw_contact insert error = " + error); + done(); + } + }); + + async function queryEmailInsert(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "16658@163.com" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_4000: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_4000: contact_data insert error = " + error); + } + } + + async function emailQuery(DAHelper, contactDataId, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data content_type is email + condition.equalTo("type_id", "1").limitAs(array_three).orderByDesc("id"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_query_test_4000: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info('logMessage contact_query_test_4000: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_query_test_4000: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "16658@163.com").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_4000: query error :" + error); + } + } + + /** + * @tc.number contact_query_test_4100 + * @tc.name Query data information of a single contact + * @tc.desc Function test + */ + it("contact_query_test_4100", 0, async function(done) { + console.info("-----------logMessage contact_query_test_4100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoyu"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_4100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryTwoDataInsert(DAHelper, rawContactId); + await queryTwoDataInsertCompany(DAHelper, rawContactId); + await queryTwo(DAHelper, rawContactId); + await deleteRawContact("contact_query_test_4100"); + await deleteAll(contactDataUri, "contact_query_test_4100"); + del + done(); + } catch (error) { + console.info("logMessage contact_query_test_4100: raw_contact insert error = " + error); + done(); + } + }); + + async function queryTwoDataInsert(DAHelper, rawContactId) + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "xiaoyu"}; + try { + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_query_test_4100: contactDataId = " + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_4100: contact_data name insert error = " + error); + } + } + + async function queryTwoDataInsertCompany(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "OOOO", + "position" : "Testers" + }; + try { + var contactDataId2 = await DAHelper.insert(contactDataUri, contactDataValues); + console.info("logMessage contact_query_test_4100: contactDataId = " + contactDataId2); + expect(contactDataId2 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_query_test_4100: contact_data company insert error = " + error); + } + } + + async function queryTwo(DAHelper, rawContactId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info", "position" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + var array = [ {detail_info : "xiaoyu", position : ""}, {detail_info : "OOOO", position : "Testers"} ]; + var i = 0; + if (resultSet.goToFirstRow()) { + do { + console.info("logMessage contact_query_test_4100: columnNames :" + resultSet.columnNames); + console.info("logMessage contact_query_test_4100: columnCount:" + resultSet.columnCount); + console.info('logMessage contact_query_test_4100: id = ' + resultSet.getString(0)); + console.info('logMessage contact_query_test_4100: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_query_test_4100: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == array[i].detail_info).assertEqual(true); + console.info('logMessage contact_query_test_4100: position = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == array[i].position).assertEqual(true); + i++; + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_query_test_4100: query error :" + error); + } + } + + /** + * @tc.number contact_delete_test_4400 + * @tc.name Delete the basic raw data of the contact and record the deleted basic raw data + * @tc.desc Function test + */ + it("contact_delete_test_4400", 0, async function(done) { + console.info("-------logMessage contact_delete_test_4400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await deleteRaw(DAHelper, rawContactId); + await queryDelete(DAHelper, rawContactId); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_4400: raw_contact insert error :" + error); + done(); + } + }); + + async function deleteRaw(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(rawContactUri, condition1); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4400: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_delete_test_4400: delete error = " + error); + } + } + + async function queryDelete(DAHelper, rawContactId) + { + var resultColumns = [ "id", "delete_time", "display_name" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info("logMessage contact_delete_test_4400: columnNames:" + resultSet.columnNames); + console.info("logMessage contact_delete_test_4400: columnCount:" + resultSet.columnCount); + console.info('logMessage contact_delete_test_4400: id = ' + resultSet.getString(0)); + console.info('logMessage contact_delete_test_4400: delete_time = ' + resultSet.getString(1)); + console.info('logMessage contact_delete_test_4400: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaoming").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_delete_test_4400: query error:" + error); + } + } + + /** + * @tc.number contact_delete_test_4700 + * @tc.name Delete detailed contact data and record detailed data + * @tc.desc Function test + */ + it("contact_delete_test_4700", 0, async function(done) { + console.info("-------logMessage contact_delete_test_4700 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaozhang", "company" : "OOOO", "position" : "TestManager"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await queryDeleteCompanyData(DAHelper, rawContactId); + await rawContactDelete(DAHelper, rawContactId); + await companyRawContactDeleteQuery(DAHelper, rawContactId); + await deleteAll(contactDataUri, "contact_delete_test_4700"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_4700: raw_contact insert error:" + error); + done(); + } + }); + + async function queryDeleteCompanyData(DAHelper, rawContactId) + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "OOOO", + "position" : "TestManager" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4700: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_delete_test_4700: contact_data insert error:" + error); + } + } + + async function rawContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(rawContactUri, condition1); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4700: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_delete_test_4700: delete error = " + error); + done(); + } + } + + async function companyRawContactDeleteQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name", "backup_data" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedRawContactUri, resultColumns, condition2); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + console.info("logMessage contact_delete_test_4700: columnNames:" + resultSet.columnNames); + console.info("logMessage contact_delete_test_4700: columnCount:" + resultSet.columnCount); + console.info('logMessage contact_delete_test_4700: id = ' + resultSet.getString(0)); + console.info('logMessage contact_delete_test_4700: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaozhang").assertEqual(true); + console.info('logMessage contact_delete_test_4700: backup_data = ' + resultSet.getString(array_two)); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_delete_test_4700: query error:" + error); + } + } + + /** + * @tc.number contact_delete_test_4800 + * @tc.name Delete and record basic data of a single contact + * @tc.desc Function test + */ + it("contact_delete_test_4800", 0, async function(done) { + console.info("-------logMessage contact_delete_test_4800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = {"display_name" : "xiaopeng"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDelete(DAHelper, rawContactId); + await DeletedRawContactQuery(DAHelper, rawContactId) + await deleteAll(contactDataUri, "contact_delete_test_4800"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_4800: raw_contact insert error:" + error); + done(); + } + }); + + async function ContactDelete(DAHelper, rawContactId) + { + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("name_raw_contact_id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(contactUri, condition1); + sleep(sleep_one); + console.info("logMessage contact_delete_test_4800: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_delete_test_4800: delete error = " + error); + } + } + + async function DeletedRawContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "delete_time", "display_name" ]; + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(deletedRawContactUri, resultColumns, condition2); + sleep(sleep_one) + if (resultSet.goToFirstRow()) + { + console.info("logMessage contact_delete_test_4800: columnNames:" + resultSet.columnNames); + console.info("logMessage contact_delete_test_4800: columnCount:" + resultSet.columnCount); + console.info('logMessage contact_delete_test_4800: id = ' + resultSet.getString(0)); + console.info('logMessage contact_delete_test_4800: delete_time = ' + resultSet.getString(1)); + console.info('logMessage contact_delete_test_4800: display_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "xiaopeng").assertTrue(); + } + resultSet.close(); + } catch (error) { + console.info("logMessage contact_delete_test_4800: query error:" + error); + } + } + + /** + * @tc.number contact_batchinsert_test_4900 + * @tc.name Insert contacts in batches(raw_contact) + * @tc.desc Function test + */ + it("contact_batchinsert_test_4900", 0, async function(done) { + console.info("--------logMessage contact_batchinsert_test_4900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, common.getContactBatchCompany()); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_4900: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("company", "TT4900"); + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + console.info( + 'contact_batchinsert_test_4900 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 5).assertEqual(true); + resultSet.close(); + await deleteRawContact("contact_batchinsert_test_4900"); + done(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_4900: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_batchinsert_test_5000 + * @tc.name Insert contact_data in batches of address book + * @tc.desc Function test + */ + it("contact_batchinsert_test_5000", 0, async function(done) { + console.info("--------logMessage contact_batchinsert_test_5000 start!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var rawContactValues = {"display_name" : "xiaozhi"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_5000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataBatchInsert(); + done(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5000: raw_contact insert error = " + error); + done(); + } + async function ContactDataBatchInsert() + { + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, common.getContactBatchCompanyTwo()); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_5000: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + var map = new Map(); + map.set("raw_contact_id", raw_contact_id.toString()); + await queryBatch(map, "contact_batchinsert_test_5000", 5); + await deleteRawContact("contact_batchinsert_test_5000"); + done(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5000: batchInsert error = " + error); + done(); + } + } + }); + + /** + * @tc.number contact_batchinsert_test_5400 + * @tc.name Batch operation of contact blacklist + * @tc.desc Function test + */ + it("contact_batchinsert_test_5400", 0, async function(done) { + console.info("--------logMessage contact_batchinsert_test_5400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.batchInsert(contactBlocklistUri, common.getPhoneNumberBatch()); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_5400: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await query(5); + await BlocklistDelete(); + done(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5400: batchInsert error = " + error); + done(); + } + + async function BlocklistDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "85525040585400"); + try { + var deleteCode = await DAHelper.delete(contactBlocklistUri, condition); + console.info("logMessage contact_batchinsert_test_5400: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + await query(0); + done(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5400: delete error = " + error); + done(); + } + } + + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "85525040585400"); + try { + var resultSet = await DAHelper.query(contactBlocklistUri, resultColumns, condition); + sleep(sleep_one); + console.info( + 'contact_batchinsert_test_5400 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contact_batchinsert_test_5400 logMessage resultSet.rowCount: error = " + error); + } + } + }); + + /** + * @tc.number contact_update_test_5300 + * @tc.name Bulk favorites and unfavorites of contacts + * @tc.desc Function test + */ + it("contact_update_test_5300", 0, async function(done) { + console.info("--------logMessage contact_update_test_5300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValuesOne = {"display_name" : "fengyuan", "favorite" : 1}; + var rawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactValuesThree = {"display_name" : "xiaoma", "favorite" : 1}; + var listAddBluk = [] + listAddBluk[0] = rawContactValuesOne; + listAddBluk[1] = rawContactValuesTwo; + listAddBluk[array_two] = rawContactValuesThree; + try { + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_update_test_5300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await RawContactUpdateUnFavorites(DAHelper); + await queryUnFavorites(DAHelper); + await deleteRawContact("contact_update_test_5300"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_5300: batchInsert error = " + error); + done(); + } + }); + + async function RawContactUpdateUnFavorites(DAHelper) + { + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("display_name", "fengyuan"); + condition.or(); + condition.equalTo("display_name", "xiaoma"); + try { + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + sleep(sleep_one); + console.info("logMessage contact_update_test_5300: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_update_test_5300: update error = " + error); + } + } + + async function queryUnFavorites(DAHelper) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("display_name", "fengyuan"); + condition.or(); + condition.equalTo("display_name", "xiaoma"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(sleep_one); + console.info('contact_update_test_5300 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == array_two).assertEqual(true); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var dbresult = resultSet.getString(resultSet.getColumnIndex("favorite")); + console.info(' contact_update_test_5300 :logMessage contactsQuery dbresult :' + dbresult + + ' value : ' + value); + expect(dbresult == "0").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(" contact_update_test_5300 logMessage resultSet.rowCount: error = " + error); + } + } + + /** + * @tc.number contact_batchinsert_test_5500 + * @tc.name Contacts are added to and removed from groups in batches + * @tc.desc Function test + */ + it("contact_batchinsert_test_5500", 0, async function(done) { + console.info("--------logMessage contact_batchinsert_test_5500 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var groupValues = {"group_name" : "ManagerGroup"}; + try { + var groupId = await DAHelper.insert(groupUri, groupValues); + console.info("logMessage contact_batchinsert_test_5500: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: group insert error = " + error); + done(); + } + + try { + var rawContactValues1 = {"display_name" : "xiaohuang"}; + var rawContactIdOne = await DAHelper.insert(rawContactUri, rawContactValues1); + console.info("logMessage contact_batchinsert_test_5500: rawContactIdOne = " + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: raw_contact_1 insert error = " + error); + done(); + } + + try { + var rawContactValues2 = {"display_name" : "xiaolv"}; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, rawContactValues2); + console.info("logMessage contact_batchinsert_test_5500: rawContactIdTwo = " + rawContactIdTwo); + expect(rawContactIdTwo > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: raw_contact_2 insert error = " + error); + done(); + } + + try { + var rawContactValues3 = {"display_name" : "xiaobai"}; + var rawContactId3 = await DAHelper.insert(rawContactUri, rawContactValues3); + console.info("logMessage contact_batchinsert_test_5500: rawContactId3 = " + rawContactId3); + expect(rawContactId3 > 0).assertTrue(); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: raw_contact_3 insert error = " + error); + done(); + } + await threeDataInsert(DAHelper, rawContactIdOne, rawContactIdTwo, rawContactId3, groupId); + await deleteRawContact("contact_batchinsert_test_5500"); + await deleteAll(groupUri, "contact_batchinsert_test_5500"); + await deleteAll(contactDataUri, "contact_batchinsert_test_5500"); + done(); + }); + + async function threeDataInsert(DAHelper, rawContactIdOne, rawContactIdTwo, rawContactId3, groupId) + { + var contactDataValues1 = { + "raw_contact_id" : rawContactIdOne, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var contactDataValues2 = { + "raw_contact_id" : rawContactIdTwo, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var contactDataValues3 = { + "raw_contact_id" : rawContactId3, + "content_type" : "group_membership", + "detail_info" : groupId.toString() + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValues1; + listAddBluk[1] = contactDataValues2; + listAddBluk[array_two] = contactDataValues3; + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_5500: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await ContactDataDelete(DAHelper, rawContactIdOne, rawContactId3); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: batchInsert error = " + error); + } + } + + async function ContactDataDelete(DAHelper, rawContactIdOne, rawContactId3) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId3.toString()); + try { + var deleteCode = await DAHelper.delete(contactDataUri, condition); + sleep(sleep_one); + console.info("logMessage contact_batchinsert_test_5500: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + await queryTwoData(DAHelper, rawContactIdOne, rawContactId3); + } catch (error) { + console.info("logMessage contact_batchinsert_test_5500: delete error = " + error); + } + } + + async function queryTwoData(DAHelper, rawContactIdOne, rawContactId3) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId3.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + console.info( + 'contact_batchinsert_test_5500 : queryBatch start ! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 0).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contact_batchinsert_test_5500 logMessage resultSet.rowCount: error = " + error); + } + } + + /** + * @tc.number contact_pinyin_query_test_200 + * @tc.name Contact name to pinyin (Chinese Simplified) + * @tc.desc Function test + */ + it("contact_pinyin_query_test_200", 0, async function(done) { + console.info("--------logMessage contact_pinyin_query_test_200 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "小黄"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info('logMessage contact_pinyin_query_test_200 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contact_pinyin_query_test_200"); + await deleteAll(contactDataUri, "contact_pinyin_query_test_200"); + done(); + } catch (error) { + console.info("logMessage contact_pinyin_query_test_200: raw_contact insert error = " + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xiaohuang" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_pinyin_query_test_200 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchQuery(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_200 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(searchContactUri, resultColumns, condition); + var map = common.getSearchMap(); + map.set("raw_contact_id", rawContactId.toString()); + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ':contact_pinyin_query_test_200 key = ' + key + ' dbresult :' + dbresult + + ' value : ' + value); + expect(value == dbresult).assertEqual(true); + } + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_200 query error = ' + error); + } + } + + /** + * @tc.number contact_pinyin_query_test_100 + * @tc.name Contact name to pinyin (Chinese Traditional) + * @tc.desc Function test + */ + it("contact_pinyin_query_test_100", 0, async function(done) { + console.info("--------logMessage contact_pinyin_query_test_100 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "鍵盤"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_pinyin_query_test_100 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contact_pinyin_query_test_100"); + await deleteAll(contactDataUri, "contact_pinyin_query_test_100"); + done(); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_100 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "鍵盤"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_pinyin_query_test_100 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchContactQueryChinese(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_100 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchContactQueryChinese(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(searchContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_pinyin_query_test_100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_pinyin_query_test_100: search_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "鍵盤||jianpan||jp").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_100 query error = ' + error); + } + } + + /** + * @tc.number contact_pinyin_query_test_300 + * @tc.name Contact name to pinyin (English) + * @tc.desc Function test + */ + it("contact_pinyin_query_test_300", 0, async function(done) { + console.info("--------logMessage contact_pinyin_query_test_300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "Tom"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_pinyin_query_test_300 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataInsert(); + await deleteRawContact("contact_pinyin_query_test_300"); + done(); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_300 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "content_type" : "name", "detail_info" : "Tom"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_pinyin_query_test_300 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await SearchContactQuery(DAHelper, rawContactId); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_300 contact_data insert error = ' + error); + done(); + } + } + }); + + async function SearchContactQuery(DAHelper, rawContactId) + { + var resultColumns = [ "raw_contact_id", "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(searchContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_pinyin_query_test_300: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_pinyin_query_test_300: search_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "Tom||Tom||Tom").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_pinyin_query_test_300 query error = ' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_400 + * @tc.name Contact fuzzy search query interface (name) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_400", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "400xiaoming400"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_400 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactNameQuery(); + await deleteRawContact("contact_fuzzyquery_test_400"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_400 raw_contact insert error = ' + error); + done(); + } + + async function RawContactNameQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("display_name", "%xiaoming40%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_400: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info( + 'logMessage contact_fuzzyquery_test_400: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "400xiaoming400").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_400 query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contact_fuzzyquery_test_500 + * @tc.name Contact fuzzy search query interface (name pinyin, pinyin name) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_500", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_500 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var rawContactValues = {"display_name" : "500xiaoming500", "phonetic_name" : "500xiaoming500||xm"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_500 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactPhoneticNameQuery(); + await deleteRawContact("contact_fuzzyquery_test_500"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_500 raw_contact insert error = ' + error); + done(); + } + + async function RawContactPhoneticNameQuery() + { + var resultColumns = [ "id", "display_name", "phonetic_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("phonetic_name", "%xiaoming%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + condition.or(); + condition.like("phonetic_name", "%xm%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_500: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertTrue(); + console.info( + 'logMessage contact_fuzzyquery_test_500: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "500xiaoming500").assertTrue(); + console.info( + 'logMessage contact_fuzzyquery_test_500: phonetic_name = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "500xiaoming500||xm").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_500 query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contact_fuzzyquery_test_600 + * @tc.name Contact fuzzy search query interface (company, position) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_600", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_600 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming", "company" : "TT600", "position" : "Testers600"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_600 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await RawContactCompanyQuery(DAHelper, rawContactId); + await deleteRawContact("contact_fuzzyquery_test_600"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_600 raw_contact insert error = ' + error); + done(); + } + }); + + async function RawContactCompanyQuery(DAHelper, rawContactId) + { + var resultColumns = [ "id", "display_name", "company", "position" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("company", "%TT6%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + condition.or(); + condition.like("position", "%Testers6%"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_600: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_600: display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoming").assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_600: company = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "TT600").assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_600: position = ' + resultSet.getString(array_three)); + expect(resultSet.getString(array_three) == "Testers600").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_600 query error = ' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_700 + * @tc.name Contact fuzzy search query interface (mobile phone number) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_700", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_700 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_700 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataPhoneInsert(); + await deleteRawContact("contact_fuzzyquery_test_700"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_700"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_700 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataPhoneInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "14528963" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_700 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryPhone(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_700 contact_data insert error = ' + contactDataId); + done(); + } + } + }); + + async function fuzzyQueryPhone(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 5 data is phone + condition.like("detail_info", "%52896%"); + condition.and(); + condition.equalTo("type_id", "5"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_700: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_700: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_700: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "14528963").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_700 query error = ' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_800 + * @tc.name Contact fuzzy search query interface (nickname) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_800", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_800 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactNickNameInsert(); + await deleteRawContact("contact_fuzzyquery_test_800"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_800"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_800 raw_contact insert error = ' + error); + done(); + } + + async function ContactNickNameInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "daming" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_fuzzyquery_test_800 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryPhoneNickName(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_800 contact_data insert error = ' + contactDataId); + done(); + } + } + }); + + async function fuzzyQueryPhoneNickName(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 3 data is nickname + condition.like("detail_info", "%daming%"); + condition.and(); + condition.equalTo("type_id", "3"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_800: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_800: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_800: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "daming").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_800 query error = ' + error); + } + } + /** + * @tc.number contact_fuzzyquery_test_900 + * @tc.name Contact fuzzy search query interface (mailbox) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_900", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_900 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataEmailInsert(); + await deleteRawContact("contact_fuzzyquery_test_900"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_900"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_900 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataEmailInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "1564@163.com" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_fuzzyquery_test_900 ; = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryEmail(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_900 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryEmail(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data is email + condition.like("detail_info", "%1564%"); + condition.and(); + condition.equalTo("type_id", "1"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_900: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_900: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_900: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "1564@163.com").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_900 query error = ' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_1000 + * @tc.name Contact fuzzy search query interface (residential) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_1000", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_1000 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_1000 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataPostalInsert(); + await deleteRawContact("contact_fuzzyquery_test_1000"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_1000"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1000 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataPostalInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "postal_address", + "detail_info" : "nanjing1000" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_1000 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryAddress(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1000 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryAddress(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 1 data is postal_address + condition.like("detail_info", "%nanjing10%"); + condition.and(); + condition.equalTo("type_id", "7"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(sleep_one); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_1000: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_1000: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertTrue(); + console.info('logMessage contact_fuzzyquery_test_1000: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "nanjing1000").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1000: query error' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_1100 + * @tc.name Contact fuzzy search query interface (remarks) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_1100", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_1100 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_1100 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataNoteInsert(); + await deleteRawContact("contact_fuzzyquery_test_1100"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_1100"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1100 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataNoteInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "note", + "detail_info" : "java1100" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + sleep(sleep_one); + console.info('logMessage contact_fuzzyquery_test_1100 contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryNote(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1100 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryNote(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 10 data is note + condition.like("detail_info", "%java11%"); + condition.and(); + condition.equalTo("type_id", "10"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_1100: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_1100: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_1100: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "java1100").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1100: query error' + error); + } + } + + /** + * @tc.number contact_fuzzyquery_test_1200 + * @tc.name Contact fuzzy search query interface (AIM) + * @tc.desc Function test + */ + it("contact_fuzzyquery_test_1200", 0, async function(done) { + console.info("--------logMessage contact_fuzzyquery_test_1200 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoming"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info('logMessage contact_fuzzyquery_test_1200 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("contact_fuzzyquery_test_1200"); + await deleteAll(contactDataUri, "contact_fuzzyquery_test_1200"); + done(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1200 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "im", + "detail_info" : "aaaa1200" + }; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_fuzzyquery_test_1200 ; = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await fuzzyQueryIM(DAHelper, rawContactId, contactDataId); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1200 contact_data insert error = ' + error); + done(); + } + } + }); + + async function fuzzyQueryIM(DAHelper, rawContactId, contactDataId) + { + var resultColumns = [ "id", "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + // type_id = 10 data is im account number + condition.like("detail_info", "%aa12%"); + condition.and(); + condition.equalTo("type_id", "2"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('logMessage contact_fuzzyquery_test_1200: id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == contactDataId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_1200: raw_contact_id = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == rawContactId.toString()).assertEqual(true); + console.info('logMessage contact_fuzzyquery_test_1200: detail_info = ' + resultSet.getString(array_two)); + expect(resultSet.getString(array_two) == "aaaa1200").assertEqual(true); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info('logMessage contact_fuzzyquery_test_1200: query error' + error); + } + } + + /** + * @tc.number abnormal_contact_insert_test_200 + * @tc.name Abnormal use case, an incorrect field is passed in when inserting + * @tc.desc Function test + */ + it("abnormal_contact_insert_test_200", 0, async function(done) { + console.info("------------abnormal_contact_insert_test_200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_names" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_insert_test_200: rawContactId = " + rawContactId); + expect(rawContactId).assertEqual(-1); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_test_200: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_insert_test_300 + * @tc.name Abnormal use case, an incorrect table name is passed in when inserting + * @tc.desc Function test + */ + it("abnormal_contact_insert_test_300", 0, async function(done) { + console.info("------------abnormal_contact_insert_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(errorUri, rawContactValues); + console.info("logMessage abnormal_contact_insert_test_300: rawContactId = " + rawContactId); + expect(rawContactId == -1).assertTrue(); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_test_300: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_update_test_1100 + * @tc.name Abnormal use case, an incorrect field is passed in when updating + * @tc.desc Function test + */ + it("abnormal_contact_update_test_1100", 0, async function(done) { + console.info("------------abnormal_contact_update_test_1100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_update_test_1100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalUpdate(); + await deleteRawContact("abnormal_contact_update_test_1100"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_update_test_1100: raw_contact insert error' + error); + done(); + } + + async function AbnormalUpdate() + { + var updateValues = {"display_names" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var updataCode = await DAHelper.update(rawContactUri, updateValues, condition) + console.info("logMessage abnormal_contact_update_test_1100: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contact_update_test_1100", rawContactUri); + } catch (error) { + console.info('logMessage abnormal_contact_update_test_1100: update error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_update_test_1000 + * @tc.name Abnormal use case, an incorrect table name is passed in when updating + * @tc.desc Function test + */ + it("abnormal_contact_update_test_1000", 0, async function(done) { + console.info("------------abnormal_contact_update_test_1000 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_update_test_1000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalUpdate(); + await deleteRawContact("abnormal_contact_update_test_1000"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_update_test_1000: raw_contact insert error' + error); + done(); + } + + async function AbnormalUpdate() + { + var updateValues = {"display_name" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var updataCode = await DAHelper.update(errorUri, updateValues, condition); + console.info("logMessage abnormal_contact_update_test_1000: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contact_update_test_1000", rawContactUri); + } catch (error) { + console.info("logMessage abnormal_contact_update_test_1000: updata error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_delete_test_4500 + * @tc.name Abnormal use case, an incorrect field is passed in when deleting + * @tc.desc Function test + */ + it("abnormal_contact_delete_test_4500", 0, async function(done) { + console.info("------------abnormal_contact_delete_test_4500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaozhi"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_4500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalDelete(); + await deleteRawContact("abnormal_contact_delete_test_4500"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_4500: raw_contact insert error' + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(rawContactUri, condition); + console.info("logMessage abnormal_contact_delete_test_4500: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaozhi"); + await contactsQuery(map, "abnormal_contact_delete_test_4500", rawContactUri); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_4500: delete error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_delete_test_4600 + * @tc.name Abnormal use case, an incorrect table name is passed in when deleting + * @tc.desc Function test + */ + it("abnormal_contact_delete_test_4600", 0, async function(done) { + console.info("------------abnormal_contact_delete_test_4600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/contacts/raw_contacts"; + + var rawContactValues = {"display_name" : "xiaoshan"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_4600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalDelete(); + await deleteRawContact("abnormal_contact_delete_test_4600"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_4600: raw_contact insert error' + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info("logMessage abnormal_contact_delete_test_4600: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaoshan"); + await contactsQuery(map, "abnormal_contact_delete_test_4600", rawContactUri); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_4600: delete error' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_4200 + * @tc.name Abnormal use case, an incorrect field is passed in when querying + * @tc.desc Function test + */ + it("abnormal_contact_query_test_4200", 0, async function(done) { + console.info("------------abnormal_contact_query_test_4200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaozhicheng"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_4200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_4200"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_4200: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_4200: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_4200: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_batchinsert_test_5100 + * @tc.name Abnormal use cases, when adding data in batches, some of them failed, check the processing logic + * @tc.desc Function test + */ + it("abnormal_contact_batchinsert_test_5100", 0, async function(done) { + console.info("--------logMessage abnormal_contact_batchinsert_test_5100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var addBulk_value1 = {"display_name" : "zhangsan"}; + var addBulk_value2 = {"display_names" : "lisi"}; + var addBulk_value3 = {"display_name" : "wangwu"}; + var addBulk_value4 = {"display_names" : "laoliu"}; + var addBulk_value5 = {"display_name" : "xiaozhang"}; + var listAddBluk = []; + listAddBluk[0] = addBulk_value1; + listAddBluk[1] = addBulk_value2; + listAddBluk[array_two] = addBulk_value3; + listAddBluk[array_three] = addBulk_value4; + listAddBluk[array_four] = addBulk_value5; + try { + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + console.info("logMessage abnormal_contact_batchinsert_test_5100: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_contact_batchinsert_test_5100: batch insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_insert_data_5300 + * @tc.name insert_data error no rawContactId + * @tc.desc Function test + */ + it("abnormal_contact_insert_data_5300", 0, async function(done) { + console.info("--------logMessage abnormal_contact_insert_data_5300 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaotian"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage abnormal_contact_insert_data_5300 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("abnormal_contact_insert_data_5300"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_data_5300 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = {"content_type" : "im", "detail_info" : "aaaa"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage abnormal_contact_insert_data_5300 ; = ' + contactDataId); + expect(contactDataId == -1).assertTrue(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_data_5300 contact_data insert error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_insert_data_5400 + * @tc.name insert_data error no content_type + * @tc.desc Function test + */ + it("abnormal_contact_insert_data_5400", 0, async function(done) { + console.info("--------logMessage abnormal_contact_insert_data_5400 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "xiaotian"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info('logMessage abnormal_contact_insert_data_5400 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + await ContactDataAimInsert(); + await deleteRawContact("abnormal_contact_insert_data_5400"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_data_5400 raw_contact insert error = ' + error); + done(); + } + + async function ContactDataAimInsert() + { + var contactDataValues = {"raw_contact_id" : rawContactId, "detail_info" : "aaaa"}; + try { + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage abnormal_contact_insert_data_5400 ; = ' + contactDataId); + expect(contactDataId == -1).assertTrue(); + } catch (error) { + console.info('logMessage abnormal_contact_insert_data_5400 contact_data insert error = ' + error); + done(); + } + } + }); + + /** + * @tc.number contact_delete_test_5500 + * @tc.name batchDelete + * @tc.desc Function test + */ + it("contact_delete_test_5500", 0, async function(done) { + console.info("--------logMessage contact_delete_test_5500 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + console.info("logMessage contact_delete_test_5500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contact_delete_test_5500", rawContactUri); + await executeBatch(); + } catch (error) { + console.info("logMessage contact_delete_test_5500: insert error = " + error); + done(); + } + async function executeBatch() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + DAHelper.executeBatch(URI_CONTACTS, [ { + uri : rawContactUri, + type : featureAbility.DataAbilityOperationType.TYPE_DELETE, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage contact_delete_test_5500: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage contact_delete_test_5500: data_3 = " + data); + console.info("logMessage contact_delete_test_5500: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number contact_update_test_5600 + * @tc.name batchUpdate + * @tc.desc Function test + */ + it("contact_update_test_5600", 0, async function(done) { + console.info("--------logMessage contact_update_test_5600 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + console.info("logMessage contact_update_test_5600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contact_update_test_5600", rawContactUri); + await executeBatch(); + } catch (error) { + console.info("logMessage contact_update_test_5600: insert error = " + error); + done(); + } + + async function executeBatch() + { + var updateValues = {"display_name" : "xiaoxiaoxiao"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + DAHelper.executeBatch(URI_CONTACTS, [ { + uri : rawContactUri, + type : featureAbility.DataAbilityOperationType.TYPE_UPDATE, + valuesBucket : updateValues, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage contact_update_test_5600: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage contact_update_test_5600: data_3 = " + data); + console.info("logMessage contact_update_test_5600: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number contact_insert_test_5700 + * @tc.name Insert Multiple raw_contact essential information + * @tc.desc Function test + */ + it("contact_insert_test_5700", 0, async function(done) { + console.info("------logMessage contact_insert_test_5700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contact_insert_test_5700: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contact_insert_test_5700", rawContactUri); + var rawContactIdOne = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contact_insert_test_5700: rawContactIdOne = ' + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactIdOne.toString()); + await contactsQuery(map, "contact_insert_test_5700", rawContactUri); + var rawContactIdTwo = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contact_insert_test_5700: rawContactIdTwo = ' + rawContactIdTwo); + expect(rawContactIdTwo > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactIdTwo.toString()); + await contactsQuery(map, "contact_insert_test_5700", rawContactUri); + await deleteRawContact("contact_insert_test_5700"); + done(); + } catch (error) { + console.info('logMessage contact_insert_test_5700: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_insert_test_5800 + * @tc.name Add 20000 bytes of basic contact information and verify whether the text insertion is successful + * @tc.desc Function test + */ + it("contact_insert_test_5800", 0, async function(done) { + console.info("------logMessage contact_insert_test_5800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var name; + for (var i = 0; i < 20000; i++) { + name += "i"; + } + var contcatvalues = {"display_name" : name} + try { + var rawContactId = await DAHelper.insert(rawContactUri, contcatvalues); + sleep(sleep_one); + console.info('logMessage contact_insert_test_5800: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", name); + await contactsQuery(map, "contact_insert_test_5800", rawContactUri); + await deleteRawContact("contact_insert_test_5800"); + done(); + } catch (error) { + console.info('logMessage contact_insert_test_5800: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_insert_test_5900 + * @tc.name Add multiple contact details and verify that the insertion was successful + * @tc.desc Function test + */ + it("contact_insert_test_5900", 0, async function(done) { + console.info("------logMessage contact_insert_test_5900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var contcatvalues = {"display_name" : "xiao5900"} + try { + var rawContactId = await DAHelper.insert(rawContactUri, contcatvalues); + console.info('logMessage contact_insert_test_5900: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "19960229" + }; + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info('logMessage contact_insert_test_5900: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("detail_info", "19960229"); + await contactsQuery(map, "contact_insert_test_5900", contactDataUri); + + var rawContactIdOne = await DAHelper.insert(rawContactUri, contcatvalues); + console.info('logMessage contact_insert_test_5900: rawContactId = ' + rawContactIdOne); + expect(rawContactIdOne > 0).assertTrue(); + var contactDataValues2 = { + "raw_contact_id" : rawContactIdOne, + "content_type" : "phone", + "detail_info" : "111111032" + }; + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues2); + console.info('logMessage contact_insert_test_5900: contactDataId = ' + contactDataId1); + expect(contactDataId1 > 0).assertTrue(); + + var map = new Map(); + map.set("id", contactDataId1.toString()); + map.set("detail_info", "111111032"); + await contactsQuery(map, "contact_insert_test_5900", contactDataUri); + + await deleteRawContact("contact_insert_test_5900"); + await deleteAll(contactDataUri, "contact_insert_test_5900"); + done(); + } catch (error) { + console.info('logMessage contact_insert_test_5900: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_insert_test_6000 + * @tc.name Add the basic information of a single contact and verify whether the insertion is successful (name, + * Pinyin, company, position, favorite) + * @tc.desc Function test + */ + it("contact_insert_test_6000", 0, async function(done) { + console.info("------logMessage contact_insert_test_6000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "licheng", + "company" : "TT", + "position" : "developer", + "favorite" : 1, + "phonetic_name" : "licheng||lc" + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insert_test_6000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "licheng"); + map.set("company", "TT"); + map.set("position", "developer"); + map.set("favorite", "1"); + map.set("phonetic_name", "licheng||lc"); + await contactsQuery(map, "contact_insert_test_6000", rawContactUri); + await deleteRawContact("contact_insert_test_6000"); + await deleteAll(contactDataUri, "contact_insert_test_6000"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_6000: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertData_test_6100 + * @tc.name To contact_data Add a full field data to the data table and verify whether the insertion is + * successful + * @tc.desc Function test + */ + it("contact_insertData_test_6100", 0, async function(done) { + console.info("------logMessage contact_insertData_test_6100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertData_test_6100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + console.info('logMessage contact_insertData_test_6100: contactDataValues["raw_contact_id"] = ' + + contactDataValues.raw_contact_id); + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_insertData_test_6100: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + var map = common.getProfileContactDataMap(); + map.set("id", contactDataId.toString()); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contact_insertData_test_6100", contactDataUri); + await deleteRawContact("contact_insertData_test_6100"); + await deleteAll(contactDataUri, "contact_insertData_test_6100"); + done(); + } catch (error) { + console.info("logMessage contact_insertData_test_6100: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_update_test_6200 + * @tc.name Modify the basic information of multiple contacts and verify whether the modification is successful + * @tc.desc Function test + */ + it("contact_update_test_6200", 0, async function(done) { + console.info("--------logMessage contact_update_test_6200 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + expect(rawContactId > 0).assertTrue(); + console.info("logMessage contact_update_test_6200: rawContactId = " + rawContactId); + var insertRawContactValuesOne = { + "display_name" : "xiaocai1", + }; + var rawContactIdOne = await DAHelper.insert(rawContactUri, insertRawContactValuesOne); + expect(rawContactIdOne > 0).assertTrue(); + console.info("logMessage contact_update_test_6200: rawContactIdOne = " + rawContactIdOne); + var insertRawContactValuesTwo = { + "display_name" : "xiaocai1", + }; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, insertRawContactValuesTwo); + expect(rawContactIdTwo > 0).assertTrue(); + console.info("logMessage contact_update_test_6200: rawContactIdTwo = " + rawContactIdTwo); + + var updateValues = {"display_name" : "xiaosan"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + var updataCode = await DAHelper.update(rawContactUri, updateValues, condition); + console.info("logMessage contact_update_test_6200: updataCode = " + updataCode); + expect(updataCode == 0).assertTrue(); + sleep(sleep_one); + await queryUpdateThree( + "contact_update_test_6200", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo); + await deleteRawContact("contact_update_test_6200"); + done(); + } catch (error) { + console.info("logMessage contact_update_test_6200: insert error = " + error); + done(); + } + }); + + async function queryUpdateThree(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = [ "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var name = resultSet.getString(resultSet.getColumnIndex("display_name")); + expect(name == "xiaosan").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + /** + * @tc.number contact_UpdateRawContcat_test_6300 + * @tc.name Update raw_contact The full field data of the contact table and verify whether the modification is + * successful + * @tc.desc Function test + */ + it("contact_UpdateRawContcat_test_6300", 0, async function(done) { + console.info("------logMessage contact_UpdateRawContcat_test_6300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + console.info("logMessage contact_UpdateRawContcat_test_6300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + sleep(sleep_two); + var updateValues = common.getProfileRawContactUpdate(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var updataCode = await DAHelper.update(rawContactUri, updateValues, condition); + console.info('logMessage contact_UpdateRawContcat_test_6300: updataCode = ' + updataCode); + sleep(3000); + var map = common.getProfileRawContactUpdateMap(); + map.set("id", rawContactId.toString()); + await contactsQuery(map, "contact_UpdateRawContcat_test_6300", rawContactUri); + await deleteRawContact("contact_UpdateRawContcat_test_6300"); + await deleteAll(contactDataUri, "contact_UpdateRawContcat_test_6300"); + done(); + } catch (error) { + console.info("logMessage contact_UpdateRawContcat_test_6300: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertDataUpdate_test_6400 + * @tc.name Update contact_data table, and verify whether the modification is successful + * @tc.desc Function test + */ + it("contact_insertDataUpdate_test_6400", 0, async function(done) { + console.info("------logMessage contact_insertDataUpdate_test_6400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertDataUpdate_test_6400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + console.info('logMessage contact_insertDataUpdate_test_6400: contactDataValues.raw_contact_id = ' + + contactDataValues.raw_contact_id); + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_insertDataUpdate_test_6400: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + + var updateValues = common.getProfileContactDataUpdate(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactDataId.toString()); + var updataCode = await DAHelper.update(contactDataUri, updateValues, condition); + console.info('logMessage contact_insertDataUpdate_test_6400: updataCode = ' + updataCode); + sleep(sleep_one); + var map = common.getProfileContactDataUpdateMap(); + map.set("id", contactDataId.toString()); + map.set("raw_contact_id", rawContactId.toString()); + await contactsQuery(map, "contact_insertDataUpdate_test_6400", contactDataUri); + await deleteRawContact("contact_insertDataUpdate_test_6400"); + await deleteAll(contactDataUri, "contact_insertDataUpdate_test_6400"); + done(); + } catch (error) { + console.info("logMessage contact_insertDataUpdate_test_6400: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertDataUpdateAll_test_6500 + * @tc.name Update all contact details and verify that the modification was successful + * @tc.desc Function test + */ + it("contact_insertDataUpdateAll_test_6500", 0, async function(done) { + console.info("------logMessage contact_insertDataUpdateAll_test_6500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertDataUpdateAll_test_6500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await insertData(rawContactId, "name", "xiaocai", ""); + await insertData(rawContactId, "phone", "6500", ""); + await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await insertData(rawContactId, "nickname", "xxxxcai", ""); + await insertData(rawContactId, "email", "111@fox.com", ""); + await insertData(rawContactId, "postal_address", "dddd", ""); + await insertData(rawContactId, "note", "caicai", ""); + await insertData(rawContactId, "im", "999999999", ""); + await insertData(rawContactId, "contact_event", "1125", ""); + await insertData(rawContactId, "website", "wwww.xxx.com", ""); + await insertData(rawContactId, "relation", "xiaobai", ""); + await insertData(rawContactId, "group_membership", 1, ""); + await insertData(rawContactId, "contact_misc", "5678", ""); + var updateValues = {"detail_info" : "xiaocai"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + var updataCode = await DAHelper.update(contactDataUri, updateValues, condition); + console.info('logMessage contact_insertDataUpdateAll_test_6500: updataCode = ' + updataCode); + sleep(sleep_one); + await queryUpdateAllData("contact_insertDataUpdateAll_test_6500", DAHelper, rawContactId); + await deleteRawContact("contact_insertDataUpdateAll_test_6500"); + await deleteAll(contactDataUri, "contact_insertDataUpdateAll_test_6500"); + done(); + } catch (error) { + console.info("logMessage contact_insertDataUpdateAll_test_6500: raw_contact insert error = " + error); + done(); + } + }); + + async function queryUpdateAllData(tag, DAHelper, rawContactId) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': contactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("row_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var detail_info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + expect(detail_info == "xiaocai").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage contactsQuery: error = " + error); + } + } + + /** + * @tc.number contact_insertFavorite_test_6600 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Function test + */ + it("contact_insertFavorite_test_6600", 0, async function(done) { + console.info("------logMessage contact_insertFavorite_test_6600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = {"display_name" : "xiaocai", "favorite" : 1}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertFavorite_test_6600: rawContactId = " + rawContactId); + + var insertRawContactValuesOne = {"display_name" : "xiaotian", "favorite" : 1}; + var rawContactIdOne = await DAHelper.insert(rawContactUri, insertRawContactValuesOne); + console.info("logMessage contact_insertFavorite_test_6600: rawContactId = " + rawContactIdOne); + + var insertRawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, insertRawContactValuesTwo); + console.info("logMessage contact_insertFavorite_test_6600: rawContactId = " + rawContactIdTwo); + + sleep(sleep_one); + await queryThreeFavorite( + "contact_insertFavorite_test_6600", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 1); + await deleteRawContact("contact_insertFavorite_test_6600"); + done(); + } catch (error) { + console.info("logMessage contact_insertFavorite_test_6600: raw_contact insert error = " + error); + done(); + } + }); + + async function queryThreeFavorite(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, favoritevalue) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryThreeFavorite start ! DAHelper = ' + DAHelper); + var resultColumns = [ "favorite" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var favorite = resultSet.getInt(resultSet.getColumnIndex("favorite")); + expect(favorite == favoritevalue).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryThreeFavorite: error = " + error); + } + } + + /** + * @tc.number contact_unFavorite_test_6700 + * @tc.name Remove favorites from multiple contacts and verify that the favorites field has changed + * @tc.desc Function test + */ + it("contact_unFavorite_test_6700", 0, async function(done) { + console.info("------logMessage contact_unFavorite_test_6700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = {"display_name" : "xiaocai", "favorite" : 1}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_unFavorite_test_6700: rawContactId = " + rawContactId); + + var insertRawContactValuesOne = {"display_name" : "xiaotian", "favorite" : 1}; + var rawContactIdOne = await DAHelper.insert(rawContactUri, insertRawContactValuesOne); + console.info("logMessage contact_unFavorite_test_6700: rawContactId = " + rawContactIdOne); + + var insertRawContactValuesTwo = {"display_name" : "xiaoli", "favorite" : 1}; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, insertRawContactValuesTwo); + console.info("logMessage contact_unFavorite_test_6700: rawContactId = " + rawContactIdTwo); + + var updateValues = {"favorite" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + var updataCode = await DAHelper.update(rawContactUri, updateValues, condition); + console.info("logMessage contact_unFavorite_test_6700: updataCode = " + updataCode); + sleep(sleep_one); + await queryThreeFavorite( + "contact_unFavorite_test_6700", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 0); + await deleteRawContact("contact_unFavorite_test_6700"); + done(); + } catch (error) { + console.info("logMessage contact_unFavorite_test_6700: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertContactBlocklist_test_6800 + * @tc.name Add multiple records to the blacklist and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contact_insertContactBlocklist_test_6800", 0, async function(done) { + console.info("--------logMessage contact_insertContactBlocklist_test_6800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_insertContactBlocklist_test_6800: insert = " + batchInsertCode); + var batchInsertCodeOne = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_insertContactBlocklist_test_6800: insert = " + batchInsertCodeOne); + var batchInsertCodeTwo = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_insertContactBlocklist_test_6800: insert = " + batchInsertCodeTwo); + sleep(sleep_one); + expect(batchInsertCode > 0).assertTrue(); + await query(array_three); + await deleteAll(contactBlocklistUri, "contact_insertContactBlocklist_test_6800"); + done(); + } catch (error) { + console.info("logMessage contact_insertContactBlocklist_test_6800: insert error = " + error); + done(); + } + + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "123456789"); + try { + var resultSet = await DAHelper.query(contactBlocklistUri, resultColumns, condition); + sleep(sleep_one); + console.info('contact_insertContactBlocklist_test_6800 :resultSet.goToFirstRow() = ' + + resultSet.goToFirstRow()); + console.info( + 'contact_insertContactBlocklist_test_6800 : query result is = ' + resultSet.rowCount == size); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contact_insertContactBlocklist_test_6800 error = " + error); + } + } + }); + + /** + * @tc.number contact_removeContactBlocklist_test_6900 + * @tc.name Delete multiple records from the blacklist and verify whether the deletion is successful + * @tc.desc Function test + */ + it("contact_removeContactBlocklist_test_6900", 0, async function(done) { + console.info("--------logMessage contact_removeContactBlocklist_test_6900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var batchInsertCode = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_removeContactBlocklist_test_6900: batchInsertCode = " + batchInsertCode); + var batchInsertCodeOne = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_removeContactBlocklist_test_6900: insert = " + batchInsertCodeOne); + var batchInsertCodeTwo = await DAHelper.insert(contactBlocklistUri, common.getProfileBlockList()); + console.info("logMessage contact_removeContactBlocklist_test_6900: insert = " + batchInsertCodeTwo); + sleep(sleep_one); + expect(batchInsertCode > 0).assertTrue(); + await deleteAll(contactBlocklistUri, "contact_removeContactBlocklist_test_6900"); + await query(0); + done(); + } catch (error) { + console.info("logMessage contact_removeContactBlocklist_test_6900: batchInsert error = " + error); + done(); + } + async function query(size) + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", "123456789"); + try { + var resultSet = await DAHelper.query(contactBlocklistUri, resultColumns, condition); + console.info('contact_removeContactBlocklist_test_6900 : resultSet = ' + resultSet); + expect(resultSet.rowCount == size).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(" contact_removeContactBlocklist_test_6900 error = " + error); + } + } + }); + + /** + * @tc.number contact_insertGroup_test_7000 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Function test + */ + it("contact_insertGroup_test_7000", 0, async function(done) { + console.info("------logMessage contact_insertGroup_test_7000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertGroup_test_7000: rawContactId = " + rawContactId); + await insertData(rawContactId, "group_membership", 1, ""); + + var insertRawContactValuesOne = { + "display_name" : "xiaotian", + }; + var rawContactIdOne = await DAHelper.insert(rawContactUri, insertRawContactValuesOne); + console.info("logMessage contact_insertGroup_test_7000: rawContactId = " + rawContactIdOne); + await insertData(rawContactIdOne, "group_membership", 1, ""); + var insertRawContactValuesTwo = { + "display_name" : "xiaoli", + }; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, insertRawContactValuesTwo); + console.info("logMessage contact_insertGroup_test_7000: rawContactId = " + rawContactIdTwo); + await insertData(rawContactIdTwo, "group_membership", 1, ""); + sleep(sleep_one); + await queryThreeGroup( + "contact_insertGroup_test_7000", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, 1); + await deleteRawContact("contact_insertGroup_test_7000"); + done(); + } catch (error) { + console.info("logMessage contact_insertGroup_test_7000: raw_contact insert error = " + error); + done(); + } + }); + + async function queryThreeGroup(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo, groupId) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryThreeGroup start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var group = resultSet.getInt(resultSet.getColumnIndex("detail_info")); + expect(group == groupId).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryThreeGroup: error = " + error); + } + } + + /** + * @tc.number contact_insert_test_7100 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contact_insert_test_7100", 0, async function(done) { + console.info("---------logMessage contact_insert_test_7100 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage contact_insert_test_7100: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await contactsQuery(map, "contact_insert_test_7100", groupUri); + await deleteAll(groupUri, "contact_insert_test_7100"); + done(); + } catch (error) { + console.info("logMessage contact_insert_test_7100: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_delete_test_7200 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Function test + */ + it("contact_delete_test_7200", 0, async function(done) { + console.info("------logMessage contact_delete_test_7200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_delete_test_7200: rawContactId = " + rawContactId); + await insertData(rawContactId, "group_membership", 1, ""); + + var insertRawContactValuesOne = { + "display_name" : "xiaotian", + }; + var rawContactIdOne = await DAHelper.insert(rawContactUri, insertRawContactValuesOne); + console.info("logMessage contact_delete_test_7200: rawContactId = " + rawContactIdOne); + await insertData(rawContactIdOne, "group_membership", 1, ""); + var insertRawContactValuesTwo = { + "display_name" : "xiaoli", + }; + var rawContactIdTwo = await DAHelper.insert(rawContactUri, insertRawContactValuesTwo); + console.info("logMessage contact_delete_test_7200: rawContactId = " + rawContactIdTwo); + await insertData(rawContactIdTwo, "group_membership", 1, ""); + sleep(sleep_one); + await deleteAll(contactDataUri, "contact_delete_test_7200"); + sleep(sleep_one); + await queryZeroGroup("contact_delete_test_7200", DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo); + await deleteRawContact("contact_delete_test_7200"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_7200: raw_contact insert error = " + error); + done(); + } + }); + + async function queryZeroGroup(tag, DAHelper, rawContactId, rawContactIdOne, rawContactIdTwo) + { + + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryZeroGroup start ! DAHelper = ' + DAHelper); + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactIdOne.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactIdTwo.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + console.info(tag + ': queryZeroGroup! resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 0).assertEqual(true); + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage queryZeroGroup: error = " + error); + } + } + + /** + * @tc.number contact_delete_test_7300 + * @tc.name Delete the full field data of a groups table and verify whether the deletion is successful + * @tc.desc Function test + */ + it("contact_delete_test_7300", 0, async function(done) { + console.info("---------logMessage contact_delete_test_7300 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage contact_delete_test_7300: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await contactsQuery(map, "contact_delete_test_7300", groupUri); + await deleteAll(groupUri, "contact_delete_test_7300"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_7300: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_delete_test_7400 + * @tc.name Add a raw_contact all fields, delete raw_contact + * @tc.desc Function test + */ + it("contact_delete_test_7400", 0, async function(done) { + console.info("------logMessage contact_Delete_test_7400 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactId = await DAHelper.insert(rawContactUri, common.getProfileRawContact()); + sleep(sleep_one); + console.info('logMessage contact_Delete_test_7400: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var map = common.getProfileRawContactMap(); + map.set("id", rawContactId.toString()); + map.set("version", "2"); + map.set("is_deleted", "1"); + await deleteAll(rawContactUri, "contact_Delete_test_7400"); + sleep(sleep_one); + await contactsQuery(map, "contact_Delete_test_7400", rawContactUri); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + var code = await DAHelper.delete(deletedUri, conditionAll); + console.info('contact_Delete_test_7400 : Completely delete code = ' + code); + expect(code == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contact_Delete_test_7400: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_delete_test_7500 + * @tc.name Delete contact_data Single full field data in data table + * @tc.desc Function test + */ + it("contact_delete_test_7500", 0, async function(done) { + console.info("------logMessage contact_delete_test_7500 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_delete_test_7500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues = common.getProfileContactData(); + contactDataValues["raw_contact_id"] = rawContactId; + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues); + console.info('logMessage contact_delete_test_7500: contactDataId = ' + contactDataId); + expect(contactDataId > 0).assertTrue(); + await deleteAll(contactDataUri, "contact_delete_test_7500"); + var map = new Map(); + map.set("id", contactDataId.toString()); + await queryIdForDelete(map, "contact_delete_test_7500", contactDataUri); + await deleteRawContact("contact_delete_test_7500"); + done(); + } catch (error) { + console.info("logMessage contact_delete_test_7500: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertDataAll_test_7600 + * @tc.name Add all details of a single contact and verify whether the insertion is successful (name, mobile + * number, company, position, nickname, email, home, remarks, aim) + * @tc.desc Function test + */ + it("contact_insertDataAll_test_7600", 0, async function(done) { + console.info("------logMessage contact_insertDataAll_test_7600 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertDataAll_test_7600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactdata1 = await insertData(rawContactId, "name", "xiaocai", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdata1, "xiaocai"); + var contactdata2 = await insertData(rawContactId, "phone", "6500", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdata2, "6500"); + var contactdatd3 = await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd3, "TTTTT"); + var contactdatd4 = await insertData(rawContactId, "nickname", "xxxxcai", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd4, "xxxxcai"); + var contactdatd5 = await insertData(rawContactId, "email", "111@fox.com", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd5, "111@fox.com"); + var contactdatd6 = await insertData(rawContactId, "postal_address", "dddd", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd6, "dddd"); + var contactdatd7 = await insertData(rawContactId, "note", "caicai", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd7, "caicai"); + var contactdatd8 = await insertData(rawContactId, "im", "999999999", ""); + await queryAlldata("contact_insertDataAll_test_7600", DAHelper, rawContactId, contactdatd8, "999999999"); + sleep(sleep_one); + await deleteRawContact("contact_insertDataAll_test_7600"); + await deleteAll(contactDataUri, "contact_insertDataAll_test_7600"); + done(); + } catch (error) { + console.info("logMessage contact_insertDataAll_test_7600: raw_contact insert error = " + error); + done(); + } + }); + + async function queryAlldata(tag, DAHelper, rawContactId, contactdata, values) + { + var resultColumns = [ "raw_contact_id", "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", contactdata.toString()); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var id = resultSet.getString(resultSet.getColumnIndex("raw_contact_id")); + console.info(tag + " result raw_contact_id = " + id); + expect(id == rawContactId).assertEqual(true); + var info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + console.info(tag + " result info = " + info + " value = " + values); + expect(info == values).assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage queryIdForDelete: error = " + error); + } + } + + /** + * @tc.number contact_insertDataAll_test_7700 + * @tc.name Add all details of a single contact and verify whether the insertion is successful (name, mobile + * number, company, position, nickname, email, home, remarks, aim, birthday, website, assistant, group, phone ring) + * @tc.desc Function test + */ + it("contact_insertDataAll_test_7700", 0, async function(done) { + console.info("------logMessage contact_insertDataAll_test_7700 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertRawContactValues = { + "display_name" : "xiaocai", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertDataAll_test_7700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactdata1 = await insertData(rawContactId, "name", "xiaocai", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdata1, "xiaocai"); + var contactdata2 = await insertData(rawContactId, "phone", "6500", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdata2, "6500"); + var contactdatd3 = await insertData(rawContactId, "organization", "TTTTT", "Deve"); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd3, "TTTTT"); + var contactdatd4 = await insertData(rawContactId, "nickname", "xxxxcai", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd4, "xxxxcai"); + var contactdatd5 = await insertData(rawContactId, "email", "111@fox.com", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd5, "111@fox.com"); + var contactdatd6 = await insertData(rawContactId, "postal_address", "dddd", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd6, "dddd"); + var contactdatd7 = await insertData(rawContactId, "note", "caicai", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd7, "caicai"); + var contactdatd8 = await insertData(rawContactId, "im", "999999999", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd8, "999999999"); + var contactdatd9 = await insertData(rawContactId, "contact_event", "1125", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd9, "1125"); + var contactdatd10 = await insertData(rawContactId, "website", "wwww.xxx.com", ""); + await queryAlldata( + "contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd10, "wwww.xxx.com"); + var contactdatd11 = await insertData(rawContactId, "relation", "xiaobai", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd11, "xiaobai"); + var contactdatd12 = await insertData(rawContactId, "group_membership", 1, ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd12, 1); + var contactdatd13 = await insertData(rawContactId, "contact_misc", "5678", ""); + await queryAlldata("contact_insertDataAll_test_7700", DAHelper, rawContactId, contactdatd13, "5678"); + sleep(sleep_one); + await deleteRawContact("contact_insertDataAll_test_7700"); + await deleteAll(contactDataUri, "contact_insertDataAll_test_7700"); + done(); + } catch (error) { + console.info("logMessage contact_insertDataAll_test_7700: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number contact_insertDataUpdateMore_test_7800 + * @tc.name Modify multiple contact details and verify whether the modification is successful + * @tc.desc Function test + */ + it("contact_insertDataUpdateMore_test_7800", 0, async function(done) { + console.info("------logMessage contact_insertDataUpdateMore_test_7800 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xiaocai"}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_insertDataUpdateMore_test_7800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await insertData(rawContactId, "name", "xiaotian", ""); + + var insertRawContactValues1 = {"display_name" : "xiaotian"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, insertRawContactValues1); + console.info("logMessage contact_insertDataUpdateMore_test_7800: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await insertData(rawContactId, "name", "xiaotian", ""); + + var updateValues = {"detail_info" : "xiaocai7800"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId1.toString()) + var updataCode = await DAHelper.update(contactDataUri, updateValues, condition); + console.info('logMessage contact_insertDataUpdateMore_test_7800: updataCode = ' + updataCode); + sleep(sleep_one); + await insertDataUpdateMoreQuery( + "contact_insertDataUpdateMore_test_7800", DAHelper, rawContactId, rawContactId1); + await deleteRawContact("contact_insertDataUpdateMore_test_7800"); + await deleteAll(contactDataUri, "contact_insertDataUpdateMore_test_7800"); + done(); + } catch (error) { + console.info("logMessage contact_insertDataUpdateMore_test_7800: raw_contact insert error = " + error); + done(); + } + }); + + async function insertDataUpdateMoreQuery(tag, DAHelper, rawContactId, rawContactId1) + { + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + condition.or(); + condition.equalTo("raw_contact_id", rawContactId1.toString()) + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var info = resultSet.getString(resultSet.getColumnIndex("detail_info")); + console.info(tag + " result info = " + info); + expect(info == "xiaocai7800").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage : error = " + error); + } + } + + /** + * @tc.number contact_deleterestore_test_7900 + * @tc.name Delete contacts and restore + * @tc.desc Function test + */ + it("contact_deleterestore_test_7900", 0, async function(done) { + console.info("------logMessage contact_deleterestore_test_7900 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xaioli7900"}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage contact_deleterestore_test_7900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + sleep(sleep_one); + var condition1 = new ohos_data_ability.DataAbilityPredicates(); + condition1.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(rawContactUri, condition1); + console.info("contact_deleterestore_test_7900 " + + ': deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + sleep(sleep_one); + + var condition2 = new ohos_data_ability.DataAbilityPredicates(); + condition2.equalTo("id", rawContactId.toString()); + var updatevalue = {"is_deleted" : 0}; + var updateCode = await DAHelper.update(rawContactUri, updatevalue, condition2); + console.info('contact_deleterestore_test_7900 : update = ' + updateCode); + sleep(sleep_one); + + var condition3 = new ohos_data_ability.DataAbilityPredicates(); + condition3.equalTo("id", rawContactId.toString()); + var code = await DAHelper.delete(deleted_raw_contact_record, condition3); + console.info('contact_deleterestore_test_7900 : record code = ' + code); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("is_deleted", "0"); + await contactsQuery(map, "contact_deleterestore_test_7900", rawContactUri); + await deleteRawContact("contact_deleterestore_test_7900"); + done(); + } catch (error) { + console.info("logMessage contact_deleterestore_test_7900: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_updateData_test_8000 + * @tc.name When modifying contact_data table, incorrect field or table name or nonexistent value is passed in + * @tc.desc Function test + */ + it("abnormal_contact_updateData_test_8000", 0, async function(done) { + console.info("------logMessage abnormal_contact_updateData_test_8000 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xaioli8000"}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage abnormal_contact_updateData_test_8000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + sleep(sleep_one); + var contactDataId = await insertData(rawContactId, "name", "xaioli8000", ""); + console.info("logMessage abnormal_contact_updateData_test_8000: contactDataId = " + contactDataId); + expect(contactDataId > 0).assertTrue(); + + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {"display_namess" : "xaioli80000000"}; + condition.equalTo("id", contactDataId.toString()); + var code = await DAHelper.update(contactDataUri, updateValues, condition); + console.info('abnormal_contact_updateData_test_8000 : update code = ' + code); + expect(code == -1).assertTrue(); + var map = new Map(); + map.set("id", contactDataId.toString()); + map.set("display_name", "xaioli8000"); + await contactsQuery(map, "abnormal_contact_updateData_test_8000", contactDataUri); + await deleteRawContact("abnormal_contact_updateData_test_8000"); + await deleteAll(contactDataUri, "abnormal_contact_updateData_test_8000"); + done(); + } catch (error) { + console.info("logMessage abnormal_contact_updateData_test_8000: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_favorite_test_8100 + * @tc.name When collecting contacts, an incorrect field was passed in + * @tc.desc Function test + */ + it("abnormal_contact_favorite_test_8100", 0, async function(done) { + console.info("------logMessage abnormal_contact_favorite_test_8100 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xaioli8100", "favoriteeee" : 1}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage abnormal_contact_favorite_test_8100: rawContactId = " + rawContactId); + expect(rawContactId == -1).assertTrue(); + sleep(sleep_one); + done(); + } catch (error) { + console.info("logMessage abnormal_contact_favorite_test_8100: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_blocklist_test_8200 + * @tc.name When adding to the blocklist, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_blocklist_test_8200", 0, async function(done) { + console.info("------logMessage abnormal_contact_blocklist_test_8200 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertValues = { + "phone_numberss" : "9999999", + }; + var id = await DAHelper.insert(contactBlocklistUri, insertValues); + console.info("logMessage abnormal_contact_blocklist_test_8200: id = " + id); + expect(id == -1).assertTrue(); + sleep(sleep_one); + done(); + } catch (error) { + console.info("logMessage abnormal_contact_blocklist_test_8200: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_group_test_8300 + * @tc.name When joining a group, an incorrect field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_group_test_8300", 0, async function(done) { + console.info("------logMessage abnormal_contact_group_test_8300 is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var insertRawContactValues = {"display_name" : "xaioli8100"}; + var rawContactId = await DAHelper.insert(rawContactUri, insertRawContactValues); + console.info("logMessage abnormal_contact_group_test_8300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_typess" : "group_membership", + "detail_info" : 1 + }; + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info("abnormal_contact_group_test_8300 logMessage : contactDataId " + contactDataId); + expect(contactDataId == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_contact_group_test_8300: raw_contact insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_query_test_8400 + * @tc.name When querying the basic information of multiple contacts, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8400", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8400 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian8400"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var rawContactValues = {"display_name" : "xiaoli8400"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8400: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8400"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8400: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + condition.or(); + condition.equalTo("ids", rawContactId1.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8400: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8400: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_8500 + * @tc.name When querying the basic information of all contacts, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8500", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian8500"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var rawContactValues = {"display_name" : "xiaoli8500"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8500"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8500: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "display_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("ids", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8500: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8500: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_8600 + * @tc.name When querying all the information of a single contact, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8600", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian8600"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8600"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8600: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "display_names" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8600: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8600: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_8700 + * @tc.name An incorrect field was passed in when querying group members + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8700", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8700 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian8700"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "group_membership", 1, ""); + console.info("logMessage abnormal_contact_query_test_8700: dataId = " + dataId); + expect(dataId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8700"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8700: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "raw_contact_id" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("content_typess", "group_membership"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8700: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8700: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_8800 + * @tc.name An incorrect field was passed in when querying favorite contacts + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8800", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8800 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian8700", "favorite" : 1}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8800: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8800"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8800: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8800: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8800: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_8900 + * @tc.name An incorrect field was passed in when querying recent contacts + * @tc.desc Function test + */ + it("abnormal_contact_query_test_8900", 0, async function(done) { + console.info("------------abnormal_contact_query_test_8900 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaoyuzhou", "lastest_contacted_time" : 60}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_8900: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_8900"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8900: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("lastest_contacted_timess", "50"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_8900: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_8900: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_9000 + * @tc.name An error field was passed in when querying the recently deleted contact + * @tc.desc Function test + */ + it("abnormal_contact_query_test_9000", 0, async function(done) { + console.info("------------abnormal_contact_query_test_9000 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_9000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(rawContactUri, condition); + console.info('abnormal_contact_query_test_9000 : deleteRawContact deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + await AbnormalQuery(); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + var code = await DAHelper.delete(deletedUri, conditionAll); + console.info('abnormal_contact_query_test_9000 : Completely delete code = ' + code); + expect(code == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9000: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.orderByDesc("delete_timess"); + try { + var resultSet = await DAHelper.query(deletedRawContactUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_9000: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9000: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_9100 + * @tc.name When querying all mobile phone numbers, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_query_test_9100", 0, async function(done) { + console.info("------------abnormal_contact_query_test_9100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9100"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_9100: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "phone", "11159100", ""); + console.info("logMessage abnormal_contact_query_test_9100: dataId = " + dataId); + var dataId1 = await insertData(rawContactId, "phone", "111591009100", ""); + console.info("logMessage abnormal_contact_query_test_9100: dataId1 = " + dataId1); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_9100"); + await deleteAll(contactDataUri, "abnormal_contact_query_test_9100"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9100: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("content_typess", "phone"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_9100: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9100: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_9200 + * @tc.name When querying all mailboxes, an error field was passed in + * @tc.desc Function test + */ + it("abnormal_contact_query_test_9200", 0, async function(done) { + console.info("------------abnormal_contact_query_test_9200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9100"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_query_test_9200: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "email", "fox@1.com", ""); + console.info("logMessage abnormal_contact_query_test_9200: dataId = " + dataId); + var dataId1 = await insertData(rawContactId, "phone", "fox@2.com", ""); + console.info("logMessage abnormal_contact_query_test_9200: dataId1 = " + dataId1); + await AbnormalQuery(); + await deleteRawContact("abnormal_contact_query_test_9200"); + await deleteAll(contactDataUri, "abnormal_contact_query_test_9200"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9200: raw_contact insert error' + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "detail_info" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("content_typess", "email"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + expect(resultSet.goToFirstRow()).assertEqual(false); + console.info('logMessage abnormal_contact_query_test_9200: goToFirstRow' + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9200: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_delete_test_10000 + * @tc.name When querying all mailboxes, an error field was passed in + * @tc.desc Function test + */ + it("abnormal_contact_delete_test_10000", 0, async function(done) { + console.info("------------abnormal_contact_delete_test_10000 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9300"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_10000: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "email", "fox@1.com", ""); + console.info("logMessage abnormal_contact_delete_test_10000: dataId = " + dataId); + var dataId1 = await insertData(rawContactId, "phone", "fox@2.com", ""); + console.info("logMessage abnormal_contact_delete_test_10000: dataId1 = " + dataId1); + + var errorUri = "dataability:///com.ohos.contactsdataability/contacts/contact_datasss"; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", dataId.toString()); + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info(' abnormal_contact_delete_test_10000 : deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", dataId.toString()); + map.set("detail_info", "fox@1.com"); + await contactsQuery(map, "abnormal_contact_delete_test_10000", contactDataUri); + await deleteRawContact("abnormal_contact_delete_test_10000"); + await deleteAll(contactDataUri, "abnormal_contact_delete_test_10000"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_10000: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_delete_test_9300 + * @tc.name When deleting, an incorrect URI was passed in + * @tc.desc Function test + */ + it("abnormal_contact_delete_test_9300", 0, async function(done) { + console.info("------------abnormal_contact_delete_test_9300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9300"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_9300: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "email", "fox@1.com", ""); + console.info("logMessage abnormal_contact_delete_test_9300: dataId = " + dataId); + var dataId1 = await insertData(rawContactId, "phone", "fox@2.com", ""); + console.info("logMessage abnormal_contact_delete_test_9300: dataId1 = " + dataId1); + + var errorUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contactsss"; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info(' abnormal_contact_delete_test_9300 : deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = new Map(); + map.set("id", rawContactId.toString()); + map.set("display_name", "xiaotian9300"); + await contactsQuery(map, "abnormal_contact_delete_test_9300", rawContactUri); + await deleteRawContact("abnormal_contact_delete_test_9300"); + await deleteAll(contactDataUri, "abnormal_contact_delete_test_9300"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_9300: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_delete_test_9400 + * @tc.name When deleting contacts in batch, an error field is passed in + * @tc.desc Function test + */ + it("abnormal_contact_delete_test_9400", 0, async function(done) { + console.info("------------abnormal_contact_delete_test_9400 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9400"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_9400: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var rawContactValues = {"display_name" : "xiaoli9400"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_delete_test_9400: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", rawContactId.toString()); + condition.or(); + condition.equalTo("ids", rawContactId1.toString()) + var deleteCode = await DAHelper.delete(rawContactUri, condition); + console.info('abnormal_contact_delete_test_9400 : deleteCode = ' + deleteCode); + expect(deleteCode == -1).assertTrue(); + await deleteRawContact("abnormal_contact_delete_test_9400"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_delete_test_9400: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_favorite_test_9500 + * @tc.name When collecting contacts in batch, the error field is transferred + * @tc.desc Function test + */ + it("abnormal_contact_favorite_test_9500", 0, async function(done) { + console.info("------------abnormal_contact_favorite_test_9500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9500", "favorite" : 0}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_favorite_test_9500: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var rawContactValues = {"display_name" : "xiaoli9500", "favorite" : 0}; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_favorite_test_9500: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + + var condition = new ohos_data_ability.DataAbilityPredicates(); + var updateValues = {"favorites" : 1}; + condition.equalTo("id", rawContactId.toString()); + condition.or(); + condition.equalTo("id", rawContactId1.toString()) + var code = await DAHelper.update(rawContactUri, updateValues, condition); + console.info(' abnormal_contact_favorite_test_9500 : update code = ' + code); + expect(code == -1).assertTrue(); + await deleteRawContact("abnormal_contact_favorite_test_9500"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_favorite_test_9500: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_insertblocklist_test_9600 + * @tc.name When collecting contacts in batch, the error field is transferred + * @tc.desc Function test + */ + it("abnormal_contact_insertblocklist_test_9600", 0, async function(done) { + console.info("------------abnormal_contact_insertblocklist_test_9600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = { + "display_name" : "xiaotian9600", + }; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_insertblocklist_test_9600: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "phone", "1234567899600", ""); + console.info("logMessage abnormal_contact_insertblocklist_test_9600: dataId = " + dataId); + var rawContactValues = { + "display_name" : "xiaoli9600", + }; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_insertblocklist_test_9600: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var dataId1 = await insertData(rawContactId1, "phone", "1234567899600", ""); + console.info("logMessage abnormal_contact_insertblocklist_test_9600: dataId1 = " + dataId1); + + var blacklist = {"phone_numbers" : "1234567899600"}; + var code = await DAHelper.insert(contactBlocklistUri, blacklist); + expect(code == -1).assertTrue(); + await deleteRawContact("abnormal_contact_insertblocklist_test_9600"); + await deleteAll(contactDataUri, "abnormal_contact_insertblocklist_test_9600"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insertblocklist_test_9600: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_insertGroup_test_9700 + * @tc.name When a contact joins a group in batch, an error field is passed + * @tc.desc Function test + */ + it("abnormal_contact_insertGroup_test_9700", 0, async function(done) { + console.info("------------abnormal_contact_insertGroup_test_9700 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var rawContactValues = {"display_name" : "xiaotian9700"}; + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_insertGroup_test_9700: rawContactId = " + rawContactId); + expect(rawContactId > 0).assertTrue(); + var contactDataValues1 = { + "raw_contact_id" : rawContactId, + "content_typess" : "group_membership", + "detail_info" : 1 + }; + var contactDataId = await DAHelper.insert(contactDataUri, contactDataValues1); + console.info("abnormal_contact_insertGroup_test_9700 logMessage : contactDataId " + contactDataId); + expect(contactDataId == -1).assertTrue(); + var rawContactValues = {"display_name" : "xiaoli9700"}; + var rawContactId1 = await DAHelper.insert(rawContactUri, rawContactValues); + console.info("logMessage abnormal_contact_insertGroup_test_9700: rawContactId1 = " + rawContactId1); + expect(rawContactId1 > 0).assertTrue(); + var contactDataValues2 = { + "raw_contact_id" : rawContactId1, + "content_typess" : "group_membership", + "detail_info" : 1 + }; + var contactDataId1 = await DAHelper.insert(contactDataUri, contactDataValues2); + console.info("abnormal_contact_insertGroup_test_9700 logMessage : contactDataId1 " + contactDataId1); + expect(contactDataId1 == -1).assertTrue(); + await deleteRawContact("abnormal_contact_insertGroup_test_9700"); + done(); + } catch (error) { + console.info('logMessage abnormal_contact_insertGroup_test_9700: raw_contact insert error' + error); + done(); + } + }); + + /** + * @tc.number abnormal_contact_pinyinquery_test_9800 + * @tc.name Insert a name with special characters to view the converted Pinyin + * @tc.desc Function test + */ + it("abnormal_contact_pinyinquery_test_9800", 0, async function(done) { + console.info("--------logMessage abnormal_contact_pinyinquery_test_9800 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "李bp玉成욱"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage abnormal_contact_pinyinquery_test_9800 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "name", "李bp玉成욱", ""); + console.info('logMessage abnormal_contact_pinyinquery_test_9800 dataId = ' + dataId); + expect(dataId > 0).assertTrue(); + await query(); + await deleteRawContact("abnormal_contact_pinyinquery_test_9800"); + await deleteAll(contactDataUri, "abnormal_contact_pinyinquery_test_9800") + done(); + } catch (error) { + console.info('logMessage abnormal_contact_pinyinquery_test_9800 raw_contact insert error = ' + error); + done(); + } + + async function query() + { + var resultColumns = [ "search_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("raw_contact_id", rawContactId.toString()); + try { + var resultSet = await DAHelper.query(searchContactUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var name = resultSet.getString(resultSet.getColumnIndex("search_name")); + console.info( + ' abnormal_contact_pinyinquery_test_9800 :logMessage contactsQuery name = ' + name); + expect(name == "李bp玉成욱||libpyucheng욱||lbpyc욱").assertEqual(true); + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_pinyinquery_test_9800 query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_contact_query_test_9900 + * @tc.name An incorrect field name was passed in during retrieval + * @tc.desc Function test + */ + it("abnormal_contact_query_test_9900", 0, async function(done) { + console.info("--------logMessage abnormal_contact_query_test_9900 is starting!-------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = {"display_name" : "键盘"}; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(sleep_one); + console.info('logMessage abnormal_contact_query_test_9900 rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + var dataId = await insertData(rawContactId, "name", "键盘", ""); + console.info('logMessage abnormal_contact_query_test_9900 dataId = ' + dataId); + expect(dataId > 0).assertTrue(); + await query(); + await deleteRawContact("abnormal_contact_query_test_9900"); + await deleteAll(contactDataUri, "abnormal_contact_query_test_9900") + done(); + } catch (error) { + console.info('logMessage abnormal_contact_query_test_9900 raw_contact insert error = ' + error); + done(); + } + + async function query() + { + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.like("search_namesss", "%jp%"); + try { + var resultSet = await DAHelper.query(searchContactUri, resultColumns, condition); + console.info( + ' abnormal_contact_query_test_9900 :resultSet.goToFirstRow() = ' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow() == false).assertTrue(); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_contact_pinyinquery_test_9800 query error = ' + error); + done(); + } + } + }); + + afterAll(async function() { + var tag = "Contacts_test_start_deleted"; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var DAHelperContact = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': start ! DAHelperContact = ' + DAHelperContact); + var deleteBlockList = await DAHelperContact.delete(contactBlocklistUri, condition); + console.info(tag + " : logMessage : deleteBlockList = " + deleteBlockList); + var deletedGroup = await DAHelperContact.delete(groupUri, condition); + console.info(tag + " : logMessage : deletedGroup = " + deletedGroup); + var dataDeletedCode = await DAHelperContact.delete(contactDataUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : dataDeletedCode = " + dataDeletedCode); + var rawContactDeleted = await DAHelperContact.delete(rawContactUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : rawContactDeleted = " + rawContactDeleted); + var deleted = await DAHelperContact.delete(deletedUri, condition); + sleep(sleep_two); + console.info(tag + " : logMessage : deleted = " + deleted); + }); +}); diff --git a/jstest/Groups_test.js b/jstest/Groups_test.js new file mode 100644 index 0000000..b438ced --- /dev/null +++ b/jstest/Groups_test.js @@ -0,0 +1,558 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; +import common from './common.js'; + +describe('GroupsTest', function() { + console.info('logMessage GroupsTest start! '); + + var array_two = 2; + + async function groupsQuery(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': groupsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ': logMessage groupsQuery key =' + key + 'dbresult :' + dbresult + + ' value : ' + value); + expect(value == dbresult).assertTrue(); + } + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + ': logMessage groupsQuery: error = ' + error); + } + } + + async function queryIdForDelete(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': queryIdForDelete start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage queryIdForDelete: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage queryIdForDelete: error = " + error); + } + } + + async function deleteAll(uri, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(uri, condition); + console.info(tag + ': deleteAll deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } + + /** + * @tc.number group_insert_test_100 + * @tc.name Insert group + * @tc.desc Function test + */ + it("group_insert_test_100", 0, async function(done) { + console.info("---------logMessage group_insert_test_100 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage group_insert_test_100: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await groupsQuery(map, "group_insert_test_100"); + await deleteAll(groupUri, "group_insert_test_100"); + done(); + } catch (error) { + console.info("logMessage group_insert_test_100: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number group_update_test_500 + * @tc.name Update group + * @tc.desc Function test + */ + it("group_update_test_500", 0, async function(done) { + console.info("---------logMessage group_update_test_500 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage group_update_test_500: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupUpdate(); + await deleteAll(groupUri, "group_update_test_500"); + done(); + } catch (error) { + console.info("logMessage group_update_test_500: group insert error = " + error); + done(); + } + + async function GroupUpdate() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", groupId.toString()); + try { + var updateCode = await DAHelper.update(groupUri, common.getProfileUpdateGroup(), condition); + console.info("logMessage group_update_test_500: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = common.getProfileUpdateGroupMap(); + map.set("id", groupId.toStirng()); + await groupsQuery(map, "group_update_test_500"); + } catch (error) { + console.info("logMessage group_update_test_500: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number group_delete_test_200 + * @tc.name Delete group + * @tc.desc Function test + */ + it("group_delete_test_200", 0, async function(done) { + console.info("---------logMessage group_delete_test_200 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage group_delete_test_200: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupDelete(); + done(); + } catch (error) { + console.info("logMessage group_delete_test_200: group insert error = " + error); + done(); + } + async function GroupDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", groupId.toString()); + try { + var deleteCode = await DAHelper.delete(groupUri, condition); + console.info("logMessage group_delete_test_200 : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", groupId.toString()); + await queryIdForDelete(map, "group_delete_test_200"); + } catch (error) { + console.info("logMessage group_delete_test_200 : delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number group_query_test_300 + * @tc.name Query a group + * @tc.desc Function test + */ + it("group_query_test_300", 0, async function(done) { + console.info("------------logMessage group_query_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage group_query_test_300: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + var map = common.getProfileGroupMap(); + map.set("id", groupId.toString()); + await groupsQuery(map, "logMessage group_query_test_300"); + await deleteAll(groupUri, "group_query_test_300"); + done(); + } catch (error) { + console.info("logMessage group_query_test_300: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number group_query_test_400 + * @tc.name Query all groups + * @tc.desc Function test + */ + it("group_query_test_400", 0, async function(done) { + console.info("------------logMessage group_query_test_400 is starting!-----------"); + console.info("---------logMessage getDbHelper start!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_CONTACTS); + var groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; + + var insertValues = {"group_name" : "ManagerSecondGroup"}; + try { + var groupId = await DAHelper.insert(groupUri, insertValues); + console.info("logMessage group_query_test_400: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupQuery(); + await deleteAll(groupUri, "group_query_test_400"); + done(); + } catch (error) { + console.info("logMessage group_query_test_400: group insert error = " + error); + done(); + } + + async function GroupQuery() + { + var resultColumns = [ "id", "group_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + console.info("logMessage group_query_test_400: resultSet.rowCount = " + resultSet.rowCount); + expect(resultSet.rowCount == 1).assertTrue(); + resultSet.close(); + } catch (error) { + console.info("group_query_test_400 resultSet query error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_group_insert_test_600 + * @tc.name abnormal insert + * @tc.desc Function test + */ + it("abnormal_group_insert_test_600", 0, async function(done) { + console.info("---------logMessage abnormal_group_insert_test_600 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + const errorUri = "dataability:///com.ohos.contactsdataability/contacts/groupssss"; + try { + var groupId = await DAHelper.insert(errorUri, common.getProfileGroup()); + console.info("logMessage abnormal_group_insert_test_600: groupId = " + groupId); + expect(groupId == -1).assertTrue(); + done(); + } catch (error) { + console.info("logMessage abnormal_group_insert_test_600: group insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_group_update_test_700 + * @tc.name abnormal update + * @tc.desc Function test + */ + it("abnormal_group_update_test_700", 0, async function(done) { + console.info("---------logMessage abnormal_group_update_test_700 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage abnormal_group_update_test_700: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupUpdate(); + await deleteAll(groupUri, "abnormal_group_update_test_700"); + done(); + } catch (error) { + console.info("logMessage abnormal_group_update_test_700: group insert error = " + error); + done(); + } + + async function GroupUpdate() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", groupId.toString()); + var updateValue = { "group_notesss" : "6666" } + try { + var updateCode = await DAHelper.update(groupUri, updateValue, condition); + console.info("logMessage abnormal_group_update_test_700: updateCode = " + updateCode); + expect(updateCode == -1).assertTrue(); + var map = common.getProfileUpdateGroupMap(); + map.set("id", groupId.toStirng()); + await groupsQuery(map, "abnormal_group_update_test_700"); + } catch (error) { + console.info("logMessage abnormal_group_update_test_700: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_group_delete_test_800 + * @tc.name abnormal delete + * @tc.desc Function test + */ + it("abnormal_group_delete_test_800", 0, async function(done) { + console.info("---------logMessage abnormal_group_delete_test_800 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var groupId = await DAHelper.insert(groupUri, common.getProfileGroup()); + console.info("logMessage abnormal_group_delete_test_800: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupDelete(); + await deleteAll(groupUri, "abnormal_group_delete_test_800"); + done(); + } catch (error) { + console.info("logMessage abnormal_group_delete_test_800: group insert error = " + error); + done(); + } + async function GroupDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("idss", groupId.toString()); + try { + var deleteCode = await DAHelper.delete(groupUri, condition); + console.info("logMessage abnormal_group_delete_test_800 : deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + var map = common.getProfileUpdateGroupMap(); + map.set("id", groupId.toStirng()); + await groupsQuery(map, "abnormal_group_delete_test_800"); + } catch (error) { + console.info("logMessage abnormal_group_delete_test_800 : delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_group_query_test_900 + * @tc.name abnormal query + * @tc.desc Function test + */ + it("abnormal_group_query_test_900", 0, async function(done) { + console.info("------------logMessage abnormal_group_query_test_900 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"group_name" : "PersonnelDepartment"}; + try { + var groupId = await DAHelper.insert(groupUri, insertValues); + console.info("logMessage abnormal_group_query_test_900: groupId = " + groupId); + expect(groupId > 0).assertTrue(); + await GroupQuery(DAHelper); + await deleteAll(groupUri, "abnormal_group_query_test_900"); + done(); + } catch (error) { + console.info("logMessage abnormal_group_query_test_900: group insert error = " + error); + done(); + } + + async function GroupQuery(DAHelper) + { + var resultColumns = [ "id", "group_namesss" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", groupId.toString()); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + console.info('abnormal_group_query_test_900 resultSet.goToFirstRow() = ' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow() == false).assertTrue(); + resultSet.close(); + } catch (error) { + console.info('abnormal_group_query_test_900 query error ' + error); + done(); + } + } + }); + + /** + * @tc.number group_insert_test_1000 + * @tc.name Adding multiple groups + * @tc.desc Function test + */ + it("group_insert_test_1000", 0, async function(done) { + console.info("------------logMessage group_insert_test_1000 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"group_name" : "test1000"}; + var insertValuesTwo = {"group_name" : "test1000"}; + var insertValuesThree = {"group_name" : "test1000"}; + var array = [] + array[0] = insertValuesOne; + array[1] = insertValuesTwo; + array[array_two] = insertValuesThree; + try { + var code = await DAHelper.batchInsert(groupUri, array); + console.info("logMessage group_insert_test_1000: batchInsert code = " + code); + expect(code == 0).assertTrue(); + await GroupQuery(DAHelper); + await deleteAll(groupUri, "group_insert_test_1000"); + done(); + } catch (error) { + console.info("logMessage group_insert_test_1000: group insert error = " + error); + done(); + } + + async function GroupQuery(DAHelper) + { + var groupSize = 3; + var resultColumns = [ "id", "group_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("group_name", "test1000"); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + console.info('group_insert_test_1000 resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == groupSize).assertTrue(); + resultSet.close(); + } catch (error) { + console.info('group_insert_test_1000 query error ' + error); + done(); + } + } + }); + + /** + * @tc.number group_delete_test_1100 + * @tc.name delete multiple groups + * @tc.desc Function test + */ + it("group_delete_test_1100", 0, async function(done) { + console.info("------------logMessage group_delete_test_1100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"group_name" : "test1100"}; + var insertValuesTwo = {"group_name" : "test1100"}; + var insertValuesThree = {"group_name" : "test1100"}; + var array = [] + array[0] = insertValuesOne; + array[1] = insertValuesTwo; + array[array_two] = insertValuesThree; + try { + var code = await DAHelper.batchInsert(groupUri, array); + console.info("logMessage group_delete_test_1100: batchInsert code = " + code); + expect(code == 0).assertTrue(); + await deleteAll(groupUri, "group_delete_test_1100"); + await GroupQuery(DAHelper); + done(); + } catch (error) { + console.info("logMessage group_delete_test_1100: group insert error = " + error); + done(); + } + + async function GroupQuery(DAHelper) + { + var groupSize = 0; + var resultColumns = [ "id", "group_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("group_name", "test1100"); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + console.info('group_delete_test_1100 resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == groupSize).assertTrue(); + resultSet.close(); + } catch (error) { + console.info('group_delete_test_1100 query error ' + error); + done(); + } + } + }); + + /** + * @tc.number group_update_test_1200 + * @tc.name update multiple groups + * @tc.desc Function test + */ + it("group_update_test_1200", 0, async function(done) { + console.info("------------logMessage group_update_test_1200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"group_name" : "test1200"}; + var insertValuesTwo = {"group_name" : "test1200"}; + var insertValuesThree = {"group_name" : "test1200"}; + var array = [] + array[0] = insertValuesOne; + array[1] = insertValuesTwo; + array[array_two] = insertValuesThree; + try { + var code = await DAHelper.batchInsert(groupUri, array); + console.info("logMessage group_update_test_1200: batchInsert code = " + code); + expect(code == 0).assertTrue(); + await GroupUpdateThree(DAHelper); + await GroupQuery(DAHelper); + await deleteAll(groupUri, "group_update_test_1200"); + done(); + } catch (error) { + console.info("logMessage group_update_test_1200: group insert error = " + error); + done(); + } + + async function GroupQuery(DAHelper) + { + var groupSize = 3; + var resultColumns = [ "id", "group_name" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("group_name", "test120000"); + try { + var resultSet = await DAHelper.query(groupUri, resultColumns, condition); + console.info("logMessage group_update_test_1200: resultSet.rowCount = " + resultSet.rowCount); + expect(resultSet.rowCount == groupSize).assertTrue(); + resultSet.close(); + } catch (error) { + console.info('group_update_test_1200 query error ' + error); + done(); + } + } + }); + + async function GroupUpdateThree(DAHelper) + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("group_name", "test1200"); + var updateValue = { "group_name" : "test120000" } + try { + var updateCode = await DAHelper.update(groupUri, updateValue, condition); + console.info("logMessage group_update_test_1200: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + } catch (error) { + console.info("logMessage group_update_test_1200: update error = " + error); + } + } + + afterAll(async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", "0"); + try { + var deleteCode = await DAHelper.delete(groupUri, condition); + console.info("logMessage group_deleted : deleteCode = " + deleteCode); + done(); + } catch (error) { + console.info("logMessage group_deleted: group insert error = " + error); + done(); + } + }); +}) \ No newline at end of file diff --git a/jstest/List.test.js b/jstest/List.test.js new file mode 100644 index 0000000..f142a90 --- /dev/null +++ b/jstest/List.test.js @@ -0,0 +1,11 @@ +//require('./ObjectInterface_test.js'); +//require('./ObjectCallback.js'); +//require('./Calllog_test.js'); +//require('./Voicemail_test.js'); +//require('./Groups_test.js'); +//require('./Contacts_test.js'); +//require('./ContactCard_test.js'); +require('./ContactMerge_test.js'); +require('./Performance_test.js'); +require('./Stability_test.js'); +require('./recovery_test.js'); diff --git a/jstest/ObjectCallback.js b/jstest/ObjectCallback.js new file mode 100644 index 0000000..dde8ac6 --- /dev/null +++ b/jstest/ObjectCallback.js @@ -0,0 +1,709 @@ +/* + * Copyright (c) 2021 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. + */ + +import contactsapi from "@ohos.contactsapi"; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' +import common from './common.js'; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +const groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + +describe('ObjectInterfaceTest', function() { + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + var contactData = { + id : 0, + key : "0", + contactAttributes : {attributes : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]}, + emails : [ {email : "email", labelName : "自定义邮箱", labelId : 1, displayName : "emailDisplayName"} ], + events : [ {eventDate : "event", labelName : "自定义event", labelId : 2} ], + groups : [ {groupId : 1, title : "群组"} ], + imAddresses : [ {imAddress : "imAddress", labelName : "自定义", labelId : 3} ], + phoneNumbers : [ {phoneNumber : "183", labelName : "自定义phoneNumbers", labelId : 4} ], + portrait : {uri : "content://head/0"}, + postalAddresses : [ { + city : "南京", + country : "中国", + labelName : "labelName", + neighborhood : "neighborhood", + pobox : "pobox", + postalAddress : "postalAddress", + postcode : "postcode", + region : "region", + street : "street", + labelId : 5 + } ], + relations : [ {relationName : "relationName", labelName : "自定义relationName", labelId : 6} ], + sipAddresses : [ {sipAddress : "sipAddress", labelName : "自定义sipAddress", labelId : 6} ], + websites : [ {website : "website"} ], + name : { + familyName : "familyName", + familyNamePhonetic : "familyNamePhonetic", + fullName : "小李", + givenName : "givenName", + givenNamePhonetic : "givenNamePhonetic", + middleName : "middleName", + middleNamePhonetic : "middleNamePhonetic", + namePrefix : "namePrefix", + nameSuffix : "nameSuffix" + }, + nickName : {nickName : "nickName"}, + note : {noteContent : "note"}, + organization : {name : "TT", title : "开发"} + }; + + var g_rawContactId; + var g_group; + + /** + * @tc.number contactsApi_insert_test_100 + * @tc.name Insert contact information + * @tc.desc Function test + */ + it("contactsApi_insert_test_100", 0, async function(done) { + contactsapi.addContact(contactData, (data) => { + console.info("contactsApi_insert_test_100 : data = " + data); + g_rawContactId = data; + expect(data > 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_delete_test_200 + * @tc.name Delete contact information + * @tc.desc Function test + */ + it("contactsApi_delete_test_200", 0, async function(done) { + var deleteId = g_rawContactId; + console.info("contactsApi_delete_test_200 : g_rawContactId = " + g_rawContactId); + contactsapi.deleteContact(1, (data) => { + var g_delete = data; + console.info("contactsApi_delete_test_200 : deleteCode = " + data); + expect(g_delete == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_update_test_300 + * @tc.name Update contact information + * @tc.desc Function test + */ + it("contactsApi_update_test_300", 0, async function(done) { + var rawContactId = await contactsapi.addContact(contactData); + console.info("contactsApi_insert_test_300 : rawContactId = " + rawContactId); + g_rawContactId = rawContactId; + expect(rawContactId > 0).assertTrue(); + + var updateValues = {id : g_rawContactId, name : {fullName : "小红"}}; + var condition = {attributes : [ 6 ]}; + contactsapi.updateContact(updateValues, condition, (data) => { + console.info("contactsApi_update_test_300 : updateCode = " + data); + expect(data == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_update_test_4100 + * @tc.name Update contact information + * @tc.desc Function test + */ + it("contactsApi_update_test_4100", 0, async function(done) { + var rawContactId = await contactsapi.addContact(contactData); + console.info("contactsApi_insert_test_300 : rawContactId = " + rawContactId); + g_rawContactId = rawContactId; + expect(rawContactId > 0).assertTrue(); + + var updateValues = {id : g_rawContactId, name : {fullName : "小红"}}; + contactsapi.updateContact(updateValues, (data) => { + console.info("contactsApi_update_test_4100 : updateCode = " + data); + expect(data == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contact_test_400 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_400", 0, async function(done) { + var queryId = g_rawContactId; + contactsapi.queryContact(queryId, (data) => { + console.info("contactsApi_query_contact_test_400 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contact_test_500 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_500", 0, async function(done) { + var queryId = g_rawContactId.toString(); + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + contactsapi.queryContact(queryId, holder, (data) => { + console.info("contactsApi_query_contact_test_500 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contact_test_600 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_600", 0, async function(done) { + var queryId = g_rawContactId.toString(); + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContact(queryId, holder, ContactAttributes, (data) => { + console.info("contactsApi_query_contact_test_600 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contact_test_4200 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_4200", 0, async function(done) { + var queryId = g_rawContactId.toString(); + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContact(queryId, ContactAttributes, (data) => { + console.info("contactsApi_query_contact_test_4200 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contacts_test_700 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_700", 0, async function(done) { + contactsapi.queryContacts((data) => { + console.info("contactsApi_query_contacts_test_700 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contacts_test_800 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_800", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + contactsapi.queryContacts(holder, (data) => { + console.info("contactsApi_query_contacts_test_800 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contacts_test_900 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_900", 0, async function(done) { + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContacts(ContactAttributes, (data) => { + console.info("contactsApi_query_contacts_test_900 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_contacts_test_1000 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_1000", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContacts(holder, ContactAttributes, (data) => { + console.info("contactsApi_query_contacts_test_1000 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_email_test_1100 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1100", 0, async function(done) { + var email = "email"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + + contactsapi.queryContactsByEmail(email, holder, (data) => { + console.info("contactsApi_query_email_test_1100 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_email_test_1200 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1200", 0, async function(done) { + var email = "email"; + contactsapi.queryContactsByEmail(email, (data) => { + console.info("contactsApi_query_email_test_1200 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_email_test_1300 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1300", 0, async function(done) { + var email = "email"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContactsByEmail(email, holder, ContactAttributes, (data) => { + console.info("contactsApi_query_email_test_1300 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_email_test_1400 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1400", 0, async function(done) { + var email = "email"; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContactsByEmail(email, ContactAttributes, (data) => { + console.info("contactsApi_query_email_test_1400 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1500 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1500", 0, async function(done) { + var phoneNumber = "183"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + + contactsapi.queryContactsByPhoneNumber(phoneNumber, holder, (data) => { + console.info("contactsApi_query_phoneNumber_test_1500 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1600 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1600", 0, async function(done) { + var phoneNumber = "183"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContactsByPhoneNumber(phoneNumber, holder, ContactAttributes, (data) => { + console.info("contactsApi_query_phoneNumber_test_1600 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1700 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1700", 0, async function(done) { + var phoneNumber = "183"; + + contactsapi.queryContactsByPhoneNumber(phoneNumber, (data) => { + console.info("contactsApi_query_phoneNumber_test_1700 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1800 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1800", 0, async function(done) { + var phoneNumber = "183"; + var ContactAttributes = {attributes : [ 1, 5, 6 ]}; + + contactsapi.queryContactsByPhoneNumber(phoneNumber, ContactAttributes, (data) => { + console.info("contactsApi_query_phoneNumber_test_1800 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_group_test_1900 + * @tc.name Query group + * @tc.desc Function test + */ + it("contactsApi_query_group_test_1900", 0, async function(done) { + contactsapi.queryGroups((data) => { + console.info("contactsApi_query_group_test_1900 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_group_test_2000 + * @tc.name Query group + * @tc.desc Function test + */ + it("contactsApi_query_group_test_2000", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + + contactsapi.queryGroups(holder, (data) => { + console.info("contactsApi_query_group_test_2000 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_holders_test_2200 + * @tc.name Query holders information + * @tc.desc Function test + */ + it("contactsApi_query_holders_test_2200", 0, async function(done) { + contactsapi.queryHolders((data) => { + console.info("contactsApi_query_holders_test_2200 : query resultSet = " + JSON.stringify(data)); + expect(data != null).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_key_test_2300 + * @tc.name Query key information + * @tc.desc Function test + */ + it("contactsApi_query_key_test_2300", 0, async function(done) { + var idtest = g_rawContactId; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + + contactsapi.queryKey(idtest, holder, (data) => { + console.info("contactsApi_query_key_test_2300 : query resultSet = " + JSON.stringify(data)); + expect(data.length != 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_key_test_2400 + * @tc.name Query key information + * @tc.desc Function test + */ + it("contactsApi_query_key_test_2400", 0, async function(done) { + var idtest = g_rawContactId; + console.info("contactsApi_query_key_test_2400 : query g_rawContactId = " + idtest); + + contactsapi.queryKey(idtest, (data) => { + console.info("contactsApi_query_key_test_2400 : query resultSet = " + JSON.stringify(data)); + expect(data.length != 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_mycard_test_2500 + * @tc.name Query mycard information + * @tc.desc Function test + */ + it("contactsApi_query_mycard_test_2500", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + + contactsapi.queryMyCard(holder, (data) => { + console.info("contactsApi_query_mycard_test_2500 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_query_mycard_test_4000 + * @tc.name Query mycard information + * @tc.desc Function test + */ + it("contactsApi_query_mycard_test_4000", 0, async function(done) { + contactsapi.queryMyCard((data) => { + console.info("contactsApi_query_mycard_test_4000 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_isMyCard_test_2600 + * @tc.name Query mycard exist + * @tc.desc Function test + */ + it("contactsApi_isMyCard_test_2600", 0, async function(done) { + var id = 1; + + contactsapi.isMyCard(id, (data) => { + console.info("contactsApi_isMyCard_test_2600 : query isExist = " + data); + expect(data == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number contactsApi_isLocalContact_test_2700 + * @tc.name Query isLocalContact exist + * @tc.desc Function test + */ + it("contactsApi_isLocalContact_test_2700", 0, async function(done) { + var id = g_rawContactId; + + contactsapi.isLocalContact(id, (data) => { + console.info("logMessage contactsApi_isLocalContact_test_2700 isExist = " + data); + expect(data == 1).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_insert_test_2800 + * @tc.name contactsApi_insert error + * @tc.desc Function test + */ + it("abnormal_contactsApi_insert_test_2800", 0, async function(done) { + var contactDataError = {}; + + contactsapi.addContact(contactDataError, (data) => { + console.info("abnormal_contactsApi_insert_test_2800 : rawContactId = " + data); + expect(data == -1).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_update_test_3000 + * @tc.name contactsApi_update error + * @tc.desc Function test + */ + it("abnormal_contactsApi_update_test_3000", 0, async function(done) { + var rawContactId = -1; + var updateValues = {id : rawContactId, name : {fullName : "小红"}}; + var condition = {attributes : [ 6 ]}; + + contactsapi.updateContact(updateValues, condition, (data) => { + console.info("abnormal_contactsApi_update_test_3000 : updateCode = " + data); + expect(data == -1).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_contact_test_3100 + * @tc.name contactsApi_query_contact error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_contact_test_3100", 0, async function(done) { + var queryId = "-1"; + + contactsapi.queryContact(queryId, (data) => { + if (data == null) { + console.info("abnormal_contactsApi_query_contact_test_3100 is null"); + } + if (data == undefined) { + console.info("abnormal_contactsApi_query_contact_test_3100 is undefined"); + } + console.info("abnormal_contactsApi_query_contact_test_3100 : updateCode = " + JSON.stringify(data)); + expect(data == undefined).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_contacts_test_3200 + * @tc.name contactsApi_query_contacts error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_contacts_test_3200", 0, async function(done) { + var ContactAttributes = {attributes : [ 100 ]}; + + contactsapi.queryContacts(ContactAttributes, (data) => { + if (data == null) { + console.info("abnormal_contactsApi_query_contacts_test_3200 is null"); + } + if (data == undefined) { + console.info("abnormal_contactsApi_query_contacts_test_3200 is undefined"); + } + console.info("abnormal_contactsApi_query_contacts_test_3200 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_email_test_3300 + * @tc.name contactsApi_query_email error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_email_test_3300", 0, async function(done) { + var email = "email2222"; + + contactsapi.queryContactsByEmail(email, (data) => { + console.info("abnormal_contactsApi_query_email_test_3300 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_phoneNumber_test_3400 + * @tc.name contactsApi_query_phoneNumber error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_phoneNumber_test_3400", 0, async function(done) { + var phoneNumber = "19999999"; + + contactsapi.queryContactsByPhoneNumber(phoneNumber, (data) => { + console.info( + "abnormal_contactsApi_query_phoneNumber_test_3400 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_group_test_3500 + * @tc.name contactsApi_query_group error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_group_test_3500", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts2", displayName : "phone2", holderId : 2}; + + contactsapi.queryGroups(holder, (data) => { + console.info("abnormal_contactsApi_query_group_test_3500 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_key_test_3600 + * @tc.name contactsApi_query_key error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_key_test_3600", 0, async function(done) { + var idtest = -1; + + contactsapi.queryKey(idtest, (data) => { + console.info("abnormal_contactsApi_query_key_test_3600 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_query_mycard_test_3700 + * @tc.name contactsApi_query_mycard error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_mycard_test_3700", 0, async function(done) { + var ContactAttributes = {attributes : [ 100 ]}; + + contactsapi.queryMyCard(ContactAttributes, (data) => { + console.info("abnormal_contactsApi_query_mycard_test_3700 : query resultSet = " + JSON.stringify(data)); + expect(data.length == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_isMyCard_test_3800 + * @tc.name isMyCard is not exist + * @tc.desc Function test + */ + it("abnormal_contactsApi_isMyCard_test_3800", 0, async function(done) { + var id = 999; + + contactsapi.isMyCard(id, (isExist) => { + console.info("abnormal_contactsApi_isMyCard_test_3800 : query isExist = " + isExist); + expect(isExist == 0).assertTrue(); + done(); + }); + }); + + /** + * @tc.number abnormal_contactsApi_isLocalContact_test_3900 + * @tc.name contactsApi_isLocalContact is not exist + * @tc.desc Function test + */ + it("abnormal_contactsApi_isLocalContact_test_3900", 0, async function(done) { + var id = 999; + + contactsapi.isLocalContact(id, (isExist) => { + console.info("abnormal_contactsApi_isLocalContact_test_3900 : query isExist = " + isExist); + expect(isExist == 0).assertTrue(); + done(); + }); + }); + +}); \ No newline at end of file diff --git a/jstest/ObjectInterface_test.js b/jstest/ObjectInterface_test.js new file mode 100644 index 0000000..c9c37a7 --- /dev/null +++ b/jstest/ObjectInterface_test.js @@ -0,0 +1,819 @@ +/* + * Copyright (c) 2021 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. + */ + +import contactsapi from "@ohos.contactsapi"; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' +import common from './common.js'; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const profileRawContactUri = "dataability:///com.ohos.contactsdataability/profile/raw_contact"; + +describe('ObjectInterfaceTest', function() { + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + var contactData = { + id : 0, + key : "0", + contactAttributes : {attributes : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]}, + emails : [ {email : "email", labelName : "自定义邮箱", labelId : 1, displayName : "emailDisplayName"} ], + events : [ {eventDate : "event", labelName : "自定义event", labelId : 2} ], + groups : [ {groupId : 1, title : "群组"} ], + imAddresses : [ {imAddress : "imAddress", labelName : "自定义", labelId : 3} ], + phoneNumbers : [ {phoneNumber : "183", labelName : "自定义phoneNumbers", labelId : 4} ], + portrait : {uri : "content://head/0"}, + postalAddresses : [ { + city : "南京", + country : "中国", + labelName : "labelName", + neighborhood : "neighborhood", + pobox : "pobox", + postalAddress : "postalAddress", + postcode : "postcode", + region : "region", + street : "street", + labelId : 5 + } ], + relations : [ {relationName : "relationName", labelName : "自定义relationName", labelId : 6} ], + sipAddresses : [ {sipAddress : "sipAddress", labelName : "自定义sipAddress", labelId : 6} ], + websites : [ {website : "website"} ], + name : { + familyName : "familyName", + familyNamePhonetic : "familyNamePhonetic", + fullName : "小李", + givenName : "givenName", + givenNamePhonetic : "givenNamePhonetic", + middleName : "middleName", + middleNamePhonetic : "middleNamePhonetic", + namePrefix : "namePrefix", + nameSuffix : "nameSuffix" + }, + nickName : {nickName : "nickName"}, + note : {noteContent : "note"}, + organization : {name : "TT", title : "开发"} + }; + + var g_rawContactId; + var g_group; + + /** + * @tc.number contactsApi_insert_test_100 + * @tc.name Insert contact information + * @tc.desc Function test + */ + it("contactsApi_insert_test_100", 0, async function(done) { + try { + var rawContactId = await contactsapi.addContact(contactData); + console.info("contactsApi_insert_test_100 : rawContactId = " + rawContactId); + g_rawContactId = rawContactId; + expect(g_rawContactId > 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_insert_test_100 : raw_contact insert error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_delete_test_200 + * @tc.name Delete contact information + * @tc.desc Function test + */ + it("contactsApi_delete_test_200", 0, async function(done) { + var deleteId = g_rawContactId; + try { + var deleteCode = await contactsapi.deleteContact(deleteId); + var g_delete = deleteCode; + console.info("contactsApi_delete_test_200 : deleteCode = " + deleteCode); + expect(g_delete == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_delete_test_200 : delete error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_update_test_300 + * @tc.name Update contact information + * @tc.desc Function test + */ + it("contactsApi_update_test_300", 0, async function(done) { + var rawContactId = await contactsapi.addContact(contactData); + console.info("contactsApi_insert_test_300 : rawContactId = " + rawContactId); + g_rawContactId = rawContactId; + expect(rawContactId > 0).assertTrue(); + + var updateValues = {id : g_rawContactId, name : {fullName : "小红"}}; + var condition = {attributes : [ 6 ]} + try { + var updateCode = await contactsapi.updateContact(updateValues, condition); + console.info("contactsApi_update_test_300 : updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_update_test_300 : update error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contact_test_400 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_400", 0, async function(done) { + var queryId = g_rawContactId; + try { + var resultSet = await contactsapi.queryContact(queryId); + console.info("contactsApi_query_contact_test_400 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contact_test_400 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contact_test_500 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_500", 0, async function(done) { + var queryId = g_rawContactId.toString(); + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryContact(queryId, holder); + console.info("contactsApi_query_contact_test_500 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contact_test_500 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contact_test_600 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contact_test_600", 0, async function(done) { + var queryId = g_rawContactId.toString(); + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContact(queryId, holder, ContactAttributes); + console.info("contactsApi_query_contact_test_600 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contact_test_600 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contacts_test_700 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_700", 0, async function(done) { + try { + var resultSet = await contactsapi.queryContacts(); + console.info("contactsApi_query_contacts_test_700 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contacts_test_700 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contacts_test_800 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_800", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryContacts(holder); + console.info("contactsApi_query_contacts_test_800 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contacts_test_800 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contacts_test_900 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_900", 0, async function(done) { + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContacts(ContactAttributes); + console.info("contactsApi_query_contacts_test_900 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contacts_test_900 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_contacts_test_1000 + * @tc.name Query contacts information + * @tc.desc Function test + */ + it("contactsApi_query_contacts_test_1000", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContacts(holder, ContactAttributes); + console.info("contactsApi_query_contacts_test_1000 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_contacts_test_1000 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_email_test_1100 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1100", 0, async function(done) { + var email = "email"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryContactsByEmail(email, holder); + console.info("contactsApi_query_email_test_1100 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_email_test_1100 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_email_test_1200 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1200", 0, async function(done) { + var email = "email"; + try { + var resultSet = await contactsapi.queryContactsByEmail(email); + console.info("contactsApi_query_email_test_1200 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_email_test_1200 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_email_test_1300 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1300", 0, async function(done) { + var email = "email"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContactsByEmail(email, holder, ContactAttributes); + console.info("contactsApi_query_email_test_1300 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_email_test_1300 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_email_test_1400 + * @tc.name Query email information + * @tc.desc Function test + */ + it("contactsApi_query_email_test_1400", 0, async function(done) { + var email = "email"; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContactsByEmail(email, ContactAttributes); + console.info("contactsApi_query_email_test_1400 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_email_test_1400 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1500 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1500", 0, async function(done) { + var phoneNumber = "183"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryContactsByPhoneNumber(phoneNumber, holder); + console.info("contactsApi_query_phoneNumber_test_1500 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_phoneNumber_test_1500 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1600 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1600", 0, async function(done) { + var phoneNumber = "183"; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1}; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContactsByPhoneNumber(phoneNumber, holder, ContactAttributes); + console.info("contactsApi_query_phoneNumber_test_1600 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_phoneNumber_test_1600 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1700 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1700", 0, async function(done) { + var phoneNumber = "183"; + try { + var resultSet = await contactsapi.queryContactsByPhoneNumber(phoneNumber); + console.info("contactsApi_query_phoneNumber_test_1700 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_phoneNumber_test_1700 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_phoneNumber_test_1800 + * @tc.name Query phoneNumber information + * @tc.desc Function test + */ + it("contactsApi_query_phoneNumber_test_1800", 0, async function(done) { + var phoneNumber = "183"; + var ContactAttributes = {attributes : [ 1, 5, 6 ]} + try { + var resultSet = await contactsapi.queryContactsByPhoneNumber(phoneNumber, ContactAttributes); + console.info("contactsApi_query_phoneNumber_test_1800 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_phoneNumber_test_1800 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_group_test_1900 + * @tc.name Query group + * @tc.desc Function test + */ + it("contactsApi_query_group_test_1900", 0, async function(done) { + try { + var resultSet = await contactsapi.queryGroups(); + console.info("contactsApi_query_group_test_1900 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_group_test_1900 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_group_test_2000 + * @tc.name Query group + * @tc.desc Function test + */ + it("contactsApi_query_group_test_2000", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryGroups(holder); + console.info("contactsApi_query_group_test_2000 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_group_test_2000 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_holders_test_2200 + * @tc.name Query holders information + * @tc.desc Function test + */ + it("contactsApi_query_holders_test_2200", 0, async function(done) { + try { + var resultSet = await contactsapi.queryHolders(); + console.info("contactsApi_query_holders_test_2200 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet != null).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_holders_test_2200 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_key_test_2300 + * @tc.name Query key information + * @tc.desc Function test + */ + it("contactsApi_query_key_test_2300", 0, async function(done) { + var idtest = g_rawContactId; + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryKey(idtest, holder); + console.info("contactsApi_query_key_test_2300 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length != 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_key_test_2300 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_key_test_2400 + * @tc.name Query key information + * @tc.desc Function test + */ + it("contactsApi_query_key_test_2400", 0, async function(done) { + var idtest = g_rawContactId; + console.info("contactsApi_query_key_test_2400 : query g_rawContactId = " + idtest); + try { + var resultSet = await contactsapi.queryKey(idtest); + console.info("contactsApi_query_key_test_2400 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length != 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_key_test_2400 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_query_mycard_test_2500 + * @tc.name Query mycard information + * @tc.desc Function test + */ + it("contactsApi_query_mycard_test_2500", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts", displayName : "phone", holderId : 1} + try { + var resultSet = await contactsapi.queryMyCard(holder); + console.info("contactsApi_query_mycard_test_2500 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_query_mycard_test_2500 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_isMyCard_test_2600 + * @tc.name Query mycard exist + * @tc.desc Function test + */ + it("contactsApi_isMyCard_test_2600", 0, async function(done) { + var id = 1; + try { + var isExist = await contactsapi.isMyCard(id); + console.info("contactsApi_isMyCard_test_2600 : query isExist = " + isExist); + expect(isExist == 0).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_isMyCard_test_2600 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number contactsApi_isLocalContact_test_2700 + * @tc.name Query isLocalContact exist + * @tc.desc Function test + */ + it("contactsApi_isLocalContact_test_2700", 0, async function(done) { + var id = g_rawContactId; + try { + var isExist = await contactsapi.isLocalContact(id); + console.info("logMessage contactsApi_isLocalContact_test_2700 isExist = " + isExist); + expect(isExist == 1).assertTrue(); + done(); + } catch (error) { + console.info("contactsApi_isLocalContact_test_2700 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_insert_test_2800 + * @tc.name contactsApi_insert error + * @tc.desc Function test + */ + it("abnormal_contactsApi_insert_test_2800", 0, async function(done) { + var contactDataError = {}; + try { + var rawContactId = await contactsapi.addContact(contactDataError); + console.info("abnormal_contactsApi_insert_test_2800 : rawContactId = " + rawContactId); + expect(rawContactId == -1).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_insert_test_2800 : raw_contact insert error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_update_test_3000 + * @tc.name contactsApi_update error + * @tc.desc Function test + */ + it("abnormal_contactsApi_update_test_3000", 0, async function(done) { + var rawContactId = -1; + var updateValues = {id : rawContactId, name : {fullName : "小红"}}; + var condition = {attributes : [ 6 ]} + try { + var updateCode = await contactsapi.updateContact(updateValues, condition); + console.info("abnormal_contactsApi_update_test_3000 : updateCode = " + updateCode); + expect(updateCode == -1).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_update_test_3000 : update error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_contact_test_3100 + * @tc.name contactsApi_query_contact error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_contact_test_3100", 0, async function(done) { + var queryId = "-1"; + try { + var resultSet = await contactsapi.queryContact(queryId); + if (resultSet == null) { + console.info("abnormal_contactsApi_query_contact_test_3100 is null"); + } + if (resultSet == undefined) { + console.info("abnormal_contactsApi_query_contact_test_3100 is undefined"); + } + console.info("abnormal_contactsApi_query_contact_test_3100 : updateCode = " + JSON.stringify(resultSet)); + expect(resultSet == undefined).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_contact_test_3100 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_contacts_test_3200 + * @tc.name contactsApi_query_contacts error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_contacts_test_3200", 0, async function(done) { + var ContactAttributes = {attributes : [ 100 ]} + try { + var resultSet = await contactsapi.queryContacts(ContactAttributes); + if (resultSet == null) { + console.info("abnormal_contactsApi_query_contacts_test_3200 is null"); + } + if (resultSet == undefined) { + console.info("abnormal_contactsApi_query_contacts_test_3200 is undefined"); + } + console.info( + "abnormal_contactsApi_query_contacts_test_3200 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_contacts_test_3200 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_email_test_3300 + * @tc.name contactsApi_query_email error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_email_test_3300", 0, async function(done) { + var email = "email2222"; + try { + var resultSet = await contactsapi.queryContactsByEmail(email); + console.info("abnormal_contactsApi_query_email_test_3300 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_email_test_3300 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_phoneNumber_test_3400 + * @tc.name contactsApi_query_phoneNumber error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_phoneNumber_test_3400", 0, async function(done) { + var phoneNumber = "19999999"; + try { + var resultSet = await contactsapi.queryContactsByPhoneNumber(phoneNumber); + console.info( + "abnormal_contactsApi_query_phoneNumber_test_3400 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_phoneNumber_test_3400 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_group_test_3500 + * @tc.name contactsApi_query_group error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_group_test_3500", 0, async function(done) { + var holder = {bundleName : "com.ohos.contacts2", displayName : "phone2", holderId : 2} + try { + var resultSet = await contactsapi.queryGroups(holder); + console.info("abnormal_contactsApi_query_group_test_3500 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_group_test_3500 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_key_test_3600 + * @tc.name contactsApi_query_key error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_key_test_3600", 0, async function(done) { + var idtest = -1; + try { + var resultSet = await contactsapi.queryKey(idtest); + console.info("abnormal_contactsApi_query_key_test_3600 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_key_test_3600 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_query_mycard_test_3700 + * @tc.name contactsApi_query_mycard error + * @tc.desc Function test + */ + it("abnormal_contactsApi_query_mycard_test_3700", 0, async function(done) { + var ContactAttributes = {attributes : [ 100 ]}; + try { + var resultSet = await contactsapi.queryMyCard(ContactAttributes); + console.info( + "abnormal_contactsApi_query_mycard_test_3700 : query resultSet = " + JSON.stringify(resultSet)); + expect(resultSet.length == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_query_mycard_test_3700 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_isMyCard_test_3800 + * @tc.name isMyCard is not exist + * @tc.desc Function test + */ + it("abnormal_contactsApi_isMyCard_test_3800", 0, async function(done) { + var id = 999; + try { + var isExist = await contactsapi.isMyCard(id); + console.info("abnormal_contactsApi_isMyCard_test_3800 : query isExist = " + isExist); + expect(isExist == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_isMyCard_test_3800 query error = " + error); + done(); + } + sleep(2000); + }); + + /** + * @tc.number abnormal_contactsApi_isLocalContact_test_3900 + * @tc.name contactsApi_isLocalContact is not exist + * @tc.desc Function test + */ + it("abnormal_contactsApi_isLocalContact_test_3900", 0, async function(done) { + var id = 999; + try { + var isExist = await contactsapi.isLocalContact(id); + console.info("abnormal_contactsApi_isLocalContact_test_3900 : query isExist = " + isExist); + expect(isExist == 0).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_contactsApi_isLocalContact_test_3900 query error = " + error); + done(); + } + sleep(2000); + }); + +}); \ No newline at end of file diff --git a/jstest/Performance_test.js b/jstest/Performance_test.js new file mode 100644 index 0000000..a389342 --- /dev/null +++ b/jstest/Performance_test.js @@ -0,0 +1,603 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CALLLOG = "dataability:///com.ohos.calllogability"; +const calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; + +const URI_VOICEMAIL = "dataability:///com.ohos.voicemailability"; +const voicemailUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + +describe('PerformanceTest', function() { + console.log(' PerformanceTest is start'); + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + /** + * @tc.number raw_contact_insert_performance_test_900 + * @tc.name The raw_contact table adds 10000 pieces of data, and the time consumption is calculated according to + * the running time of the use case + * @tc.desc Function test + */ + it("raw_contact_insert_performance_test_900", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"display_name" : "xiaoli" + i, "company" : "testCompany" + i, "position" : "testPosition" + i}; + listAddBluk[i] = add; + } + try { + let old = new Date(); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + let now = new Date(); + let usedTime = now - old; + console.info('raw_contact_insert_performance_test_900 usedTime = ' + usedTime); + expect(usedTime < 70000).assertTrue(); + sleep(5000); + console.info("logMessage raw_contact_insert_performance_test_900: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage raw_contact_insert_performance_test_900: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number raw_contact_update_performance_test_1000 + * @tc.name The raw_contact table updates data whose ID is not equal to 0, and the time consumption is calculated + * according to the running time of the use case + * @tc.desc Function test + */ + it("raw_contact_update_performance_test_1000", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"favorite" : 1}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + let old = new Date(); + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + let now = new Date(); + let usedTime = now - old; + console.info('raw_contact_update_performance_test_1000 usedTime = ' + usedTime); + expect(usedTime < 2000).assertTrue(); + sleep(5000); + console.info("logMessage raw_contact_update_performance_test_1000: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage raw_contact_update_performance_test_1000: update error = " + error); + done(); + } + }); + + /** + * @tc.number raw_contact_query_performance_test_1100 + * @tc.name The raw_ contact table queries 10000 pieces of data and calculates the time consumption according to + * the running time of the use case + * @tc.desc Function test + */ + it("raw_contact_query_performance_test_1100", 0, async function(done) { + var tag = "raw_contact_query_performance_test_1100"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + let old = new Date(); + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + let now = new Date(); + let usedTime = now - old; + console.info('raw_contact_query_performance_test_1100 usedTime = ' + usedTime); + expect(usedTime < 200).assertTrue(); + sleep(5000); + console.info(tag + ' : logMessage : rowCount' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info(tag + " :logMessage : error = " + error); + done(); + } + }); + + /** + * @tc.number raw_contact_delete_performance_test_1200 + * @tc.name The raw_contact table deletes 10000 pieces of data, and the time consumption is calculated according + * to the running time of the use case + * @tc.desc Function test + */ + it("raw_contact_delete_performance_test_1200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('raw_contact_delete_performance_test_1200 : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + let old = new Date(); + var deleteCode = await DAHelper.delete(rawContactUri, condition); + let now = new Date(); + let usedTime = now - old; + console.info('raw_contact_delete_performance_test_1200 usedTime = ' + usedTime); + expect(usedTime < 7000).assertTrue(); + sleep(5000); + console.info("logMessage raw_contact_delete_performance_test_1200: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage raw_contact_delete_performance_test_1200: delete error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_data_insert_performance_test_1300 + * @tc.name The contact_data table adds 10000 pieces of data, and the time consumption is calculated according to + * the running time of the use case + * @tc.desc Function test + */ + it("contact_data_insert_performance_test_1300", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = { + "display_name" : "xiaoli", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(1000); + console.info("logMessage contact_data_insert_performance_test_1300: rawContactId = " + rawContactId); + } catch (error) { + console.info("logMessage contact_data_insert_performance_test_1300: raw_contact insert error = " + error); + } + + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(rawContactUri, condition); + sleep(1000); + console.info("logMessage contact_data_insert_performance_test_1300: deleteCode = " + deleteCode); + + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"raw_contact_id" : rawContactId, "detail_info" : "xxx" + i, "content_type" : "name"}; + listAddBluk[i] = add; + } + try { + let old = new Date(); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + let now = new Date(); + let usedTime = now - old; + console.info('contact_data_insert_performance_test_1300 usedTime = ' + usedTime); + expect(usedTime < 70000).assertTrue(); + sleep(5000); + console.info("logMessage contact_data_insert_performance_test_1300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contact_data_insert_performance_test_1300: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_data_update_performance_test_1400 + * @tc.name The contact_data table updates data whose ID is not equal to 0, and the time consumption is + * calculated according to the running time of the use case + * @tc.desc Function test + */ + it("contact_data_update_performance_test_1400", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage contact_data_update_performance_test_1400 DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"syn_1" : "test"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + let old = new Date(); + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + let now = new Date(); + let usedTime = now - old; + console.info('contact_data_update_performance_test_1400 usedTime = ' + usedTime); + expect(usedTime < 35000).assertTrue(); + sleep(8000); + console.info("logMessage contact_data_update_performance_test_1400: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage contact_data_update_performance_test_1400: update error = " + error); + done(); + } + }); + + /** + * @tc.number contact_data_query_performance_test_1500 + * @tc.name The contact_datat table queries 10000 pieces of data and calculates the time consumption according to + * the running time of the use case + * @tc.desc Function test + */ + it("contact_data_query_performance_test_1500", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('contact_data_query_performance_test_1500 start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + let old = new Date(); + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + let now = new Date(); + let usedTime = now - old; + console.info('contact_data_query_performance_test_1500 usedTime = ' + usedTime); + expect(usedTime < 220).assertTrue(); + sleep(5000); + console.info('logMessage contact_data_query_performance_test_1500: goToFirstRow' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertEqual(true); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage contact_data_query_performance_test_1500: error = " + error); + done(); + } + }); + + /** + * @tc.number contact_data_delete_performance_test_1600 + * @tc.name The contact_data table deletes 10000 pieces of data, and the time consumption is calculated according + * to the running time of the use case + * @tc.desc Function test + */ + it("contact_data_delete_performance_test_1600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('contact_data_delete_performance_test_1600 : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + let old = new Date(); + var deleteCode = await DAHelper.delete(contactDataUri, condition); + let now = new Date(); + let usedTime = now - old; + console.info('contact_data_delete_performance_test_1600 usedTime = ' + usedTime); + expect(usedTime < 32000).assertTrue(); + sleep(5000); + console.info("logMessage contact_data_delete_performance_test_1600: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contact_data_delete_performance_test_1600: delete error = ' + error); + done(); + } + }); + + /** + * @tc.number calllog_insert_performance_test_100 + * @tc.name The callog table adds 10000 pieces of data, and the time consumption is calculated according to the + * running time of the use case + * @tc.desc Function test + */ + it("calllog_insert_performance_test_100", 0, async function(done) { + console.info("---------logMessage calllog_insert_performance_test_100 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"phone_number" : "1511002" + i}; + listAddBluk[i] = add; + } + try { + let old = new Date(); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + let now = new Date(); + let usedTime = now - old; + console.info('calllog_insert_performance_test_100 usedTime = ' + usedTime); + expect(usedTime < 90000).assertTrue(); + sleep(5000); + console.info("logMessage calllog_insert_performance_test_100: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage calllog_insert_performance_test_100: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_update_performance_test_200 + * @tc.name The callog table updates data whose ID is not equal to 0, and the time consumption is calculated + * according to the running time of the use case + * @tc.desc Function test + */ + it("calllog_update_performance_test_200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"answer_state" : "1"}; + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", 0); + let old = new Date(); + var updateCode = await DAHelper.update(calllogUri, updateValues, condition); + let now = new Date(); + let usedTime = now - old; + console.info('calllog_update_performance_test_200 usedTime = ' + usedTime); + expect(usedTime < 300).assertTrue(); + sleep(5000); + console.info("logMessage calllog_update_performance_test_200: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage calllog_update_performance_test_200: update error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_query_performance_test_300 + * @tc.name The callog table queries 10000 pieces of data to see whether they can be queried successfully + * @tc.desc Function test + */ + it("calllog_query_performance_test_300", 0, async function(done) { + var tag = "calllog_query_performance_test_300"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", 0); + + try { + let old = new Date(); + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + let now = new Date(); + let usedTime = now - old; + console.info('calllog_query_performance_test_300 usedTime = ' + usedTime); + expect(usedTime < 30).assertTrue(); + sleep(5000); + console.info(tag + ' : logMessage : rowCount' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage calllog_query_performance_test_300: error = " + error); + done() + } + }); + + /** + * @tc.number calllog_delete_performance_test_400 + * @tc.name The callog table deletes 10000 pieces of data, and the time consumption is calculated according to + * the running time of the use case + * @tc.desc Function test + */ + it("calllog_delete_performance_test_400", 0, async function(done) { + var tag = "calllog_delete_performance_test_400"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + let old = new Date(); + var deleteCode = await DAHelper.delete(calllogUri, condition); + let now = new Date(); + let usedTime = now - old; + console.info('calllog_delete_performance_test_400 usedTime = ' + usedTime); + expect(usedTime < 200).assertTrue(); + sleep(5000); + console.info(tag + " : logMessage : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + }); + + /** + * @tc.number voicemail_insert_performance_test_500 + * @tc.name The voicemail table adds 10000 pieces of data, and the time consumption is calculated according to + * the running time of the use case + * @tc.desc Function test + */ + it("voicemail_insert_performance_test_500", 0, async function(done) { + console.info("---------logMessage voicemail_insert_performance_test_500 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"phone_number" : "12345" + i}; + listAddBluk[i] = add; + } + try { + let old = new Date(); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + let now = new Date(); + let usedTime = now - old; + console.info('voicemail_insert_performance_test_500 usedTime = ' + usedTime); + expect(usedTime < 90000).assertTrue(); + sleep(5000); + console.info("logMessage voicemail_insert_performance_test_500: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_performance_test_500: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_update_performance_test_600 + * @tc.name The voicemail table updates data whose ID is not equal to 0, and the time consumption is calculated + * according to the running time of the use case + * @tc.desc Function test + */ + it("voicemail_update_performance_test_600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"origin_type" : "test"}; + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", 0); + let old = new Date(); + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + let now = new Date(); + let usedTime = now - old; + console.info('voicemail_update_performance_test_600 usedTime = ' + usedTime); + expect(usedTime < 250).assertTrue(); + sleep(5000); + console.info("logMessage voicemail_update_performance_test_600: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_update_performance_test_600: update error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_query_performance_test_700 + * @tc.name The voicemail table queries 10000 items, and the time consumption is calculated according to the + * running time of the use case + * @tc.desc Function test + */ + it("voicemail_query_performance_test_700", 0, async function(done) { + var tag = "voicemail_query_performance_test_700"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + let old = new Date(); + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + let now = new Date(); + let usedTime = now - old; + console.info('voicemail_query_performance_test_700 usedTime = ' + usedTime); + expect(usedTime < 20).assertTrue(); + sleep(5000); + console.info(tag + ' : logMessage : rowCount' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage voicemail_query_performance_test_700: error = " + error); + done() + } + }); + + /** + * @tc.number voicemail_delete_performance_test_800 + * @tc.name The voicemail table deletes 10000 pieces of data, and the time consumption is calculated according to + * the running time of the use case + * @tc.desc Function test + */ + it("voicemail_delete_performance_test_800", 0, async function(done) { + var tag = "voicemail_delete_performance_test_800"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + let old = new Date(); + var deleteCode = await DAHelper.delete(voicemailUri, condition); + let now = new Date(); + let usedTime = now - old; + console.info('voicemail_delete_performance_test_800 usedTime = ' + usedTime); + expect(usedTime < 100).assertTrue(); + sleep(5000); + console.info(tag + " : logMessage : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_delete_performance_test_800: error = " + error); + done(); + } + }); + + afterAll(async function() { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('DeleteContact : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", "0"); + try { + var resultColumns = [ "id" ]; + var conditionDelete = new ohos_data_ability.DataAbilityPredicates(); + conditionDelete.greaterThan("id", "0"); + var count = 0; + var deleteCount = 9999; + while (count < deleteCount) { + var result = await DAHelper.query(deletedUri, resultColumns, conditionDelete); + console.info("performance : result.rowCount = " + result.rowCount); + count = result.rowCount; + result.close(); + sleep(5000); + } + var deleteCode = await DAHelper.delete(deletedUri, condition); + console.info("afterAll logMessage DeleteContact: deleteCode = " + deleteCode); + } catch (error) { + console.info('afterAll logMessage DeleteContact: delete error = ' + error); + } + }); +}) diff --git a/jstest/Stability_test.js b/jstest/Stability_test.js new file mode 100644 index 0000000..f24e258 --- /dev/null +++ b/jstest/Stability_test.js @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CALLLOG = "dataability:///com.ohos.calllogability"; +const calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; + +const URI_VOICEMAIL = "dataability:///com.ohos.voicemailability"; +const voicemailUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + +describe('PerformanceTest', function() { + console.log(' PerformanceTest is start'); + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + /** + * @tc.number raw_contact_insert_stability_test_900 + * @tc.name Add 10000 pieces of data to the raw_contact table to see if they can be successfully inserted + * @tc.desc Function test + */ + it("raw_contact_insert_stability_test_900", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"display_name" : "xiaoli" + i, "company" : "testCompany" + i, "position" : "testPosition" + i}; + listAddBluk[i] = add; + } + try { + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(rawContactUri, listAddBluk); + sleep(1000); + console.info("logMessage raw_contact_insert_stability_test_900: contactDataId1 = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage raw_contact_insert_stability_test_900: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number raw_contact_update_stability_test_1000 + * @tc.name The raw_contact table updates the data whose ID is not equal to 0 to see whether they can be updated + * successfully + * @tc.desc Function test + */ + it("raw_contact_update_stability_test_1000", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"favorite" : 1}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var updateCode = await DAHelper.update(rawContactUri, updateValues, condition); + sleep(1000); + console.info("logMessage raw_contact_update_stability_test_1000: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage raw_contact_update_stability_test_1000: update error = " + error); + done(); + } + }); + + /** + * @tc.number raw_contact_query_stability_test_1100 + * @tc.name The raw_contact table queries 10000 pieces of data to see whether they can be queried successfully + * @tc.desc Function test + */ + it("raw_contact_query_stability_test_1100", 0, async function(done) { + var tag = "raw_contact_query_stability_test_1100"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = ["id"]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var resultSet = await DAHelper.query(rawContactUri, resultColumns, condition); + sleep(1000); + console.info(tag + ' : logMessage : rowCount' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info(tag + " :logMessage : error = " + error); + done(); + } + }); + + /** + * @tc.number raw_contact_delete_stability_test_1200 + * @tc.name Delete 10000 pieces of data in raw_contact table to see if they can be deleted successfully + * @tc.desc Function test + */ + it("raw_contact_delete_stability_test_1200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('raw_contact_delete_stability_test_1200 : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + try { + var deleteCode = await DAHelper.delete(rawContactUri, condition); + sleep(1000); + console.info("logMessage raw_contact_delete_stability_test_1200: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage raw_contact_delete_stability_test_1200: delete error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_data_insert_stability_test_1300 + * @tc.name Add 10000 pieces of data to the contact_data table to see if they can be successfully inserted + * @tc.desc Function test + */ + it("contact_data_insert_stability_test_1300", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var rawContactValues = { + "display_name" : "xiaoli", + }; + try { + var rawContactId = await DAHelper.insert(rawContactUri, rawContactValues); + sleep(1000); + console.info("logMessage contact_data_insert_stability_test_1300: rawContactId = " + rawContactId); + } catch (error) { + console.info("logMessage contact_data_insert_stability_test_1300: raw_contact insert error = " + error); + } + + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", rawContactId.toString()); + var deleteCode = await DAHelper.delete(rawContactUri, condition); + sleep(1000); + console.info("logMessage contact_data_insert_stability_test_1300: deleteCode = " + deleteCode); + + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"raw_contact_id" : rawContactId, "detail_info" : "xxx" + i, "content_type" : "name"}; + listAddBluk[i] = add; + } + try { + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(contactDataUri, listAddBluk); + sleep(2000); + console.info("logMessage contact_data_insert_stability_test_1300: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contact_data_insert_stability_test_1300: insert error = ' + error); + done(); + } + }); + + /** + * @tc.number contact_data_update_stability_test_1400 + * @tc.name The contact_data table updates the data whose ID is not equal to 0 to see whether they can be updated + * successfully + * @tc.desc Function test + */ + it("contact_data_update_stability_test_1400", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage contact_data_update_stability_test_1400 DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"syn_1" : "test"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var updateCode = await DAHelper.update(contactDataUri, updateValues, condition); + sleep(2000); + console.info("logMessage contact_data_update_stability_test_1400: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage contact_data_update_stability_test_1400: update error = " + error); + done(); + } + }); + + /** + * @tc.number contact_data_query_stability_test_1500 + * @tc.name The contact_data table queries 10000 pieces of data to see whether they can be queried successfully + * @tc.desc Function test + */ + it("contact_data_query_stability_test_1500", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('contact_data_query_stability_test_1500 start ! DAHelper = ' + DAHelper); + var resultColumns = ["id"]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(contactDataUri, resultColumns, condition); + sleep(2000); + console.info(' contact_data_query_stability_test_1500 : resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertEqual(true); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage contact_data_query_stability_test_1500: error = " + error); + done(); + } + }); + + /** + * @tc.number contact_data_delete_stability_test_1600 + * @tc.name Delete 10000 pieces of data in contact_data table to see if they can be deleted successfully + * @tc.desc Function test + */ + it("contact_data_delete_stability_test_1600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('contact_data_delete_stability_test_1600 : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var deleteCode = await DAHelper.delete(contactDataUri, condition); + sleep(2000); + console.info("logMessage contact_data_delete_stability_test_1600: deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info('logMessage contact_data_delete_stability_test_1600: delete error = ' + error); + done(); + } + }); + + /** + * @tc.number calllog_insert_stability_test_100 + * @tc.name Add 10000 pieces of data to the callog table to see if they can be successfully inserted + * @tc.desc Function test + */ + it("calllog_insert_stability_test_100", 0, async function(done) { + console.info("---------logMessage calllog_insert_stability_test_100 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"phone_number" : "1511002" + i}; + listAddBluk[i] = add; + } + try { + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(calllogUri, listAddBluk); + sleep(1000); + console.info("logMessage calllog_insert_stability_test_100: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage calllog_insert_stability_test_100: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_update_stability_test_200 + * @tc.name The callog table updates the data whose ID is not equal to 0 to see whether they can be updated + * successfully + * @tc.desc Function test + */ + it("calllog_update_stability_test_200", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"answer_state" : "1"}; + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var updateCode = await DAHelper.update(calllogUri, updateValues, condition); + sleep(1000); + console.info("logMessage calllog_update_stability_test_200: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage calllog_update_stability_test_200: update error = " + error); + done(); + } + }); + + /** + * @tc.number calllog_query_stability_test_300 + * @tc.name The callog table queries 10000 pieces of data to see whether they can be queried successfully + * @tc.desc Function test + */ + it("calllog_query_stability_test_300", 0, async function(done) { + var tag = "calllog_query_stability_test_300"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = ["id"]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", 0); + + try { + var resultSet = await DAHelper.query(calllogUri, resultColumns, condition); + sleep(5000); + console.info(tag + ' : logMessage : rowCount' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage calllog_query_stability_test_300: error = " + error); + done() + } + }); + + /** + * @tc.number calllog_delete_stability_test_400 + * @tc.name Delete 10000 pieces of data in callog table to see if they can be deleted successfully + * @tc.desc Function test + */ + it("calllog_delete_stability_test_400", 0, async function(done) { + var tag = "calllog_delete_stability_test_400"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CALLLOG); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(calllogUri, condition); + sleep(5000); + console.info(tag + " : logMessage : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + }); + + /** + * @tc.number voicemail_insert_stability_test_500 + * @tc.name Add 10000 pieces of data to the voicemail table to see if they can be successfully inserted + * @tc.desc Function test + */ + it("voicemail_insert_stability_test_500", 0, async function(done) { + console.info("---------logMessage voicemail_insert_stability_test_500 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var listAddBluk = []; + for (var i = 0; i < 1000; i++) { + var add = {"phone_number" : "12345" + i}; + listAddBluk[i] = add; + } + try { + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + sleep(1000); + console.info("logMessage voicemail_insert_stability_test_500: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_stability_test_500: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_update_stability_test_600 + * @tc.name The voicemail table updates the data whose ID is not equal to 0 to see whether they can be updated + * successfully + * @tc.desc Function test + */ + it("voicemail_update_stability_test_600", 0, async function(done) { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var updateValues = {"origin_type" : "test"}; + try { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", 0); + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + sleep(1000); + console.info("logMessage voicemail_update_stability_test_600: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_update_stability_test_600: update error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_query_stability_test_700 + * @tc.name The voicemail table queries 10000 pieces of data to see whether they can be queried successfully + * @tc.desc Function test + */ + it("voicemail_query_stability_test_700", 0, async function(done) { + var tag = "voicemail_query_stability_test_700"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var resultColumns = ["id"]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + sleep(1000); + console.info(tag + ' : resultSet.rowCount = ' + resultSet.rowCount); + expect(resultSet.rowCount == 10000).assertEqual(true); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage voicemail_query_stability_test_700: error = " + error); + done() + } + }); + + /** + * @tc.number voicemail_delete_stability_test_800 + * @tc.name Delete 10000 pieces of data in voicemail table to see if they can be deleted successfully + * @tc.desc Function test + */ + it("voicemail_delete_stability_test_800", 0, async function(done) { + var tag = "voicemail_delete_stability_test_800"; + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var deleteCode = await DAHelper.delete(voicemailUri, condition); + sleep(2000); + console.info(tag + " : logMessage : deleteCode = " + deleteCode); + expect(deleteCode == 0).assertTrue(); + done(); + } catch (error) { + console.info("logMessage voicemail_delete_stability_test_800: error = " + error); + done(); + } + }); + + afterAll(async function() { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('Stability : start ! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.notEqualTo("id", "0"); + try { + var resultColumns = [ "id" ]; + var conditionDelete = new ohos_data_ability.DataAbilityPredicates(); + conditionDelete.greaterThan("id", "0"); + var count = 0; + var deleteCount = 9999; + while (count < deleteCount) { + var result = await DAHelper.query(deletedUri, resultColumns, conditionDelete); + console.info("Stability : result.rowCount = " + result.rowCount); + count = result.rowCount; + result.close(); + sleep(5000); + } + var deleteCode = await DAHelper.delete(deletedUri, condition); + console.info("Stability afterAll logMessage DeleteContact: deleteCode = " + deleteCode); + } catch (error) { + console.info('Stability afterAll logMessage DeleteContact: delete error = ' + error); + } + }); +}) diff --git a/jstest/Voicemail_test.js b/jstest/Voicemail_test.js new file mode 100644 index 0000000..6d87b62 --- /dev/null +++ b/jstest/Voicemail_test.js @@ -0,0 +1,1247 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' +import common from './common.js'; + +const URI_VOICEMAIL = "dataability:///com.ohos.voicemailability"; +const voicemailUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; + +describe('VoicemailTest', function() { + console.log("----------VoicemailTest is starting!----------"); + + async function voicemailQuery(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ':calllogInsertQuery start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of map) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ' :logMessage voicemailQuery key = ' + key + ' dbresult :' + dbresult + + ' value : ' + value); + expect(value == dbresult).assertTrue(); + } + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + ":logMessage voicemailQuery: error = " + error); + } + } + + async function voicemailQueryForDelete(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': voicemailQueryForDelete start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", map.get("id")); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage voicemailQueryForDelete: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage voicemailQueryForDelete: error = " + error); + } + } + + async function voicemailQueryError(map, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': voicemailQueryError start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", map.get("phone_number")); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.goToFirstRow() == false).assertTrue(); + console.info(tag + " :logMessage voicemailQueryError: goToFirstRow " + resultSet.goToFirstRow()); + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage voicemailQueryError: error = " + error); + } + } + + async function voicemailQueryForBatchInsert(array, tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info(tag + ': voicemailQueryForBatchInsert start ! DAHelper = ' + DAHelper); + var resultColumns = common.getCallLogResultColumns(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("phone_number", array[0].get("phone_number")); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + var size = array.size(); + console.info(tag + ' : logMessage voicemailQueryForBatchInsert: size' + size); + expect(resultSet.rowCount == size).assertEqual(true); + var i = 0; + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + for (var [key, value] of array[i]) { + var dbresult = resultSet.getString(resultSet.getColumnIndex(key)); + console.info(tag + ' : logMessage voicemailQueryForBatchInsert dbresult :' + dbresult + + ' value : ' + value); + console.info( + tag + ' : logMessage voicemailQueryForBatchInsert value ' + (value == dbresult)); + expect(value == dbresult).assertTrue(); + } + i++; + } while (resultSet.goToNextRow()); + } + } + resultSet.close(); + } catch (error) { + console.info(tag + " :logMessage calllogQueryByInsert: error = " + error); + } + } + + async function voiceMailDelete(tag) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(voicemailUri, condition); + console.info(tag + ': voiceMailDelete deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + } + + /** + * @tc.number voicemail_insert_test_100 + * @tc.name Insert voicemail data + * @tc.desc Function test + */ + it("voicemail_insert_test_100", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_100 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + try { + var voicemailId = await DAHelper.insert(voicemailUri, common.getVoiceMail()); + console.info("logMessage voicemail_insert_test_100: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + var map = common.getVoiceMailMap(); + map.set("id", voicemailId.toString()); + await voicemailQuery(map, "voicemail_insert_test_100"); + await voiceMailDelete("voicemail_insert_test_100"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_100: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_insert_test_200 + * @tc.name Insert voicemail status + * @tc.desc Function test + */ + it("voicemail_insert_test_200", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_200 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + + var stringValue = {"phone_number" : "1557254", "voice_status" : 1}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + console.info("logMessage voicemail_insert_test_200: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("phone_number", "1557254"); + map.set("voice_status", "1"); + await voicemailQuery(map, "voicemail_insert_test_200"); + await voiceMailDelete("voicemail_insert_test_200"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_200: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_insert_test_100000 + * @tc.name Insert voicemail status + * @tc.desc Function test + */ + it("voicemail_insert_test_100000", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_100000 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + + var stringValue = {"phone_number" : "1557254", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + console.info("logMessage voicemail_insert_test_100000: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("phone_number", "1557254"); + map.set("voice_status", "0"); + await voicemailQuery(map, "voicemail_insert_test_100000"); + await voiceMailDelete("voicemail_insert_test_100000"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_100000: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_update_test_1000 + * @tc.name Update voicemail data + * @tc.desc Function test + */ + it("voicemail_update_test_1000", 0, async function(done) { + console.info("------------logMessage voicemail_update_test_1000 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + try { + var voicemailId = await DAHelper.insert(voicemailUri, common.getVoiceMail()); + console.info("logMessage voicemail_update_test_1000: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailUpdate(); + await voiceMailDelete("voicemail_update_test_1000"); + done(); + } catch (error) { + console.info("logMessage voicemail_update_test_1000: voicemail insert error = " + error); + done(); + } + + async function VoicemailUpdate() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var updateCode = await DAHelper.update(voicemailUri, common.getVoiceMailUpdate(), condition); + console.info("logMessage voicemail_update_test_1000: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = common.getVoiceMailUpdateMap(); + map.set("id", voicemailId.toString()); + await voicemailQuery(map, "voicemail_update_test_1000"); + } catch (error) { + console.info("logMessage voicemail_update_test_1000: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number voicemail_update_test_900 + * @tc.name Update voicemail status + * @tc.desc Function test + */ + it("voicemail_update_test_900", 0, async function(done) { + console.info("------------logMessage voicemail_update_test_900 is starting!----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "18862013", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage voicemail_update_test_900: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailUpdate(); + await voiceMailDelete("voicemail_update_test_900"); + done(); + } catch (error) { + console.info("logMessage voicemail_update_test_900: voicemail insert error = " + error); + done(); + } + + async function VoicemailUpdate() + { + var updateValues = {"voice_status" : 1}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + console.info("logMessage voicemail_update_test_900: updateCode = " + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("voice_status", "1"); + await voicemailQuery(map, "voicemail_update_test_900"); + } catch (error) { + console.info("logMessage voicemail_update_test_900: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number voicemail_delete_test_500 + * @tc.name Delete voicemail data + * @tc.desc Function test + */ + it("voicemail_delete_test_500", 0, async function(done) { + console.info("-------------logMessage voicemail_delete_test_500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "100578615", "display_name" : "zhangming"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage voicemail_delete_test_500: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailDelete(); + await voiceMailDelete("voicemail_delete_test_500"); + done(); + } catch (error) { + console.info("logMessage voicemail_delete_test_500: voicemail insert error = " + error); + done(); + } + + async function VoicemailDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var deleteCode = await DAHelper.delete(voicemailUri, condition); + console.info('logMessage voicemail_delete_test_500: deleteCode = ' + deleteCode); + expect(deleteCode == 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + await voicemailQueryForDelete(map, "voicemail_delete_test_500"); + } catch (error) { + console.info("logMessage voicemail_delete_test_500: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number voicemail_update_test_600 + * @tc.name Delete voicemail status + * @tc.desc Function test + */ + it("voicemail_update_test_600", 0, async function(done) { + console.info("-------------logMessage voicemail_update_test_600 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues1 = {"phone_number" : "100578615", "voice_status" : 1}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues1); + console.info("logMessage voicemail_update_test_600: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailUpdate(); + await voiceMailDelete("voicemail_update_test_600"); + done(); + } catch (error) { + console.info("logMessage voicemail_update_test_600: voicemail insert error = " + error); + done(); + } + + async function VoicemailUpdate() + { + var updateValues = {"voice_status" : 0}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + console.info('logMessage voicemail_update_test_600: deleteCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("voice_status", "0"); + await voicemailQuery(map, "voicemail_update_test_600"); + } catch (error) { + console.info("logMessage voicemail_update_test_600: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number voicemail_batchInsert_test_1800 + * @tc.name Insert voicemail data in batches + * @tc.desc Function test + */ + it("voicemail_batchInsert_test_1800", 0, async function(done) { + console.info("-------------logMessage voicemail_batchInsert_test_1800 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"phone_number" : "10086", "display_name" : "xiaoming"}; + var insertValuesTwo = {"phone_number" : "12580", "display_name" : "xiaohei"}; + var insertValuesThree = {"phone_number" : "123456", "display_name" : "xiaohong"}; + var insertValuesFour = {"phone_number" : "9996325", "display_name" : "xiaohei"}; + var insertValuesFive = {"phone_number" : "18862013", "display_name" : "xiaofen"}; + var listAddBluk = []; + listAddBluk[0] = insertValuesOne; + listAddBluk[1] = insertValuesTwo; + listAddBluk[2] = insertValuesThree; + listAddBluk[3] = insertValuesFour; + listAddBluk[4] = insertValuesFive; + try { + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + console.info("logMessage voicemail_batchInsert_test_1800: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + await voiceMailDelete("voicemail_batchInsert_test_1800"); + done(); + } catch (error) { + console.info("logMessage voicemail_batchInsert_test_1800: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_batchInsert_test_1700 + * @tc.name Insert voicemail status in batches + * @tc.desc Function test + */ + it("voicemail_batchInsert_test_1700", 0, async function(done) { + console.info("-------------logMessage voicemail_batchInsert_test_1700 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"phone_number" : "1600", "display_name" : "xiaoming", "voice_status" : 0}; + var insertValuesTwo = {"phone_number" : "1600", "display_name" : "xiaohei", "voice_status" : 1}; + var insertValuesThree = {"phone_number" : "1600", "display_name" : "xiaohong", "voice_status" : 0}; + var insertValuesFour = {"phone_number" : "1600", "display_name" : "xiaohei", "voice_status" : 0}; + var insertValuesFive = {"phone_number" : "1600", "display_name" : "xiaofen", "voice_status" : 1}; + var listAddBluk = []; + listAddBluk[0] = insertValuesOne; + listAddBluk[1] = insertValuesTwo; + listAddBluk[2] = insertValuesThree; + listAddBluk[3] = insertValuesFour; + listAddBluk[4] = insertValuesFive; + try { + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + console.info("logMessage voicemail_batchInsert_test_1700: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == 0).assertTrue(); + var array = common.getvoiceMailBatchInsert(); + await voicemailQueryForBatchInsert(array, "voicemail_batchInsert_test_1700"); + await voiceMailDelete("voicemail_batchInsert_test_1700"); + done(); + } catch (error) { + console.info("logMessage voicemail_batchInsert_test_1700: batchInsert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_query_test_1400 + * @tc.name Query voicemail data + * @tc.desc Function test + */ + it("voicemail_query_test_1400", 0, async function(done) { + console.info("------------voicemail_query_test_1400 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "8855220011", "display_name" : "daming"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage voicemail_query_test_1400: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailQuery(); + await voiceMailDelete("voicemail_query_test_1400"); + done(); + } catch (error) { + console.info("logMessage voicemail_query_test_1400: voicemial insert error = " + error); + done(); + } + async function VoicemailQuery() + { + var resultColumns = [ "id", "display_name", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('voicemail_query_test_1400 id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == voicemailId.toString()).assertTrue(); + console.info('voicemail_query_test_1400 display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "daming").assertTrue(); + console.info('voicemail_query_test_1400 phone_number = ' + resultSet.getString(2)); + expect(resultSet.getString(2) == "8855220011").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("voicemail_query_test_1400 query error = " + error); + done(); + } + } + }); + + /** + * @tc.number voicemail_query_test_1300 + * @tc.name Query voicemail's status + * @tc.desc Function test + */ + it("voicemail_query_test_1300", 0, async function(done) { + console.info("------------voicemail_query_test_1300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValues = {"phone_number" : "1158220165", "display_name" : "xiaoming", "voice_status" : 1}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage voicemail_query_test_1300: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await VoicemailQuery(); + await voiceMailDelete("voicemail_query_test_1300"); + done(); + } catch (error) { + console.info("logMessage voicemail_query_test_1300: voicemial insert error = " + error); + done(); + } + async function VoicemailQuery() + { + var resultColumns = [ "id", "display_name", "phone_number" ]; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("voice_status", "1"); + condition.and(); + condition.equalTo("phone_number", "1158220165"); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + if (resultSet.goToFirstRow()) { + do { + console.info('voicemail_query_test_1300 id = ' + resultSet.getString(0)); + expect(resultSet.getString(0) == voicemailId.toString()).assertTrue(); + console.info('voicemail_query_test_1300 display_name = ' + resultSet.getString(1)); + expect(resultSet.getString(1) == "xiaoming").assertTrue(); + console.info('voicemail_query_test_1300 phone_number = ' + resultSet.getString(2)); + expect(resultSet.getString(2) == "1158220165").assertTrue(); + } while (resultSet.goToNextRow()); + } + resultSet.close(); + } catch (error) { + console.info("voicemail_query_test_1300 query error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_insert_test_300 + * @tc.name Abnormal use case, an incorrect field is passed in when inserting data + * @tc.desc Function test + */ + it("abnormal_voicemail_insert_test_300", 0, async function(done) { + console.info("------------abnormal_voicemail_insert_test_300 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_numbers" : "18942010321", "display_name" : "xiaoming"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_insert_test_300: voicemialId = " + voicemailId); + expect(voicemailId == -1).assertTrue(); + done(); + } catch (error) { + console.info("abnormal_voicemail_insert_test_300 insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_insert_test_400 + * @tc.name Exception use case, an incorrect table name is passed in when inserting data + * @tc.desc Function test + */ + it("abnormal_voicemail_insert_test_400", 0, async function(done) { + console.info("------------abnormal_voicemail_insert_test_400 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/voicemails"; + + var insertValues = {"phone_number" : "18942010321", "display_name" : "xiaoming"}; + try { + var voicemialId = await DAHelper.insert(errorUri, insertValues) + console.info("logMessage abnormal_voicemail_insert_test_400: voicemialId = " + voicemialId); + expect(voicemialId == -1).assertTrue(); + var map = new Map(); + map.set("phone_number", "18942010321"); + await voicemailQueryError(map, "abnormal_voicemail_insert_test_400"); + done(); + } catch (error) { + console.info("abnormal_voicemail_insert_test_400 insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_update_test_1100 + * @tc.name Abnormal use case, passing in a wrong field when updating data + * @tc.desc Function test + */ + it("abnormal_voicemail_update_test_1100", 0, async function(done) { + console.info("------------abnormal_voicemail_update_test_1100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "18942010321"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_update_test_1100: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await AbnormalUpdate(); + await voiceMailDelete("abnormal_voicemail_update_test_1100"); + done(); + } catch (error) { + console.info("abnormal_voicemail_update_test_1100 insert error = " + error); + done(); + } + async function AbnormalUpdate() + { + var updateValues = {"phone_numbers" : "11111111111111111"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", voicemailId.toString()); + try { + var updataCode = await DAHelper.update(voicemailUri, updateValues, condition); + console.info("logMessage abnormal_voicemail_update_test_1100: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("phone_number", "11111111111111111"); + await voicemailQueryError(map, "abnormal_voicemail_update_test_1100"); + } catch (error) { + console.info("logMessage abnormal_voicemail_update_test_1100: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_update_test_1200 + * @tc.name Abnormal use case, an incorrect table name is passed in when updating data + * @tc.desc Function test + */ + it("abnormal_voicemail_update_test_1200", 0, async function(done) { + console.info("------------abnormal_voicemail_update_test_1200 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/voicemails"; + + var insertValues = {"phone_number" : "9952364"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_update_test_1200: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await AbnormalUpdate(); + await voiceMailDelete("abnormal_voicemail_update_test_1200"); + done(); + } catch (error) { + console.info("logMessage abnormal_voicemail_update_test_1200: insert error = " + error); + done(); + } + + async function AbnormalUpdate() + { + var updateValues = {"phone_number" : "22001122"}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var updataCode = await DAHelper.update(errorUri, updateValues, condition) + console.info("logMessage abnormal_voicemail_update_test_1200: updataCode = " + updataCode); + expect(updataCode == -1).assertTrue(); + var map = new Map(); + map.set("phone_number", "22001122"); + await voicemailQueryError(map, "abnormal_voicemail_update_test_1200"); + } catch (error) { + console.info("logMessage abnormal_voicemail_update_test_1200: update error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_delete_test_700 + * @tc.name Abnormal use case, passing in a wrong field when deleting data + * @tc.desc Function test + */ + it("abnormal_voicemail_delete_test_700", 0, async function(done) { + console.info("------------abnormal_voicemail_delete_test_700 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "789130"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_delete_test_700: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await AbnormalDelete(); + await voiceMailDelete("abnormal_voicemail_delete_test_700"); + done(); + } catch (error) { + console.info("logMessage abnormal_voicemail_delete_test_700: insert error = " + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", voicemailId.toString()); + try { + var deleteCode = await DAHelper.delete(voicemailUri, condition); + console.info("logMessage abnormal_voicemail_delete_test_700: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + } catch (error) { + console.info("logMessage abnormal_voicemail_delete_test_700: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_delete_test_800 + * @tc.name Abnormal use case, passing in an incorrect table name when deleting data + * @tc.desc Function test + */ + it("abnormal_voicemail_delete_test_800", 0, async function(done) { + console.info("------------abnormal_voicemail_delete_test_800 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var errorUri = "dataability:///com.ohos.calllogability/calls/voicemails"; + + var insertValues = {"phone_number" : "1564721"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_delete_test_800: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await AbnormalDelete(); + await voiceMailDelete("abnormal_voicemail_delete_test_800"); + done(); + } catch (error) { + console.info("logMessage abnormal_voicemail_delete_test_800: insert error = " + error); + done(); + } + + async function AbnormalDelete() + { + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + try { + var deleteCode = await DAHelper.delete(errorUri, condition); + console.info("logMessage abnormal_voicemail_delete_test_800: deleteCode = " + deleteCode); + expect(deleteCode == -1).assertTrue(); + } catch (error) { + console.info("logMessage abnormal_voicemail_delete_test_800: delete error = " + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_query_test_1500 + * @tc.name Abnormal use case, an incorrect field is passed in when querying + * @tc.desc Function test + */ + it("abnormal_voicemail_query_test_1500", 0, async function(done) { + console.info("------------abnormal_voicemail_query_test_1500 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValues = {"phone_number" : "1564721"}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + console.info("logMessage abnormal_voicemail_query_test_1500: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + await AbnormalQuery(); + await voiceMailDelete("abnormal_voicemail_query_test_1500"); + done(); + } catch (error) { + console.info("logMessage abnormal_voicemail_query_test_1500: insert error = " + error); + done(); + } + + async function AbnormalQuery() + { + var resultColumns = [ "id", "phone_number" ]; + + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", voicemailId.toString()); + try { + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition) + console.info('logMessage abnormal_voicemail_query_test_1500: goToFirstRow' + resultSet.goToFirstRow()); + expect(resultSet.goToFirstRow()).assertEqual(false); + resultSet.close(); + } catch (error) { + console.info('logMessage abnormal_voicemail_query_test_1500: query error = ' + error); + done(); + } + } + }); + + /** + * @tc.number abnormal_voicemail_batchinsert_test_1900 + * @tc.name Abnormal use cases, when inserting data in batches, some of them failed, check the processing logic + * @tc.desc Function test + */ + it("abnormal_voicemail_batchinsert_test_1900", 0, async function(done) { + console.info("--------logMessage abnormal_voicemail_batchinsert_test_1900 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var addBulk_value1 = {"phone_number" : "5555555555", "ring_duration" : "500"}; + var addBulk_value2 = {"phone_number" : "1511002", "ring_duration" : "100"}; + var addBulk_value3 = {"phone_numbers" : "1521003", "ring_duration" : "100"}; + var addBulk_value4 = {"phone_number" : "1521004", "ring_durations" : "100"}; + var addBulk_value5 = {"phone_number" : "1521005", "ring_duration" : "100"}; + var listAddBluk = []; + listAddBluk[0] = addBulk_value1; + listAddBluk[1] = addBulk_value2; + listAddBluk[2] = addBulk_value3; + listAddBluk[3] = addBulk_value4; + listAddBluk[4] = addBulk_value5; + try { + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk) + console.info("logMessage abnormal_voicemail_batchinsert_test_1900: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == -1).assertTrue(); + done(); + } catch (error) { + console.info('logMessage abnormal_voicemail_batchinsert_test_1900: batchInsert error = ' + error); + done(); + } + }); + + /** + * @tc.number voiceMail_delete_test_2000 + * @tc.name batchDelete + * @tc.desc Function test + */ + it("voiceMail_delete_test_2000", 0, async function(done) { + console.info("--------logMessage voiceMail_delete_test_2000 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var voiceMailId = await DAHelper.insert(voicemailUri, common.getVoiceMail()); + console.info("logMessage voiceMail_delete_test_2000: voiceMailId = " + voiceMailId); + expect(voiceMailId > 0).assertTrue(); + var map = common.getVoiceMailMap() + map.set("id", voiceMailId.toString()); + await voicemailQuery(map, "voiceMail_delete_test_2000"); + await executeBatch(); + } catch (error) { + console.info("logMessage voiceMail_delete_test_2000: voiceMailId insert error = " + error); + done(); + } + async function executeBatch() + { + console.info("logMessage voiceMail_delete_test_2000: executeBatch start "); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voiceMailId.toString()); + DAHelper.executeBatch(URI_VOICEMAIL, [ { + uri : voicemailUri, + type : featureAbility.DataAbilityOperationType.TYPE_DELETE, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage voiceMail_delete_test_2000: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage voiceMail_delete_test_2000: data_3 = " + data); + console.info("logMessage voiceMail_delete_test_2000: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number voiceMail_update_test_2100 + * @tc.name batchUpdate + * @tc.desc Function test + */ + it("voiceMail_update_test_2100", 0, async function(done) { + console.info("--------logMessage voiceMail_update_test_2100 is starting!------------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + try { + var voiceMailId = await DAHelper.insert(voicemailUri, common.getVoiceMail()); + console.info("logMessage voiceMail_update_test_2100: voiceMailId = " + voiceMailId); + expect(voiceMailId > 0).assertTrue(); + var map = common.getVoiceMailMap(); + map.set("id", voiceMailId.toString()); + await voicemailQuery(map, "voiceMail_update_test_2100"); + await executeBatch(); + } catch (error) { + console.info("logMessage voiceMail_update_test_2100: calllog insert error = " + error); + done(); + } + async function executeBatch() + { + var updateValues = {"phone_number" : "123456789"}; + console.info("logMessage voiceMail_update_test_2100: executeBatch start "); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voiceMailId.toString()); + DAHelper.executeBatch(URI_VOICEMAIL, [ { + uri : voicemailUri, + type : featureAbility.DataAbilityOperationType.TYPE_UPDATE, + valuesBucket : updateValues, + predicates : condition, + expectedCount : 0, + PredicatesBackReferences : {}, + interrupted : true, + } ], + (error, data) => { + console.info("logMessage voiceMail_update_test_2100: executeBatch data = " + JSON.stringify(data)); + console.info("logMessage voiceMail_update_test_2100: data_3 = " + data); + console.info("logMessage voiceMail_update_test_2100: data_1= " + data[0].count); + expect(data[0].count == 0).assertTrue(); + done(); + }); + } + }); + + /** + * @tc.number voicemail_insert_test_2200 + * @tc.name Insert voicemail status 0 + * @tc.desc Function test + */ + it("voicemail_insert_test_2200", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_2200 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + + var stringValue = {"phone_number" : "1557544452542200", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + console.info("logMessage voicemail_insert_test_2200: voicemailId = " + voicemailId); + expect(voicemailId > 0).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("phone_number", "1557544452542200"); + map.set("voice_status", "0"); + await voicemailQuery(map, "voicemail_insert_test_2200"); + await voiceMailDelete("voicemail_insert_test_2200"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_2200: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_insert_test_2300 + * @tc.name Insert 3 pieces of voice mail data first, then delete 2 pieces of data, + * and verify whether the deletion is successful + * @tc.desc Function test + */ + it("voicemail_insert_test_2300", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_2300 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + + var stringValue = {"phone_number" : "155754445254", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + var voicemailIdOne = await DAHelper.insert(voicemailUri, stringValue) + var voicemailIdTwo = await DAHelper.insert(voicemailUri, stringValue) + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + condition.or(); + condition.equalTo("id", voicemailIdOne.toString()); + var deleteCode = await DAHelper.delete(voicemailUri, condition); + console.info("logMessage voicemail_insert_test_2300: deleteCode = " + deleteCode); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == 0).assertTrue(); + resultSet.close(); + await voiceMailDelete("voicemail_insert_test_2300"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_2300: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_insert_test_2400 + * @tc.name Insert 3 pieces of voice mail data first, then update 2 pieces of data, + * and verify whether the deletion is successful + * @tc.desc Function test + */ + it("voicemail_insert_test_2400", 0, async function(done) { + console.info("---------logMessage voicemail_insert_test_2400 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + + var stringValue = {"phone_number" : "155754445254", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + var voicemailIdOne = await DAHelper.insert(voicemailUri, stringValue) + var voicemailIdTwo = await DAHelper.insert(voicemailUri, stringValue) + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + condition.or(); + condition.equalTo("id", voicemailIdOne.toString()); + var updateValue = {"phone_number" : "14541555754445254", "voice_status" : 1}; + var updateCode = await DAHelper.update(voicemailUri, updateValue, condition); + console.info("logMessage voicemail_insert_test_2400: deleteCode = " + updateCode); + + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("phone_number", "14541555754445254"); + map.set("voice_status", "1"); + await voicemailQuery(map, "voicemail_insert_test_2400"); + + var mapOne = new Map(); + mapOne.set("id", voicemailIdOne.toString()); + mapOne.set("phone_number", "14541555754445254"); + mapOne.set("voice_status", "1"); + await voicemailQuery(mapOne, "voicemail_insert_test_2400"); + await voiceMailDelete("voicemail_insert_test_2400"); + done(); + } catch (error) { + console.info("logMessage voicemail_insert_test_2400: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_insert_test_2500 + * @tc.name Query the voice mailbox with status 0 or id and return the query result + * @tc.desc Function test + */ + it("voicemail_query_test_2500", 0, async function(done) { + console.info("---------logMessage voicemail_query_test_2500 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + var stringValue = {"phone_number" : "4454445254", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue) + var voicemailIdOne = await DAHelper.insert(voicemailUri, stringValue) + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.beginWrap(); + condition.equalTo("id", voicemailId.toString()); + condition.or(); + condition.equalTo("id", voicemailIdOne.toString()); + condition.endWrap(); + condition.and(); + condition.equalTo("voice_status", "0"); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == 2).assertTrue(); + resultSet.close(); + await voiceMailDelete("voicemail_query_test_2500"); + done(); + } catch (error) { + console.info("logMessage voicemail_query_test_2500: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number voicemail_query_test_2600 + * @tc.name Query the voice mailbox and return the query result + * @tc.desc Function test + */ + it("voicemail_query_test_2600", 0, async function(done) { + console.info("---------logMessage voicemail_query_test_2600 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + var stringValue = {"phone_number" : "445444445254", "voice_status" : 0}; + try { + var voicemailId = await DAHelper.insert(voicemailUri, stringValue); + console.info('voicemail_query_test_2600 voicemailId = ' + voicemailId); + var voicemailIdOne = await DAHelper.insert(voicemailUri, stringValue); + console.info('voicemail_query_test_2600 voicemailIdOne = ' + voicemailIdOne); + var condition = new ohos_data_ability.DataAbilityPredicates(); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == 2).assertTrue(); + resultSet.close(); + await voiceMailDelete("voicemail_query_test_2600"); + done(); + } catch (error) { + console.info("logMessage voicemail_query_test_2600: voicemail insert error = " + error); + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_insert_test_2700 + * @tc.name When the voicemail status is added, a non-existent field is passed in + * @tc.desc Function test + */ + it("abnormal_voicemail_insert_test_2700", 0, async function(done) { + console.info("---------logMessage abnormal_voicemail_insert_test_2700 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + try { + var insertValues = {display_name : "2700name", voice_statuss : "1"}; + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + expect(voicemailId == -1).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == 0).assertTrue(); + await voiceMailDelete("abnormal_voicemail_insert_test_2700"); + done(); + } catch (error) { + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_delete_test_2800 + * @tc.name When deleting the voicemail status, pass in a non-existent field + * @tc.desc Function test + */ + it("abnormal_voicemail_delete_test_2800", 0, async function(done) { + console.info("---------logMessage abnormal_voicemail_delete_test_2800 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + try { + var insertValues = {display_name : "2800name", voice_status : "1"}; + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + expect(voicemailId > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + var updateValues = {display_name : "2800name", voice_statuss : "0"}; + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + expect(updateCode == -1).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("display_name", "2800name"); + map.set("voice_status", "1"); + await voicemailQuery(map, "abnormal_voicemail_delete_test_2800"); + await voiceMailDelete("abnormal_voicemail_delete_test_2800"); + done(); + } catch (error) { + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_update_test_2900 + * @tc.name When update the voicemail status, pass in a non-existent field + * @tc.desc Function test + */ + it("abnormal_voicemail_update_test_2900", 0, async function(done) { + console.info("---------logMessage abnormal_voicemail_update_test_2900 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + try { + var insertValues = {display_name : "2900name", voice_status : "1"}; + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + expect(voicemailId > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("id", voicemailId.toString()); + var updateValues = {display_name : "2900name", voice_statuss : "0"}; + var updateCode = await DAHelper.update(voicemailUri, updateValues, condition); + expect(updateCode == -1).assertTrue(); + var map = new Map(); + map.set("id", voicemailId.toString()); + map.set("display_name", "2900name"); + map.set("voice_status", "1"); + await voicemailQuery(map, "abnormal_voicemail_update_test_2900"); + await voiceMailDelete("abnormal_voicemail_update_test_2900"); + done(); + } catch (error) { + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_update_test_3000 + * @tc.name When update the voicemail status, pass in a non-existent field + * @tc.desc Function test + */ + it("abnormal_voicemail_update_test_3000", 0, async function(done) { + console.info("---------logMessage abnormal_voicemail_update_test_3000 is starting!---------") + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + console.info('logMessage uri = ' + URI_VOICEMAIL) + try { + var insertValues = {display_name : "2900name", voice_status : "1"}; + var voicemailId = await DAHelper.insert(voicemailUri, insertValues); + expect(voicemailId > 0).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.equalTo("ids", voicemailId.toString()); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == -1).assertTrue(); + resultSet.close(); + await voiceMailDelete("abnormal_voicemail_update_test_3000"); + done(); + } catch (error) { + done(); + } + }); + + /** + * @tc.number abnormal_voicemail_batchInsert_test_3100 + * @tc.name Insert voicemail data in batches , pass in a non-existent field + * @tc.desc Function test + */ + it("abnormal_voicemail_batchInsert_test_3100", 0, async function(done) { + console.info("-------------logMessage abnormal_voicemail_batchInsert_test_3100 is starting!-----------"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + + var insertValuesOne = {"voice_status" : "0", "display_name" : "xiaoming"}; + var insertValuesTwo = {"voice_status" : "1", "display_name" : "xiaohei"}; + var insertValuesThree = {"voice_statusss" : "1", "display_name" : "xiaohong"}; + var insertValuesFour = {"voice_status" : "0", "display_name" : "xiaohei"}; + var insertValuesFive = {"voice_status" : "0", "display_name" : "xiaofen"}; + var listAddBluk = []; + listAddBluk[0] = insertValuesOne; + listAddBluk[1] = insertValuesTwo; + listAddBluk[2] = insertValuesThree; + listAddBluk[3] = insertValuesFour; + listAddBluk[4] = insertValuesFive; + try { + var batchInsertCode = await DAHelper.batchInsert(voicemailUri, listAddBluk); + console.info("logMessage abnormal_voicemail_batchInsert_test_3100: batchInsertCode = " + batchInsertCode); + expect(batchInsertCode == -1).assertTrue(); + var condition = new ohos_data_ability.DataAbilityPredicates(); + var resultColumns = []; + var resultSet = await DAHelper.query(voicemailUri, resultColumns, condition); + expect(resultSet.rowCount == 0).assertTrue(); + resultSet.close(); + done(); + } catch (error) { + console.info("logMessage abnormal_voicemail_batchInsert_test_3100: batchInsert error = " + error); + done(); + } + }); + + afterAll(async function() { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_VOICEMAIL); + console.info('voicemai afterAll logMessage get DAHelper success! DAHelper = ' + DAHelper); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + var deleteCode = await DAHelper.delete(voicemailUri, condition); + console.info('voicemai afterAll logMessage deleteCode = ' + deleteCode); + }); +}) diff --git a/jstest/common.js b/jstest/common.js new file mode 100644 index 0000000..fe5bc92 --- /dev/null +++ b/jstest/common.js @@ -0,0 +1,705 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const contactUri = "dataability:///com.ohos.contactsdataability/contacts/contact"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +const groupUri = "dataability:///com.ohos.contactsdataability/contacts/groups"; +const contactBlocklistUri = "dataability:///com.ohos.contactsdataability/contacts/contact_blocklist"; +const deletedRawContactUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; +const profileRawContactUri = "dataability:///com.ohos.contactsdataability/profile/raw_contact"; +const profilecontactUri = "dataability:///com.ohos.contactsdataability/profile/contact"; +const profileContactDataUri = "dataability:///com.ohos.contactsdataability/profile/contact_data"; +const profileGroupUri = "dataability:///com.ohos.contactsdataability/profile/groups"; +const profileBlocklistUri = "dataability:///com.ohos.contactsdataability/profile/contact_blocklist"; +const profileDeletedContactsUri = "dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact"; + +const URI_CALLLOG = "dataability:///com.ohos.calllogability"; +const calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; + +export default { + data: {}, + getCallLogInsertMap: + function() { + var calllog_insert_100_map = new Map([ + [ "phone_number", "123456789" ], [ "display_name", "xxw" ], [ "voicemail_uri", "uri" ], + [ "sim_type", "1" ], [ "is_hd", "2" ], [ "is_read", "1" ], [ "ring_duration", "900" ], + [ "talk_duration", "200" ], [ "format_number", "123 456 789" ], [ "quicksearch_key", "2" ], + [ "number_type", "2" ], [ "number_type_name", "tian" ], [ "begin_time", "200" ], [ "end_time", "300" ], + [ "answer_state", "1" ], [ "create_time", "400" ], [ "number_location", "dizhi" ], [ "photo_id", "1" ], + [ "photo_uri", "666" ], [ "country_iso_code", "2" ], [ "extra1", "test1" ], [ "extra2", "test2" ], + [ "extra3", "test3" ], [ "extra4", "test4" ], [ "extra5", "test5" ], [ "extra6", "test6" ] + ]); + return calllog_insert_100_map; + }, + getCallLogInsert: + function() { + var calllog_insert_100 = { + "phone_number" : "123456789", + "display_name" : "xxw", + "voicemail_uri" : "uri", + "sim_type" : 1, + "is_hd" : 2, + "is_read" : 1, + "ring_duration" : 900, + "talk_duration" : 200, + "format_number" : "123 456 789", + "quicksearch_key" : "2", + "number_type" : 2, + "number_type_name" : "tian", + "begin_time" : 200, + "end_time" : 300, + "answer_state" : 1, + "create_time" : 400, + "number_location" : "dizhi", + "photo_id" : 1, + "photo_uri" : "666", + "country_iso_code" : 2, + "extra1" : "test1", + "extra2" : "test2", + "extra3" : "test3", + "extra4" : "test4", + "extra5" : "test5", + "extra6" : "test6", + }; + return calllog_insert_100; + }, + getCallLogResultColumns: + function() { + var resultColumns = [ + "id", "phone_number", "display_name", "call_direction", "voicemail_uri", "sim_type", "is_hd", "is_read", + "ring_duration", "talk_duration", "format_number", "quicksearch_key", "number_type", "number_type_name", + "begin_time", "end_time", "answer_state", "create_time", "number_location", "photo_id", "photo_uri", + "country_iso_code", "extra1", "extra2", "extra3", "extra4", "extra5", "extra6" + ]; + return resultColumns; + }, + getCallLogUpdate: + function() { + var updateValues = { + "phone_number" : "987654321", + "display_name" : "6666", + "voicemail_uri" : "7777", + "sim_type" : 4, + "is_hd" : 4, + "is_read" : 4, + "ring_duration" : 400, + "talk_duration" : 400, + "format_number" : "987 654 321", + "quicksearch_key" : "4", + "number_type" : 4, + "number_type_name" : "4tian", + "begin_time" : 400, + "end_time" : 400, + "answer_state" : 4, + "create_time" : 40000, + "number_location" : "4dizhi", + "photo_id" : 4, + "photo_uri" : "4444", + "country_iso_code" : 4, + "extra1" : "test7", + "extra2" : "test7", + "extra3" : "test7", + "extra4" : "test7", + "extra5" : "test7", + "extra6" : "test7", + }; + return updateValues; + }, + getCallLogUpdateMap: + function() { + var calllog_insert_100_map = new Map([ + [ "phone_number", "987654321" ], [ "display_name", "6666" ], [ "voicemail_uri", "7777" ], + [ "sim_type", "4" ], [ "is_hd", "4" ], [ "is_read", "4" ], [ "ring_duration", "400" ], + [ "talk_duration", "400" ], [ "format_number", "987 654 321" ], [ "quicksearch_key", "4" ], + [ "number_type", "4" ], [ "number_type_name", "4tian" ], [ "begin_time", "400" ], [ "end_time", "400" ], + [ "answer_state", "4" ], [ "create_time", "40000" ], [ "number_location", "4dizhi" ], + [ "photo_id", "4" ], [ "photo_uri", "4444" ], [ "country_iso_code", "4" ], [ "extra1", "test7" ], + [ "extra2", "test7" ], [ "extra3", "test7" ], [ "extra4", "test7" ], [ "extra5", "test7" ], + [ "extra6", "test7" ] + ]); + return calllog_insert_100_map; + }, + getCallLogBatchInsert: + function() { + var map = new Map([ [ "phone_number", "1600" ], [ "ring_duration", "333" ] ]); + var map2 = new Map([ [ "phone_number", "1600" ], [ "ring_duration", "600" ] ]); + var map3 = new Map([ [ "phone_number", "1600" ], [ "ring_duration", "600" ] ]); + var map4 = new Map([ [ "phone_number", "1600" ], [ "ring_duration", "600" ] ]); + var map5 = new Map([ [ "phone_number", "1600" ], [ "ring_duration", "600" ] ]); + var array = [ map, map2, map3, map4, map5 ]; + return array; + }, + getProfileRawContact: + function() { + var rawContact = { + "photo_id" : 2, + "photo_file_id" : 3, + "is_transfer_voicemail" : 1, + "personal_ringtone" : "test", + "is_deleted" : 0, + "personal_notification_ringtone" : "666", + "photo_first_name" : "7777", + "account_id" : 1, + "version" : 1, + "sort" : "6666", + "contacted_count" : 2, + "lastest_contacted_time" : 2, + "favorite" : 1, + "favorite_order" : "test", + "phonetic_name" : "testname", + "phonetic_name_type" : 1, + "display_name" : "licheng", + "company" : "TTTTT", + "position" : "Developer", + "read_only" : 2, + "sort_first_letter" : "testsort", + "sync_id" : 8, + "syn_1" : "syn_1", + "syn_2" : "syn_2", + "syn_3" : "syn_3", + }; + return rawContact; + }, + getProfileRawContactMap: + function() { + var rawContactMap = new Map([ + [ "photo_id", "2" ], [ "photo_file_id", "3" ], [ "is_transfer_voicemail", "1" ], + [ "personal_ringtone", "test" ], [ "is_deleted", "0" ], + [ + "personal_notification_ringtone", + "666", + ], + [ + "photo_first_name", + "7777", + ], + [ "account_id", "1" ], [ "version", "1" ], [ "sort", "6666" ], [ "contacted_count", "2" ], + [ "lastest_contacted_time", "2" ], [ "favorite", "1" ], [ "favorite_order", "test" ], + [ "phonetic_name", "testname" ], [ "phonetic_name_type", "1" ], [ "display_name", "licheng" ], + [ "company", "TTTTT" ], [ "position", "Developer" ], [ "read_only", "2" ], + [ "sort_first_letter", "testsort" ], [ "merge_mode", "0" ], [ "is_need_merge", "1" ], + [ "merge_status", "1" ], [ "is_merge_target", "0" ], [ "vibration_setting", "0" ], [ "sync_id", "8" ], + [ "syn_1", "syn_1" ], [ "syn_2", "syn_2" ], [ "syn_3", "syn_3" ] + ]); + return rawContactMap; + }, + getProfileRawContactUpdate: + function() { + var rawContact = { + "photo_id" : 21, + "photo_file_id" : 31, + "is_transfer_voicemail" : 11, + "personal_ringtone" : "test1", + "is_deleted" : 0, + "personal_notification_ringtone" : "6661", + "photo_first_name" : "77771", + "account_id" : 1, + "sort" : "66661", + "contacted_count" : 21, + "lastest_contacted_time" : 21, + "favorite" : 11, + "favorite_order" : "test1", + "phonetic_name" : "testname1", + "phonetic_name_type" : 11, + "display_name" : "licheng1", + "company" : "TTTTT1", + "position" : "Developer1", + "read_only" : 21, + "sort_first_letter" : "testsort1", + "sync_id" : 81, + "syn_1" : "syn_11", + "syn_2" : "syn_21", + "syn_3" : "syn_31", + }; + return rawContact; + }, + getProfileRawContactUpdateMap: + function() { + var rawContactMap = new Map([ + [ "photo_id", "21" ], [ "photo_file_id", "31" ], [ "is_transfer_voicemail", "11" ], + [ "personal_ringtone", "test1" ], [ "is_deleted", "0" ], + [ + "personal_notification_ringtone", + "6661", + ], + [ + "photo_first_name", + "77771", + ], + [ "account_id", "1" ], [ "version", "1" ], [ "sort", "66661" ], [ "contacted_count", "21" ], + [ "lastest_contacted_time", "21" ], [ "favorite", "11" ], [ "favorite_order", "test1" ], + [ "phonetic_name", "testname1" ], [ "phonetic_name_type", "11" ], [ "display_name", "licheng1" ], + [ "company", "TTTTT1" ], [ "position", "Developer1" ], [ "read_only", "21" ], + [ "sort_first_letter", "testsort1" ], [ "merge_mode", "0" ], [ "is_need_merge", "1" ], + [ "merge_status", "1" ], [ "is_merge_target", "0" ], [ "vibration_setting", "0" ], [ "sync_id", "81" ], + [ "syn_1", "syn_11" ], [ "syn_2", "syn_21" ], [ "syn_3", "syn_31" ] + ]); + return rawContactMap; + }, + getProfileContactData: + function() { + var contactData = { + "content_type" : "name", + "detail_info" : "xiaocai", + "family_name" : "family_name", + "middle_name_phonetic" : "middle_name_phonetic", + "given_name" : "given_name", + "given_name_phonetic" : "given_name_phonetic", + "alias_detail_info" : "alias_detail_info", + "phonetic_name" : "phonetic_name", + "position" : "Developer", + "extend1" : "extend1", + "extend2" : "extend2", + "extend3" : "extend3", + "extend4" : "extend4", + "city" : "city", + "country" : "country", + "neighborhood" : "neighborhood", + "pobox" : "pobox", + "postcode" : "postcode", + "region" : "region", + "street" : "street", + "alpha_name" : "alpha_name", + "other_lan_last_name" : "other_lan_last_name", + "other_lan_first_name" : "other_lan_first_name", + "extend5" : "extend5", + "lan_style" : "lan_style", + "custom_data" : "custom_data", + "extend6" : "extend6", + "extend7" : "extend7", + "blob_data" : "blob_data", + "syn_1" : "syn_1", + "syn_2" : "syn_2", + "syn_3" : "syn_3", + }; + return contactData; + }, + getProfileContactDataMap: + function() { + var ContactDataMap = new Map([ + [ "detail_info", "xiaocai" ], [ "family_name", "family_name" ], + [ "middle_name_phonetic", "middle_name_phonetic" ], [ "given_name", "given_name" ], + [ "given_name_phonetic", "given_name_phonetic" ], [ "alias_detail_info", "alias_detail_info" ], + [ "phonetic_name", "phonetic_name" ], [ "position", "position" ], [ "extend1", "extend1" ], + [ "extend2", "extend2" ], [ "pobox", "pobox" ], [ "postcode", "postcode" ], [ "city", "city" ], + [ "country", "country" ], [ "neighborhood", "neighborhood" ], + [ + "position", + "Developer", + ], + [ "region", "region" ], [ "street", "street" ], [ "alpha_name", "alpha_name" ], + [ "other_lan_last_name", "other_lan_last_name" ], [ "other_lan_first_name", "other_lan_first_name" ], + [ "extend5", "extend5" ], [ "lan_style", "lan_style" ], [ "custom_data", "custom_data" ], + [ "extend6", "extend6" ], [ "extend7", "extend7" ], [ "blob_data", "blob_data" ], [ "syn_1", "syn_1" ], + [ + "syn_2", + "syn_2", + ], + [ + "syn_3", + "syn_3", + ], + [ "read_only", "0" ], [ "version", "0" ], [ "is_preferred_number", "0" ] + ]); + return ContactDataMap; + }, + getProfileContactDataUpdate: + function() { + var contactData = { + "detail_info" : "xiaocai1", + "family_name" : "family_name1", + "middle_name_phonetic" : "middle_name_phonetic1", + "given_name" : "given_name1", + "given_name_phonetic" : "given_name_phonetic1", + "alias_detail_info" : "alias_detail_info1", + "phonetic_name" : "phonetic_name1", + "position" : "Developer1", + "extend1" : "extend11", + "extend2" : "extend21", + "extend3" : "extend31", + "extend4" : "extend41", + "city" : "city1", + "country" : "country1", + "neighborhood" : "neighborhood1", + "pobox" : "pobox1", + "postcode" : "postcode1", + "region" : "region1", + "street" : "street1", + "alpha_name" : "alpha_name1", + "other_lan_last_name" : "other_lan_last_name1", + "other_lan_first_name" : "other_lan_first_name1", + "extend5" : "extend51", + "lan_style" : "lan_style1", + "custom_data" : "custom_data1", + "extend6" : "extend61", + "extend7" : "extend71", + "blob_data" : "blob_data1", + "syn_1" : "syn_11", + "syn_2" : "syn_21", + "syn_3" : "syn_31", + }; + return contactData; + }, + getProfileContactDataUpdateMap: + function() { + var ContactDataMap = new Map([ + [ "detail_info", "xiaocai1" ], [ "family_name", "family_name1" ], + [ "middle_name_phonetic", "middle_name_phonetic1" ], [ "given_name", "given_name1" ], + [ "given_name_phonetic", "given_name_phonetic1" ], [ "alias_detail_info", "alias_detail_info1" ], + [ "phonetic_name", "phonetic_name1" ], [ "position", "position1" ], [ "extend1", "extend11" ], + [ "extend2", "extend21" ], [ "pobox", "pobox1" ], [ "postcode", "postcode1" ], [ "city", "city1" ], + [ "country", "country1" ], [ "neighborhood", "neighborhood1" ], + [ + "position", + "Developer1", + ], + [ "region", "region1" ], [ "street", "street1" ], [ "alpha_name", "alpha_name1" ], + [ "other_lan_last_name", "other_lan_last_name1" ], [ "other_lan_first_name", "other_lan_first_name1" ], + [ "extend5", "extend51" ], [ "lan_style", "lan_style1" ], [ "custom_data", "custom_data1" ], + [ "extend6", "extend61" ], [ "extend7", "extend71" ], [ "blob_data", "blob_data1" ], + [ "syn_1", "syn_11" ], + [ + "syn_2", + "syn_21", + ], + [ + "syn_3", + "syn_31", + ], + [ "read_only", "0" ], [ "version", "1" ], [ "is_preferred_number", "0" ] + ]); + return ContactDataMap; + }, + getProfileGroup: + function() { + var group = { + "account_id" : 1, + "group_name" : "DeveloperFirsthGroup", + "group_notes" : "note", + "group_ringtone" : "test" + }; + return group; + }, + getProfileGroupMap: + function() { + var groupMap = new Map([ + [ "account_id", "1" ], [ "group_name", "DeveloperFirsthGroup" ], [ "group_notes", "note" ], + [ "is_deleted", "0" ], [ "group_ringtone", "test" ], [ "ringtone_modify_time", "0" ], + [ "lastest_modify_time", "0" ] + ]); + return groupMap; + }, + getProfileBlockList: + function() { + var blockList = {"phone_number" : "123456789", "content" : "heimingdan"}; + return blockList; + }, + getProfileBlockListMap: + function() { + var blockListMap = new Map([ + [ "types", "0" ], [ "phone_number", "123456789" ], [ "content", "heimingdan" ], [ "time_stamp", "0" ] + ]); + return blockListMap; + }, + getProfileUpdateRawContact: + function() { + var rawContact = { + "photo_id" : 8, + "photo_file_id" : 8, + "is_transfer_voicemail" : 8, + "personal_ringtone" : "test8", + "is_deleted" : 1, + "personal_notification_ringtone" : "888", + "photo_first_name" : "9999", + "account_id" : 8, + "version" : 2, + "sort" : "8888", + "contacted_count" : 8, + "lastest_contacted_time" : 8, + "favorite" : 0, + "favorite_order" : "test8", + "phonetic_name" : "testname8", + "phonetic_name_type" : 8, + "display_name" : "licheng8", + "company" : "TTTTT8", + "position" : "Developer8", + "read_only" : 8, + "sort_first_letter" : "testsort8", + "sync_id" : 888, + "syn_1" : "syn_8", + "syn_2" : "syn_8", + "syn_3" : "syn_8", + }; + return rawContact; + }, + getProfileUpdateRawContactMap: + function() { + var rawContactMap = new Map([ + [ "photo_id", "8" ], [ "photo_file_id", "8" ], [ "is_transfer_voicemail", "8" ], + [ "personal_ringtone", "test8" ], [ "is_deleted", "1" ], + [ + "personal_notification_ringtone", + "888", + ], + [ + "photo_first_name", + "9999", + ], + [ "account_id", "8" ], [ "version", "2" ], [ "sort", "8888" ], [ "contacted_count", "8" ], + [ "lastest_contacted_time", "8" ], [ "favorite", "0" ], [ "favorite_order", "test8" ], + [ "phonetic_name", "testname8" ], [ "phonetic_name_type", "8" ], [ "display_name", "licheng8" ], + [ "company", "TTTTT8" ], [ "position", "Developer8" ], [ "read_only", "8" ], + [ "sort_first_letter", "testsort8" ], [ "merge_mode", "0" ], [ "is_need_merge", "1" ], + [ "merge_status", "1" ], [ "is_merge_target", "0" ], [ "vibration_setting", "0" ], [ "sync_id", "888" ], + [ "syn_1", "syn_8" ], [ "syn_2", "syn_8" ], [ "syn_3", "syn_8" ] + ]); + return rawContactMap; + }, + getProfileUpdateContactData: + function() { + var contactData = { + "detail_info" : "BossCai", + "family_name" : "family_name8", + "middle_name_phonetic" : "middle_name_phonetic8", + "given_name" : "given_name8", + "given_name_phonetic" : "given_name_phonetic8", + "alias_detail_info" : "alias_detail_info8", + "phonetic_name" : "phonetic_name8", + "position" : "position8", + "extend1" : "extend8", + "extend2" : "extend8", + "extend3" : "extend8", + "extend4" : "extend8", + "country" : "country8", + "neighborhood" : "neighborhood8", + "pobox" : "pobox8", + "city" : "city8", + "postcode" : "postcode8", + "region" : "region8", + "street" : "street8", + "alpha_name" : "alpha_name8", + "other_lan_last_name" : "other_lan_last_name8", + "other_lan_first_name" : "other_lan_first_name8", + "extend5" : "extend8", + "lan_style" : "lan_style8", + "custom_data" : "custom_data8", + "extend6" : "extend8", + "extend7" : "extend8", + "blob_data" : "blob_data8", + "syn_1" : "syn_8", + "syn_2" : "syn_8", + "syn_3" : "syn_8" + }; + return contactData; + }, + getProfileUpdateContactDataMap: + function() { + var ContactDataMap = new Map([ + [ "detail_info", "BossCai" ], [ "family_name", "family_name8" ], + [ "middle_name_phonetic", "middle_name_phonetic8" ], [ "given_name", "given_name8" ], + [ "given_name_phonetic", "given_name_phonetic8" ], [ "alias_detail_info", "alias_detail_info8" ], + [ "phonetic_name", "phonetic_name8" ], [ "position", "position8" ], [ "extend1", "extend8" ], + [ "extend2", "extend8" ], [ "pobox", "pobox8" ], [ "postcode", "postcode8" ], [ "city", "city8" ], + [ "country", "country8" ], [ "neighborhood", "neighborhood8" ], + [ + "position", + "position8", + ], + [ "region", "region8" ], [ "street", "street8" ], [ "alpha_name", "alpha_name8" ], + [ "other_lan_last_name", "other_lan_last_name8" ], [ "other_lan_first_name", "other_lan_first_name8" ], + [ "extend5", "extend8" ], [ "lan_style", "lan_style8" ], [ "custom_data", "custom_data8" ], + [ "extend6", "extend8" ], [ "extend7", "extend8" ], [ "blob_data", "blob_data8" ], [ "syn_1", "syn_8" ], + [ + "syn_2", + "syn_8", + ], + [ + "syn_3", + "syn_8", + ], + [ "read_only", "0" ], [ "version", "1" ], [ "is_preferred_number", "0" ] + ]); + return ContactDataMap; + }, + getProfileUpdateGroup: + function() { + var group = { + "account_id" : 8, + "group_name" : "TestFifthGroup", + "group_notes" : "note8", + "group_ringtone" : "test8" + }; + return group; + }, + getProfileUpdateGroupMap: + function() { + var groupMap = new Map([ + [ "account_id", "8" ], [ "group_name", "TestFifthGroup" ], [ "group_notes", "note8" ], + [ "is_deleted", "0" ], [ "group_ringtone", "test8" ], [ "ringtone_modify_time", "0" ], + [ "lastest_modify_time", "0" ] + ]); + return groupMap; + }, + getProfileUpdateBlockList: + function() { + var blockList = { + "phone_number" : "987654321", + "content" : "danminghei", + }; + return blockList; + }, + getProfileUpdateBlockListMap: + function() { + var blockListMap = new Map([ + [ "types", "0" ], [ "phone_number", "987654321" ], [ "content", "danminghei" ], [ "time_stamp", "0" ] + ]); + return blockListMap; + }, + getVoiceMail: + function() { + var voicemail = { + "phone_number" : "66666", + "quicksearch_key" : "777", + "display_name" : "xiaoli", + "voicemail_uri" : "XXXX", + "origin_type" : "xxxxx", + "create_time" : 0 + }; + return voicemail; + }, + getVoiceMailMap: + function() { + var map = new Map([ + [ "phone_number", "66666" ], [ "quicksearch_key", "777" ], [ "display_name", "xiaoli" ], + [ "voicemail_uri", "XXXX" ], [ "origin_type", "xxxxx" ], [ "create_time", "0" ], + [ "voicemail_type", "0" ], [ "voice_file_size", "0" ], [ "voice_duration", "0" ], + [ "voice_status", "0" ] + ]); + return map; + }, + getVoiceMailUpdate: + function() { + var voicemail = { + "phone_number" : "9999999", + "quicksearch_key" : "999", + "display_name" : "xiaocai", + "voicemail_uri" : "uuuu", + "origin_type" : "iiiii", + "create_time" : "999" + }; + return voicemail; + }, + getVoiceMailUpdateMap: + function() { + var map = new Map([ + [ "phone_number", "9999999" ], [ "quicksearch_key", "999" ], [ "display_name", "xiaocai" ], + [ "voicemail_uri", "uuuu" ], [ "origin_type", "iiiii" ], [ "create_time", "999" ], + [ "voicemail_type", "0" ], [ "voice_file_size", "0" ], [ "voice_duration", "0" ], + [ "voice_status", "0" ] + ]); + return map; + }, + getvoiceMailBatchInsert: + function() { + var map = new Map([ [ "phone_number", "1600" ], [ "display_name", "xiaoming" ], [ "voice_status", "0" ] ]); + var map2 = new Map([ [ "phone_number", "1600" ], [ "display_name", "xiaohei" ], [ "voice_status", "1" ] ]); + var map3 = new Map([ [ "phone_number", "1600" ], [ "display_name", "xiaohong" ], [ "voice_status", "0" ] ]); + var map4 = new Map([ [ "phone_number", "1600" ], [ "display_name", "xiaohei" ], [ "voice_status", "0" ] ]); + var map5 = new Map([ [ "phone_number", "1600" ], [ "display_name", "xiaofen" ], [ "voice_status", "0" ] ]); + var array = [ map, map2, map3, map4, map5 ]; + return array; + }, + getContactBatchCompany: + function() { + var rawContactValuesOne = {"display_name" : "fengyuanyuan", "company" : "TT4900", "position" : "Testers"}; + var rawContactValuesTwo = {"display_name" : "caiboss", "company" : "TT4900", "position" : "developer"}; + var rawContactValuesThree = {"display_name" : "zhangsan", "company" : "TT4900", "position" : "developer"}; + var rawContactValuesFour = {"display_name" : "lisi", "company" : "TT4900", "position" : "developer"}; + var rawContactValuesFive = {"display_name" : "wangwu", "company" : "TT4900", "position" : "developer"}; + var listAddBluk = []; + listAddBluk[0] = rawContactValuesOne; + listAddBluk[1] = rawContactValuesTwo; + listAddBluk[2] = rawContactValuesThree; + listAddBluk[3] = rawContactValuesFour; + listAddBluk[4] = rawContactValuesFive; + return listAddBluk; + }, + getContactBatchCompanyTwo: + function() { + var contactDataValuesOne = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xiaozhi" + }; + var contactDataValuesTwo = { + "raw_contact_id" : rawContactId, + "content_type" : "organization", + "detail_info" : "TT", + "position" : "Testers" + }; + var contactDataValuesThree = { + "raw_contact_id" : rawContactId, + "content_type" : "email", + "detail_info" : "15844@163.com" + }; + var contactDataValuesFour = { + "raw_contact_id" : rawContactId, + "content_type" : "nickname", + "detail_info" : "xiaozhicheng" + }; + var contactDataValuesFive = { + "raw_contact_id" : rawContactId, + "content_type" : "phone", + "detail_info" : "111885566" + }; + var listAddBluk = []; + listAddBluk[0] = contactDataValuesOne; + listAddBluk[1] = contactDataValuesTwo; + listAddBluk[2] = contactDataValuesThree; + listAddBluk[3] = contactDataValuesFour; + listAddBluk[4] = contactDataValuesFive; + return listAddBluk; + }, + getPhoneNumberBatch: + function() { + var contactBlacklistValuesOne = {"phone_number" : "85525040585400"}; + var contactBlacklistValuesTwo = {"phone_number" : "85525040585400"}; + var contactBlacklistValuesThree = {"phone_number" : "85525040585400"}; + var contactBlacklistValuesFour = {"phone_number" : "85525040585400"}; + var contactBlacklistValuesFive = {"phone_number" : "85525040585400"}; + var listAddBluk = [] + listAddBluk[0] = contactBlacklistValuesOne; + listAddBluk[1] = contactBlacklistValuesTwo; + listAddBluk[2] = contactBlacklistValuesThree; + listAddBluk[3] = contactBlacklistValuesFour; + listAddBluk[4] = contactBlacklistValuesFive; + return listAddBluk; + }, + getSearchMap: + function() { + var map = new Map([ + [ "account_id", "1" ], [ "search_name", "小黄||xiaohuang||xh" ], [ "display_name", "小黄" ], + [ "phonetic_name", "" ], [ "photo_id", "" ], [ "photo_file_id", "" ] + ]); + return map; + } + +} \ No newline at end of file diff --git a/jstest/recovery_test.js b/jstest/recovery_test.js new file mode 100644 index 0000000..71080fc --- /dev/null +++ b/jstest/recovery_test.js @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2021 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. + */ + +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it} from 'deccjsunit/index' + +import common from './common.js'; + +const URI_CONTACTS = "dataability:///com.ohos.contactsdataability"; +const rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +const backup = "dataability:///com.ohos.contactsdataability/contacts/backup"; +const recover = "dataability:///com.ohos.contactsdataability/contacts/recover"; +const deletedUri = "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + +describe('RecoveryTest', function() { + function sleep(numberMillis) + { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } + } + + async function ContactsQuery(tag, uri, size) + { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info(tag + ': ContactsQuery start ! DAHelper = ' + DAHelper); + var resultColumns = []; + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + try { + var resultSet = await DAHelper.query(uri, resultColumns, condition); + console.info(tag + ' ContactsQuery resultSet.rowCount is = ' + resultSet.rowCount); + console.info(tag + ' ContactsQuery size is = ' + size); + expect(resultSet.rowCount == size).assertEqual(true); + if (resultSet.rowCount > 0) { + if (resultSet.goToFirstRow()) { + do { + var id = resultSet.getString(resultSet.getColumnIndex("id")); + console.info(tag + ':logMessage contactsQuery id = ' + id); + var name = resultSet.getString(resultSet.getColumnIndex("display_name")); + console.info(tag + ':logMessage contactsQuery name = ' + name); + } while (resultSet.goToNextRow()) + } + } + resultSet.close(); + } catch (error) { + console.info(tag + "logMessage ContactsQuery: error = " + error); + } + } + + async function rawContactInsert(name) + { + console.info("------logMessage rawContactInsert is starting!-----"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + console.info('logMessage get DAHelper success! DAHelper = ' + DAHelper); + var insertValue = { + "display_name" : name, + } + try { + var rawContactId = await DAHelper.insert(rawContactUri, insertValue); + console.info('logMessage rawContactInsert: rawContactId = ' + rawContactId); + expect(rawContactId > 0).assertTrue(); + } catch (error) { + console.info('logMessage rawContactInsert: insert error = ' + error); + } + return rawContactId; + } + + async function deleteRawContact(tag) + { + try { + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var condition = new ohos_data_ability.DataAbilityPredicates(); + condition.greaterThan("id", "0"); + condition.and(); + condition.equalTo("is_deleted", "0"); + await DAHelper.delete(rawContactUri, condition); + sleep(5000); + var conditionAll = new ohos_data_ability.DataAbilityPredicates(); + conditionAll.greaterThan("id", "0"); + await DAHelper.delete(deletedUri, conditionAll); + } catch (error) { + console.info(tag + ': deleteRawContact error = ' + error); + } + } + + /** + * @tc.number recovery_test_100 + * @tc.name backup database + * @tc.desc Function test + */ + it("recovery_test_100", 0, async function(done) { + await deleteRawContact("recovery_test_100"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var updateValues = {}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + try { + var updateCode = await DAHelper.update(backup, updateValues, condition); + sleep(2000); + console.info('logMessage recovery_test_100: updateCode = ' + updateCode); + expect(updateCode == 0).assertTrue(); + sleep(2000); + await ContactsQuery("recovery_test_100", rawContactUri, 0); + done(); + } catch (error) { + console.info('logMessage recovery_test_100: raw_contact update error = ' + error); + done(); + } + }); + + /** + * @tc.number recovery_test_200 + * @tc.n ame recovery database + * @tc.desc Function test + */ + it("recovery_test_200", 0, async function(done) { + await deleteRawContact("recovery_test_200"); + var DAHelper = featureAbility.acquireDataAbilityHelper(URI_CONTACTS); + var updateValues = {}; + var condition = new ohos_data_ability.DataAbilityPredicates(); + rawContactInsert("liming"); + rawContactInsert("xiaolilili"); + sleep(2000); + var updateCode = await DAHelper.update(backup, updateValues, condition); + sleep(2000); + console.info(' recovery_test_200: backup = ' + updateCode); + expect(updateCode == 0).assertTrue(); + sleep(1000); + try { + var updateCode = await DAHelper.update(recover, updateValues, condition); + sleep(3000); + console.info('logMessage recovery_test_200: recover = ' + updateCode); + expect(updateCode == 0).assertTrue(); + await ContactsQuery("recovery_test_200", rawContactUri, 2); + await deleteRawContact("recovery_test_200"); + done(); + } catch (error) { + console.info('logMessage recovery_test_200: raw_contact update error = ' + error); + done(); + } + }); +}); \ No newline at end of file diff --git a/ohos.build b/ohos.build new file mode 100644 index 0000000..b39f0c1 --- /dev/null +++ b/ohos.build @@ -0,0 +1,18 @@ +{ + "subsystem": "applications", + "parts": { + "contactsdata_hap": { + "module_list": [ + "//applications/standard/contactsdata:contactsdataability", + "//applications/standard/contactsdata/contacts:contactsapi", + "//applications/standard/contactsdata:Contacts_DataAbility" + ], + "system_capabilities":[ + "SystemCapability.Data.DATA_APPDATAMGR" + ], + "test_list": [ + "//applications/standard/contactsdata/test:contacts_test" + ] + } + } +} diff --git a/signature/contactsdata.p7b b/signature/contactsdata.p7b new file mode 100644 index 0000000..353bedd Binary files /dev/null and b/signature/contactsdata.p7b differ diff --git a/test/BUILD.gn b/test/BUILD.gn new file mode 100644 index 0000000..f7fad27 --- /dev/null +++ b/test/BUILD.gn @@ -0,0 +1,108 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") + +## UnitTest contacts_test {{{ +config("test_public_config") { + visibility = [ ":*" ] + include_dirs = [ + "unittest/include", + ] + cflags = [ ] +} + +ohos_unittest("contacts_test") { + module_out_path = "applications/prebuilt_hap" + sources = [ + "unittest/src/base_test.cpp", + "unittest/src/contactability_test.cpp", + "unittest/src/contactgroup_test.cpp", + "unittest/src/contactpinyin_test.cpp", + "unittest/src/contactprofile_test.cpp", + "unittest/src/contactquery_test.cpp", + "unittest/src/mergecontact_test.cpp", + "unittest/src/performance_test.cpp", + "unittest/src/stability_test.cpp", + "unittest/src/calllogability_test.cpp", + "unittest/src/calllogfuzzyquery_test.cpp", + "unittest/src/voicemailability_test.cpp", + "unittest/src/recovery_test.cpp", + ] + deps = [ + "//applications/standard/contactsdata:contactsdataability", + "//third_party/googletest:gtest_main", + "//foundation/aafwk/standard/frameworks/kits/ability/native:abilitykit_native", + "//foundation/ace/napi:ace_napi", + "//foundation/aafwk/standard/frameworks/kits/appkit:appkit_native", + "//utils/native/base:utils", + "//third_party/jsoncpp:jsoncpp", + "//base/notification/ces_standard/frameworks/core:cesfwk_core", + "//base/notification/ces_standard/frameworks/native:cesfwk_innerkits", + "//base/notification/ces_standard/services:cesfwk_services", + "//foundation/aafwk/standard/interfaces/innerkits/want/:want", + "//foundation/distributedschedule/safwk/interfaces/innerkits/safwk:system_ability_fwk", + "//foundation/aafwk/standard/frameworks/kits/ability/native:dummy_classes", + "//foundation/appexecfwk/standard/common:libappexecfwk_common", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//utils/native/base:utilsbase", + ] + include_dirs = [ + "//utils/system/safwk/native/include", + "//utils/native/base/include", + "//base/hiviewdfx/hilog/interfaces/native/innerkits/include", + "//third_party/jsoncpp", + "//third_party/jsoncpp/include/json", + "//base/account/os_account/interfaces/innerkits/include", + "//foundation/aafwk/standard/interfaces/innerkits/want/include", + "//foundation/appexecfwk/standard/kits/appkit/native/app", + "//foundation/aafwk/standard/interfaces/innerkits/want/include/ohos/aafwk/content", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager/include", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler/include", + "//foundation/aafwk/standard/services/abilitymgr/include", + "//foundation/appexecfwk/standard/common/log/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//foundation/aafwk/standard/interfaces/innerkits/base/include/ohos/aafwk/base", + "//foundation/aafwk/standard/frameworks/kits/ability/native/include", + ] + public_configs = [ ":test_public_config" ] + external_deps = [ + "hiviewdfx_hilog_native:libhilog", + "ability_runtime:ability_manager", + "ability_runtime:want", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "eventhandler:libeventhandler", + "ipc:ipc_core", + "native_appdatamgr:native_appdatafwk", + "native_appdatamgr:native_dataability", + "native_appdatamgr:native_preferences", + "native_appdatamgr:native_rdb", + ] +} + +## UnitTest contacts_test }}} + +group("unittest") { + testonly = true + + deps = [] + + deps += [ ":contacts_test" ] +} + + + + diff --git a/test/unittest/include/base_test.h b/test/unittest/include/base_test.h new file mode 100644 index 0000000..dec47fd --- /dev/null +++ b/test/unittest/include/base_test.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTSDATAABILITY_BASE_TEST_H +#define CONTACTSDATAABILITY_BASE_TEST_H + +#include + +#include "calllog_ability.h" +#include "contacts_data_ability.h" +#include "data_ability_result.h" +#include "hilog_wrapper.h" +#include "voicemail_ability.h" + +namespace Contacts { +namespace Test { +class BaseTest : public testing::Test { +public: + BaseTest(); + ~BaseTest(); + OHOS::AppExecFwk::CallLogAbility calllogAbility; + OHOS::AppExecFwk::VoiceMailAbility voicemailAbility; + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + void CheckResultSet(OHOS::NativeRdb::ValuesBucket &rawContactValues, + const std::shared_ptr &resultSet, std::string testName); + void CheckData(OHOS::NativeRdb::ValuesBucket &rawContactValues, + const std::shared_ptr &resultSet, std::string &columnName, + std::string testName); + void CheckResultSetList(std::vector &valuesVector, + std::shared_ptr &resultSet, std::string testName); + OHOS::NativeRdb::ValuesBucket GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr); + int ContactsRand(); + void InitAbility(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTSDATAABILITY_BASE_TEST_H diff --git a/test/unittest/include/calllogability_test.h b/test/unittest/include/calllogability_test.h new file mode 100644 index 0000000..ddb4bd5 --- /dev/null +++ b/test/unittest/include/calllogability_test.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CALLLOGABILITY_TEST_H +#define CALLLOGABILITY_TEST_H + +#include "base_test.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +namespace { +std::mutex mtx_; +} + +class CallLogAsync { +public: + OHOS::NativeRdb::ValuesBucket values; + std::map result; + OHOS::NativeRdb::ValuesBucket updateValues; + int predicatesId; + std::vector> resultSet; + std::vector predicatesQueryId; + int predicatesDeleteId; + CallLogAsync(OHOS::NativeRdb::ValuesBucket &values, std::map &result) + { + this->values = values; + this->result = result; + } + CallLogAsync(OHOS::NativeRdb::ValuesBucket &updateValues, int &predicatesId) + { + this->updateValues = updateValues; + this->predicatesId = predicatesId; + } + + CallLogAsync(std::vector> resultSet, + std::vector predicatesQueryId) + { + this->resultSet = resultSet; + this->predicatesQueryId = predicatesQueryId; + } + + CallLogAsync(int &predicatesDeleteId) + { + this->predicatesDeleteId = predicatesDeleteId; + } + void Insert() + { + OHOS::AppExecFwk::CallLogAbility calllogAbility; + OHOS::Uri callLogUri(CallLogUri::CALL_LOG); + int64_t code = calllogAbility.Insert(callLogUri, this->values); + int callLogId = code; + EXPECT_GT(callLogId, 0); + mtx_.lock(); + this->result.insert(std::map::value_type(callLogId, this->values)); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync Insert---%{public}s", CallLogUri::CALL_LOG); + } + void Update() + { + OHOS::Uri callLogUri(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesId)); + OHOS::AppExecFwk::CallLogAbility calllogAbility; + int resultCode = calllogAbility.Update(callLogUri, this->updateValues, predicates); + EXPECT_EQ(0, resultCode); + HILOG_INFO("--- VoicemailAsync Update---%{public}s", CallLogUri::CALL_LOG); + } + void Query() + { + OHOS::Uri callLogUri(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + int size = this->predicatesQueryId.size(); + for (int i = 0; i < size; i++) { + predicates.EqualTo("id", std::to_string(this->predicatesQueryId[i])); + if (i < size - 1) { + predicates.Or(); + } + } + OHOS::AppExecFwk::CallLogAbility calllogAbility; + std::vector columns; + std::shared_ptr resultSet = + calllogAbility.Query(callLogUri, columns, predicates); + mtx_.lock(); + this->resultSet.push_back(resultSet); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync Query---%{public}s", CallLogUri::CALL_LOG); + } + + void Delete() + { + OHOS::Uri callLogUri(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesDeleteId)); + OHOS::AppExecFwk::CallLogAbility calllogAbility; + int resultCode = calllogAbility.Delete(callLogUri, predicates); + EXPECT_EQ(0, resultCode); + HILOG_INFO("--- VoicemailAsync Delete---%{public}s", CallLogUri::CALL_LOG); + } +}; + +class CalllogAbilityTest : public BaseTest { +public: + CalllogAbilityTest(); + ~CalllogAbilityTest(); + int64_t CalllogInsert(std::string phoneNumber); + int CalllogUpdate(OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates); + int CalllogDelete(OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr CalllogQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + OHOS::NativeRdb::ValuesBucket GetCallLogValues(int columnsStart, int columnsEnd, std::vector &columns); + void GetAllValuesColumn(std::vector &columns); + int64_t CalllogInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t CalllogInsertValue(std::string displayName, OHOS::NativeRdb::ValuesBucket &values); + void ClearCallLog(); +}; +} // namespace Test +} // namespace Contacts +#endif // CALLLOGABILITY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/calllogfuzzyquery_test.h b/test/unittest/include/calllogfuzzyquery_test.h new file mode 100644 index 0000000..2ec2a38 --- /dev/null +++ b/test/unittest/include/calllogfuzzyquery_test.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CALLLOGFUZZYQUERY_TEST_H +#define CALLLOGFUZZYQUERY_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class CalllogFuzzyQueryTest : public BaseTest { +public: + CalllogFuzzyQueryTest(); + ~CalllogFuzzyQueryTest(); + std::shared_ptr CalllogQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + int CalllogDelete(OHOS::NativeRdb::DataAbilityPredicates predicates); + int64_t CalllogInsertValues(OHOS::NativeRdb::ValuesBucket &values); + void ClearCallLog(); +}; +} // namespace Test +} // namespace Contacts +#endif // CALLLOGFUZZYQUERY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/contactability_test.h b/test/unittest/include/contactability_test.h new file mode 100644 index 0000000..655e0dd --- /dev/null +++ b/test/unittest/include/contactability_test.h @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTABILITY_TEST_H +#define CONTACTABILITY_TEST_H + +#include "base_test.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +namespace { +std::mutex mtx_; +} + +class ContactAsync { +public: + OHOS::NativeRdb::ValuesBucket values; + std::map result; + OHOS::NativeRdb::ValuesBucket updateValues; + int predicatesId; + std::vector> resultSet; + std::vector predicatesQueryId; + int predicatesDeleteId; + ContactAsync(OHOS::NativeRdb::ValuesBucket &values, std::map &result) + { + this->values = values; + this->result = result; + } + ContactAsync(OHOS::NativeRdb::ValuesBucket &updateValues, int &predicatesId) + { + this->updateValues = updateValues; + this->predicatesId = predicatesId; + } + + ContactAsync(std::vector> resultSet, + std::vector predicatesQueryId) + { + this->resultSet = resultSet; + this->predicatesQueryId = predicatesQueryId; + } + + ContactAsync(int &predicatesDeleteId) + { + this->predicatesDeleteId = predicatesDeleteId; + } + void Insert() + { + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + int64_t code = contactsDataAbility.Insert(uriRawContact, this->values); + int rawContactId = code; + EXPECT_GT(rawContactId, 0); + mtx_.lock(); + this->result.insert(std::map::value_type(rawContactId, this->values)); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync Insert---%{public}s", ContactsUri::RAW_CONTACT); + } + void Update() + { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesId)); + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + int resultCode = contactsDataAbility.Update(uriRawContact, this->updateValues, predicates); + EXPECT_EQ(0, resultCode); + HILOG_INFO("--- VoicemailAsync Update---%{public}s", ContactsUri::RAW_CONTACT); + } + void Query() + { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::DataAbilityPredicates predicates; + int size = this->predicatesQueryId.size(); + for (int i = 0; i < size; i++) { + predicates.EqualTo("id", std::to_string(this->predicatesQueryId[i])); + if (i < size - 1) { + predicates.Or(); + } + } + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + std::vector columns; + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + mtx_.lock(); + this->resultSet.push_back(resultSet); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync Query---%{public}s", ContactsUri::RAW_CONTACT); + } + + void Delete() + { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesDeleteId)); + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + int resultCode = contactsDataAbility.Delete(uriRawContact, predicates); + EXPECT_EQ(0, resultCode); + HILOG_INFO("--- VoicemailAsync Delete---%{public}s", ContactsUri::RAW_CONTACT); + } +}; + +class ContactAbilityTest : public BaseTest { +public: + static constexpr int SLEEP_TIME = 2; + + ContactAbilityTest(); + ~ContactAbilityTest(); + int64_t RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &alues); + int64_t RawContactExpandInsert( + std::vector valueVector, int isFavorite, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int64_t RawContactLastContactedInsert( + std::string displayName, int lastestContactedTime, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int64_t ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues); + int64_t GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues); + int64_t ContactBlocklistInsert(std::string phoneNumber, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr ContactQuery(const std::string &tableName, + std::vector &columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName); + OHOS::NativeRdb::ValuesBucket GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr); + void GetAllRawContactColumns(std::vector &columnsInt, std::vector &columnsStr); + void GetAllContactDataColumns(std::vector &columnInt, std::vector &columnStr); + void GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr); + void GetAllContactBlocklistColumns(std::vector &columnInt, std::vector &columnStr); + void GetDetailsContactDataColumns(std::vector &columns); + void MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr); + int64_t RawContactInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t ContactDataInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t ContactBlocklistInsertValues(OHOS::NativeRdb::ValuesBucket &values); + std::vector GetBatchList(int64_t rawContactId); + void ClearContacts(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTABILITY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/contactgroup_test.h b/test/unittest/include/contactgroup_test.h new file mode 100644 index 0000000..4da8cc0 --- /dev/null +++ b/test/unittest/include/contactgroup_test.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTGROUP_TEST_H +#define CONTACTGROUP_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class ContactGroupTest : public BaseTest { +public: + ContactGroupTest(); + ~ContactGroupTest(); + int64_t GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues); + int ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr ContactQuery(const std::string &tableName, + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void QueryAndExpectResult(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName); + OHOS::NativeRdb::ValuesBucket GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr); + int64_t GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values); + void GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr); + void MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr); + void ClearData(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTGROUP_TEST_H \ No newline at end of file diff --git a/test/unittest/include/contactpinyin_test.h b/test/unittest/include/contactpinyin_test.h new file mode 100644 index 0000000..350231d --- /dev/null +++ b/test/unittest/include/contactpinyin_test.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTPINYIN_TEST_H +#define CONTACTPINYIN_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class ContactPinyinTest : public BaseTest { +public: + ContactPinyinTest(); + ~ContactPinyinTest(); + int64_t RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &alues); + int64_t ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues); + std::shared_ptr ContactQuery(const std::string &tableName, + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName); + void ClearData(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTPINYIN_TEST_H \ No newline at end of file diff --git a/test/unittest/include/contactprofile_test.h b/test/unittest/include/contactprofile_test.h new file mode 100644 index 0000000..eebc3a0 --- /dev/null +++ b/test/unittest/include/contactprofile_test.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTPROFILE_TEST_H +#define CONTACTPROFILE_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class ContactProfileTest : public BaseTest { +public: + static constexpr int SLEEP_TIME = 2; + + ContactProfileTest(); + ~ContactProfileTest(); + int64_t RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &alues); + int64_t RawContactExpandInsert( + std::vector valueVector, int isFavorite, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int64_t RawContactLastContactedInsert( + std::string displayName, int lastestContactedTime, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int64_t ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues); + int64_t GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues); + int64_t ContactBlocklistInsert(std::string phoneNumber, OHOS::NativeRdb::ValuesBucket &rawContactValues); + int ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates); + int ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr ContactQuery(const std::string &tableName, + std::vector &columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName); + OHOS::NativeRdb::ValuesBucket GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr); + void GetAllRawContactColumns(std::vector &columnsInt, std::vector &columnsStr); + void GetAllContactDataColumns(std::vector &columnInt, std::vector &columnStr); + void GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr); + void GetAllContactBlocklistColumns(std::vector &columnInt, std::vector &columnStr); + void GetDetailsContactDataColumns(std::vector &columns); + void MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr); + int64_t RawContactInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t ContactDataInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t ContactBlocklistInsertValues(OHOS::NativeRdb::ValuesBucket &values); + std::vector GetBatchList(int64_t rawContactId); + void ClearContacts(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTPROFILE_TEST_H \ No newline at end of file diff --git a/test/unittest/include/contactquery_test.h b/test/unittest/include/contactquery_test.h new file mode 100644 index 0000000..2fb126d --- /dev/null +++ b/test/unittest/include/contactquery_test.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTQUERY_TEST_H +#define CONTACTQUERY_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class ContactQueryTest : public BaseTest { +public: + ContactQueryTest(); + ~ContactQueryTest(); + int64_t RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &alues); + int64_t ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues); + std::shared_ptr ContactQuery(const std::string &tableName, + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void ClearData(); +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTQUERY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/mergecontact_test.h b/test/unittest/include/mergecontact_test.h new file mode 100644 index 0000000..8327612 --- /dev/null +++ b/test/unittest/include/mergecontact_test.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MERGECONTACT_TEST_H +#define MERGECONTACT_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class MergeContactTest : public BaseTest { +public: + int64_t RawContactInsert(std::string displayName); + int64_t ContactDataInsert( + int64_t rawContactId, std::string contentType, std::string detailInfo, std::string position); + std::shared_ptr ContactQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + void CheckMergeResultId(std::vector ids, bool isMerge); + int GetMergeResultContactId(const std::shared_ptr resultSet); + std::vector GetMergeResultRawContactId(const std::shared_ptr resultSet); + std::vector GetMergeRawContactId(const std::shared_ptr resultSet); + void DeleteRawContact(); +}; +} // namespace Test +} // namespace Contacts +#endif // MERGECONTACT_TEST_H \ No newline at end of file diff --git a/test/unittest/include/performance_test.h b/test/unittest/include/performance_test.h new file mode 100644 index 0000000..f860517 --- /dev/null +++ b/test/unittest/include/performance_test.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef PERFORMANCE_TEST_H +#define PERFORMANCE_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class PerformanceTest : public BaseTest { +public: + static constexpr int TIME_USEC_CALL_LOG_INSERT = 100000000; + static constexpr int TIME_USEC_CALL_LOG_UPDATE = 3000000; + static constexpr int TIME_USEC_CALL_LOG_QUERY = 5000000; + static constexpr int TIME_USEC_CALL_LOG_DELETED = 700000; + + static constexpr int TIME_USEC_VOICEMAIL_INSERT = 100000000; + static constexpr int TIME_USEC_VOICEMAIL_UPDATE = 300000; + static constexpr int TIME_USEC_VOICEMAIL_QUERY = 5000000; + static constexpr int TIME_USEC_VOICEMAIL_DELETED = 700000; + + static constexpr int TIME_USEC_RAW_CONTACT_INSERT = 110000000; + static constexpr int TIME_USEC_RAW_CONTACT_UPDATE = 3000000; + static constexpr int TIME_USEC_RAW_CONTACT_QUERY = 5000000; + static constexpr int TIME_USEC_RAW_CONTACT_DELETED = 8000000; + + static constexpr int TIME_USEC_CONTACT_DATA_INSERT = 75000000; + static constexpr int TIME_USEC_CONTACT_DATA_UPDATE = 40000000; + static constexpr int TIME_USEC_CONTACT_DATA_QUERY = 7000000; + static constexpr int TIME_USEC_CONTACT_DATA_DELETED = 40000000; + + PerformanceTest(); + ~PerformanceTest(); + long long GetCurrentTime(); + int CalcTime(long long startTime, long long endTime); + void DeleteContact(); +}; +} // namespace Test +} // namespace Contacts +#endif // PERFORMANCE_TEST_H \ No newline at end of file diff --git a/test/unittest/include/recovery_test.h b/test/unittest/include/recovery_test.h new file mode 100644 index 0000000..76fd2d1 --- /dev/null +++ b/test/unittest/include/recovery_test.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef RECOVERY_TEST_H +#define RECOVERY_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class RecoveryTest : public BaseTest { +public: + int64_t RawContactInsert(std::string displayName); + void ClearData(); +}; +} // namespace Test +} // namespace Contacts +#endif // RECOVERY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/stability_test.h b/test/unittest/include/stability_test.h new file mode 100644 index 0000000..3404cfa --- /dev/null +++ b/test/unittest/include/stability_test.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef STABILITY_TEST_H +#define STABILITY_TEST_H + +#include "base_test.h" + +namespace Contacts { +namespace Test { +class StabilityTest : public BaseTest { +public: + StabilityTest(); + ~StabilityTest(); + void DeleteContact(); +}; +} // namespace Test +} // namespace Contacts +#endif // STABILITY_TEST_H \ No newline at end of file diff --git a/test/unittest/include/test_common.h b/test/unittest/include/test_common.h new file mode 100644 index 0000000..dd2408d --- /dev/null +++ b/test/unittest/include/test_common.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef CONTACTSDATAABILITY_URI_COMMON_H +#define CONTACTSDATAABILITY_URI_COMMON_H + +namespace Contacts { +namespace Test { +class ContactTabName { +public: + ~ContactTabName(); + static constexpr const char *RAW_CONTACT = "raw_contact"; + static constexpr const char *CONTACT_DATA = "contact_data"; + static constexpr const char *CONTACT = "contact"; + static constexpr const char *GROUPS = "groups"; + static constexpr const char *CONTACT_BLOCKLIST = "contact_blocklist"; + static constexpr const char *DELETED_RAW_CONTACT = "deleted_raw_contact"; + static constexpr const char *DELETED_RAW_CONTACT_RECORD = "deleted_raw_contact_record"; + static constexpr const char *SEARCH_CONTACT = "search_contact"; +}; + +class CallLogUri { +public: + ~CallLogUri(); + static constexpr const char *CALL_LOG = "dataability:///com.ohos.calllogability/calls/calllog"; + static constexpr const char *ERROR_URI = "dataability:///com.ohos.calllogability/calls/calllogs"; +}; + +class VoicemailUri { +public: + ~VoicemailUri(); + static constexpr const char *VOICEMAIL = "dataability:///com.ohos.voicemailability/calls/voicemail"; + static constexpr const char *ERROR_URI = "dataability:///com.ohos.voicemailability/calls/voicemails"; +}; + +class ContactsUri { +public: + ~ContactsUri(); + static constexpr const char *RAW_CONTACT = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; + static constexpr const char *DELETED_RAW_CONTACT = + "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact"; + static constexpr const char *DELETED_RAW_CONTACT_RECORD = + "dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact_record"; + static constexpr const char *BLOCKLIST = "dataability:///com.ohos.contactsdataability/contacts/contact_blocklist"; + static constexpr const char *GROUPS = "dataability:///com.ohos.contactsdataability/contacts/groups"; + static constexpr const char *CONTACT_DATA = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; + static constexpr const char *CONTACT = "dataability:///com.ohos.contactsdataability/contacts/contact"; + static constexpr const char *SEARCH = "dataability:///com.ohos.contactsdataability/contacts/search_contact"; + static constexpr const char *ERROR_URI = "dataability:///com.ohos.contactsdataability/contacts/raw_contacts"; + static constexpr const char *BACKUP = "dataability:///com.ohos.contactsdataability/contacts/backup"; + static constexpr const char *RECOVER = "dataability:///com.ohos.contactsdataability/contacts/recover"; + static constexpr const char *GROUPS_ERROR = "dataability:///com.ohos.contactsdataability/contacts/group"; + static constexpr const char *MERGE_LIST = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/query_merge_list"; + static constexpr const char *AUTO_MERGE = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_merge"; + static constexpr const char *MANUAL_MERGE = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/manual_merge"; + static constexpr const char *SPLIT_CONTACT = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/split_contact"; + static constexpr const char *MERGE_ERROR = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_mergeee"; + static constexpr const char *MERGE_LIST_ERROR = + "dataability:///com.ohos.contactsdataability/contacts/raw_contact/merge_lists_error"; +}; + +class ProfileUri { +public: + ~ProfileUri(); + static constexpr const char *RAW_CONTACT = "dataability:///com.ohos.contactsdataability/profile/raw_contact"; + static constexpr const char *DELETED_RAW_CONTACT = + "dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact"; + static constexpr const char *BLOCKLIST = "dataability:///com.ohos.contactsdataability/profile/contact_blocklist"; + static constexpr const char *GROUPS = "dataability:///com.ohos.contactsdataability/profile/groups"; + static constexpr const char *CONTACT_DATA = "dataability:///com.ohos.contactsdataability/profile/contact_data"; + static constexpr const char *CONTACT = "dataability:///com.ohos.contactsdataability/profile/contact"; + static constexpr const char *SEARCH = "dataability:///com.ohos.contactsdataability/profile/search_contact"; + static constexpr const char *ERROR_URI = "dataability:///com.ohos.contactsdataability/profile/raw_contacts"; +}; + +class Time { +public: + ~Time(); + static constexpr int SLEEP_TIME_MERGE = 2000; + static constexpr int SLEEP_TIME_MERGE_DELETE = 5000; + static constexpr int ASYNC_SLEEP_TIME = 2000; +}; + +class DataPath { +public: + ~DataPath(); + static constexpr const char *RDB_PATH = "/data/accounts/account_0/appdata/com.ohos.contactsdataability/database/"; + static constexpr const char *DUMP_PATH = "/data/accounts/account_0/appdata/com.ohos.contactsdataability/files/"; + static constexpr const char *RDB_BACKUP_PATH = + "/data/accounts/account_0/appdata/com.ohos.contactsdataability/database/backup/"; +}; +} // namespace Test +} // namespace Contacts +#endif // CONTACTSDATAABILITY_URI_COMMON_H diff --git a/test/unittest/include/voicemailability_test.h b/test/unittest/include/voicemailability_test.h new file mode 100644 index 0000000..378444b --- /dev/null +++ b/test/unittest/include/voicemailability_test.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef VOICEMAILABILITY_TEST_H +#define VOICEMAILABILITY_TEST_H + +#include "base_test.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +namespace { +std::mutex mtx_; +} +class VoicemailAsync { +public: + OHOS::NativeRdb::ValuesBucket values; + std::map result; + OHOS::NativeRdb::ValuesBucket updateValues; + int predicatesId; + std::vector> resultSet; + std::vector predicatesQueryId; + int predicatesDeleteId; + VoicemailAsync(OHOS::NativeRdb::ValuesBucket &values, std::map &result) + { + this->values = values; + this->result = result; + } + VoicemailAsync(OHOS::NativeRdb::ValuesBucket &updateValues, int &predicatesId) + { + this->updateValues = updateValues; + this->predicatesId = predicatesId; + } + + VoicemailAsync(std::vector> resultSet, + std::vector predicatesQueryId) + { + this->resultSet = resultSet; + this->predicatesQueryId = predicatesQueryId; + } + + VoicemailAsync(int &predicatesDeleteId) + { + this->predicatesDeleteId = predicatesDeleteId; + } + void Insert() + { + OHOS::AppExecFwk::VoiceMailAbility voicemailAbility; + OHOS::Uri voicemailUri(VoicemailUri::VOICEMAIL); + int64_t code = voicemailAbility.Insert(voicemailUri, this->values); + int callLogId = code; + EXPECT_GT(callLogId, 0); + mtx_.lock(); + this->result.insert(std::map::value_type(callLogId, this->values)); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync insert---%{public}s", VoicemailUri::VOICEMAIL); + } + void Update() + { + OHOS::Uri voicemailUri(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesId)); + OHOS::AppExecFwk::VoiceMailAbility voicemailAbility; + int resultCode = voicemailAbility.Update(voicemailUri, this->updateValues, predicates); + EXPECT_EQ(0, resultCode); + HILOG_INFO("--- VoicemailAsync Update---%{public}s", VoicemailUri::VOICEMAIL); + } + void Query() + { + OHOS::Uri voicemailUri(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicates; + int size = this->predicatesQueryId.size(); + for (int i = 0; i < size; i++) { + predicates.EqualTo("id", std::to_string(this->predicatesQueryId[i])); + if (i < size - 1) { + predicates.Or(); + } + } + OHOS::AppExecFwk::VoiceMailAbility voicemailAbility; + std::vector columns; + std::shared_ptr resultSet = + voicemailAbility.Query(voicemailUri, columns, predicates); + mtx_.lock(); + this->resultSet.push_back(resultSet); + mtx_.unlock(); + HILOG_INFO("--- VoicemailAsync Query---%{public}s", VoicemailUri::VOICEMAIL); + } + + void Delete() + { + OHOS::Uri voicemailUri(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(this->predicatesDeleteId)); + OHOS::AppExecFwk::VoiceMailAbility voicemailAbility; + int resultCode = voicemailAbility.Delete(voicemailUri, predicates); + HILOG_INFO("--- VoicemailAsync Delete---%{public}s", VoicemailUri::VOICEMAIL); + EXPECT_EQ(0, resultCode); + } +}; + +class VoicemailAbilityTest : public BaseTest { +public: + VoicemailAbilityTest(); + ~VoicemailAbilityTest(); + int64_t VoicemailStatusInsert(std::string phoneNumber, int status); + int VoicemailUpdate(OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates); + int VoicemailDelete(OHOS::NativeRdb::DataAbilityPredicates predicates); + std::shared_ptr VoicemailQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates); + OHOS::NativeRdb::ValuesBucket GetVoiceMailValues( + int columnsStart, int columnsEnd, std::vector &columns); + void GetVoiceMailValuesColumn(std::vector &columns); + int VoicemailInsertValues(OHOS::NativeRdb::ValuesBucket &values); + int64_t VoicemailInsertValue(std::string displayName, OHOS::NativeRdb::ValuesBucket &values); + void CheckResultSetBatch(OHOS::NativeRdb::DataAbilityPredicates predicates, std::vector &columns, + OHOS::NativeRdb::ValuesBucket values, std::string testName); + void ClearVoicemail(); +}; +} // namespace Test +} // namespace Contacts +#endif // VOICEMAILABILITY_TEST_H \ No newline at end of file diff --git a/test/unittest/src/base_test.cpp b/test/unittest/src/base_test.cpp new file mode 100644 index 0000000..322ebc1 --- /dev/null +++ b/test/unittest/src/base_test.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2021 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 "base_test.h" + +#include +#include +#include +#include + +#include "contacts_path.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +BaseTest::BaseTest() +{ + OHOS::Contacts::ContactsPath::RDB_PATH = DataPath::RDB_PATH; + OHOS::Contacts::ContactsPath::RDB_BACKUP_PATH = DataPath::RDB_BACKUP_PATH; + OHOS::Contacts::ContactsPath::DUMP_PATH = DataPath::DUMP_PATH; +} + +BaseTest::~BaseTest() +{ +} + +int BaseTest::ContactsRand() +{ + int fd = 0; + int randNum = 0; + int result; + fd = open("/dev/urandom", O_RDONLY); + read(fd, &result, sizeof(randNum)); + close(fd); + return result; +} + +void BaseTest::InitAbility() +{ + std::shared_ptr abilityInfo = std::make_shared(); + abilityInfo->name = "AbilityClassName"; + abilityInfo->type = OHOS::AppExecFwk::AbilityType::DATA; + abilityInfo->isNativeAbility = true; + std::shared_ptr application; + std::shared_ptr handler; + calllogAbility.Init(abilityInfo, application, handler, nullptr); + voicemailAbility.Init(abilityInfo, application, handler, nullptr); + contactsDataAbility.Init(abilityInfo, application, handler, nullptr); +} + +/** + * @brief check values and resultSet value + * + * @param rawContactValues of data source + * @param resultSet of database + * @param test name + */ +void BaseTest::CheckResultSet(OHOS::NativeRdb::ValuesBucket &values, + const std::shared_ptr &resultSet, std::string testName) +{ + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + CheckData(values, resultSet, columnNames[i], testName); + } + break; + } + resultSet->Close(); +} + +void BaseTest::CheckData(OHOS::NativeRdb::ValuesBucket &values, + const std::shared_ptr &resultSet, std::string &columnName, + std::string testName) +{ + std::string typeValue = columnName; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + OHOS::NativeRdb::ColumnType columnType; + resultSet->GetColumnType(columnIndex, columnType); + // Compare values and resultSet column value equality + if (columnType == OHOS::NativeRdb::ColumnType::TYPE_INTEGER) { + int resultSetIntValue = 0; + int valuesIntValue = 0; + resultSet->GetInt(columnIndex, resultSetIntValue); + if (values.HasColumn(typeValue)) { + OHOS::NativeRdb::ValueObject valuesObject; + values.GetObject(typeValue, valuesObject); + valuesObject.GetInt(valuesIntValue); + std::string tempName = testName; + tempName.append("CheckResultSet columnName : %{public}s insertValue = %{public}d "); + tempName.append("databaseValue = %{public}d"); + HILOG_INFO(tempName.c_str(), typeValue.c_str(), valuesIntValue, resultSetIntValue); + EXPECT_EQ(resultSetIntValue, valuesIntValue); + } + } else if (columnType == OHOS::NativeRdb::ColumnType::TYPE_STRING) { + std::string resultSetStringValue; + std::string valuesStringValue; + resultSet->GetString(columnIndex, resultSetStringValue); + if (values.HasColumn(typeValue)) { + OHOS::NativeRdb::ValueObject valuesObject; + values.GetObject(typeValue, valuesObject); + valuesObject.GetString(valuesStringValue); + std::string tempName = testName; + tempName.append("CheckResultSet columnName : %{public}s insertValue = %{public}s "); + tempName.append("databaseValue = %{public}s"); + HILOG_INFO(tempName.c_str(), typeValue.c_str(), valuesStringValue.c_str(), resultSetStringValue.c_str()); + EXPECT_EQ(resultSetStringValue, valuesStringValue); + } + } +} + +/** + * @brief check values and resultSet value + * + * @param values of data source + * @param resultSet of database + */ +void BaseTest::CheckResultSetList(std::vector &valuesVector, + std::shared_ptr &resultSet, std::string testName) +{ + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + int resultSetNum = resultSet->GoToFirstRow(); + int index = 0; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + OHOS::NativeRdb::ValuesBucket values = valuesVector[index]; + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + CheckData(valuesVector[index], resultSet, columnNames[i], testName); + } + resultSetNum = resultSet->GoToNextRow(); + index++; + } + resultSet->Close(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/calllogability_test.cpp b/test/unittest/src/calllogability_test.cpp new file mode 100644 index 0000000..89a49c2 --- /dev/null +++ b/test/unittest/src/calllogability_test.cpp @@ -0,0 +1,1368 @@ +/* + * Copyright (c) 2021 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 "calllogability_test.h" + +#include "data_ability_operation_builder.h" + +namespace Contacts { +namespace Test { +CalllogAbilityTest::CalllogAbilityTest() +{ +} + +CalllogAbilityTest::~CalllogAbilityTest() +{ +} + +int64_t CalllogAbilityTest::CalllogInsert(std::string phoneNumber) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::ValuesBucket calllogValues; + calllogValues.PutString("phone_number", phoneNumber); + int64_t code = calllogAbility.Insert(uriCalllog, calllogValues); + calllogValues.Clear(); + return code; +} + +int CalllogAbilityTest::CalllogUpdate( + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + int code = calllogAbility.Update(uriCalllog, updateValues, predicates); + return code; +} + +int CalllogAbilityTest::CalllogDelete(OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + int code = calllogAbility.Delete(uriCalllog, predicates); + return code; +} + +std::shared_ptr CalllogAbilityTest::CalllogQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllog, columns, predicates); + return resultSet; +} + +int64_t CalllogAbilityTest::CalllogInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + int64_t code = calllogAbility.Insert(uriCalllog, values); + return code; +} + +int64_t CalllogAbilityTest::CalllogInsertValue(std::string displayName, OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + values.PutString("display_name", displayName); + int64_t code = calllogAbility.Insert(uriCalllog, values); + return code; +} + +void CalllogAbilityTest::GetAllValuesColumn(std::vector &column) +{ + column.push_back("phone_number"); + column.push_back("display_name"); + column.push_back("call_direction"); + column.push_back("voicemail_uri"); + column.push_back("sim_type"); + column.push_back("is_hd"); + column.push_back("is_read"); + column.push_back("ring_duration"); + column.push_back("talk_duration"); + column.push_back("format_number"); + column.push_back("quicksearch_key"); + column.push_back("number_type"); + column.push_back("number_type_name"); + column.push_back("begin_time"); + column.push_back("end_time"); + column.push_back("answer_state"); + column.push_back("create_time"); + column.push_back("number_location"); + column.push_back("photo_id"); + column.push_back("photo_uri"); + column.push_back("country_iso_code"); + column.push_back("extra1"); + column.push_back("extra2"); + column.push_back("extra3"); + column.push_back("extra4"); + column.push_back("extra5"); + column.push_back("extra6"); +} + +/** + * @brief get ValuesBucket + * @params columnsStart column start index + * @params columnsEnd column end index + * @return ValuesBucket + */ +OHOS::NativeRdb::ValuesBucket CalllogAbilityTest::GetCallLogValues( + int columnsStart, int columnsEnd, std::vector &columns) +{ + std::string callLogTestStringValue = std::to_string(ContactsRand()); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "154121" + callLogTestStringValue); + valuesBucket.PutString("display_name", "name"); + valuesBucket.PutInt("call_direction", ContactsRand()); + valuesBucket.PutString("voicemail_uri", "uri::voicemail_uri" + callLogTestStringValue); + valuesBucket.PutInt("sim_type", ContactsRand()); + valuesBucket.PutInt("is_hd", ContactsRand()); + valuesBucket.PutInt("is_read", ContactsRand()); + valuesBucket.PutInt("ring_duration", ContactsRand()); + valuesBucket.PutInt("talk_duration", ContactsRand()); + valuesBucket.PutString("format_number", "154 121" + callLogTestStringValue); + valuesBucket.PutString("quicksearch_key", "1"); + valuesBucket.PutInt("number_type", ContactsRand()); + valuesBucket.PutString("number_type_name", "numberType" + callLogTestStringValue); + valuesBucket.PutInt("begin_time", ContactsRand()); + valuesBucket.PutInt("end_time", ContactsRand()); + valuesBucket.PutInt("answer_state", ContactsRand()); + valuesBucket.PutInt("create_time", ContactsRand()); + valuesBucket.PutString("number_location", "location" + callLogTestStringValue); + valuesBucket.PutInt("photo_id", ContactsRand()); + valuesBucket.PutString("photo_uri", "uri::photo_uri" + callLogTestStringValue); + valuesBucket.PutInt("country_iso_code", ContactsRand()); + valuesBucket.PutString("extra1", "extra1" + callLogTestStringValue); + valuesBucket.PutString("extra2", "extra2" + callLogTestStringValue); + valuesBucket.PutString("extra3", "extra3" + callLogTestStringValue); + valuesBucket.PutString("extra4", "extra4" + callLogTestStringValue); + valuesBucket.PutString("extra5", "extra5" + callLogTestStringValue); + valuesBucket.PutString("extra6", "extra6" + callLogTestStringValue); + std::vector columnsTemp; + GetAllValuesColumn(columnsTemp); + int allSize = columnsTemp.size(); + for (int i = 0; i < allSize; i++) { + if (i >= columnsStart && i < columnsEnd) { + columns.push_back(columnsTemp[i]); + } else { + valuesBucket.Delete(columnsTemp[i]); + } + } + return valuesBucket; +} + +void CalllogAbilityTest::ClearCallLog() +{ + // clear all callLog data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number calllog_Insert_test_100 + * @tc.name Add a single contact data and verify whether the insertion is successful + * @tc.desc Added ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Insert_test_100 is starting! ---"); + std::vector columns; + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + columns.push_back("phone_number"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + // query insert data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSetDeleteQuery = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSetDeleteQuery, "calllog_Insert_test_100"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Insert_test_200 + * @tc.name Add full field data to the callog table and verify that the insertion was successful + * @tc.desc Added ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----calllog_Insert_test_200 is starting!-----"); + std::vector columns; + GetAllValuesColumn(columns); + int columnsSize = 27; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetCallLogValues(0, columnsSize, columns); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "calllog_Insert_test_200"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawId)); + // test end delete data + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + ClearCallLog(); +} + +/* + * @tc.number calllog_Update_test_300 + * @tc.name Update single contact data and verify whether the update is successful + * @tc.desc Support single call record update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Update_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Update_test_300 is starting! ---"); + std::vector columns; + columns.push_back("phone_number"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "123456789055"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", "0987654321"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + int updateCode = CalllogUpdate(updateValues, predicates); + EXPECT_EQ(0, updateCode); + + std::shared_ptr resultSetDeleteQuery = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(updateValues, resultSetDeleteQuery, "calllog_Update_test_300"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Update_test_400 + * @tc.name Update the data of all fields of callog table and verify whether the update is successful + * @tc.desc Support all call log update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Update_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----calllog_Update_test_400 is starting!-----"); + std::vector columns; + GetAllValuesColumn(columns); + int columnsSize = 27; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetCallLogValues(0, columnsSize, columns); + int rawId = CalllogInsertValues(valuesBucket); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetCallLogValues(0, columnsSize, columns); + int upDateCode = CalllogUpdate(upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + + CheckResultSet(upDateValuesBucket, resultSet, "calllog_Update_test_400"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawId)); + // test end delete data + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + ClearCallLog(); +} + +/* + * @tc.number calllog_Update_test_500 + * @tc.name Update all call records and verify that the update is successful + * @tc.desc Support all call log update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Update_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Update_test_500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + valuesBucket.PutString("display_name", "testName"); + CalllogInsertValues(valuesBucket); + CalllogInsertValues(valuesBucket); + int rawCount = 2; + std::vector columns; + columns.push_back("ring_duration"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSetQuery = CalllogQuery(columns, predicates); + int rowCurrentCount = 0; + resultSetQuery->GetRowCount(rowCurrentCount); + resultSetQuery->Close(); + EXPECT_EQ(rowCurrentCount, rawCount); + + // update database current data + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("ring_duration", 500); + predicates.GreaterThan("id", "0"); + int updateCode = CalllogUpdate(updateValues, predicates); + EXPECT_EQ(updateCode, 0); + // check update data or dataBase + std::shared_ptr resultSetUpDateQuery = CalllogQuery(columns, predicates); + int rowUpDateCount = 0; + resultSetUpDateQuery->GetRowCount(rowUpDateCount); + EXPECT_EQ(rowCurrentCount, rowUpDateCount); + std::vector upValues; + upValues.push_back(updateValues); + upValues.push_back(updateValues); + CheckResultSetList(upValues, resultSetUpDateQuery, "calllog_Update_test_500"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Query_test_600 + * @tc.name Add call record data, query the data according to the returned ID and return the query result + * @tc.desc Support single call record query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Query_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Query_test_600 is starting! ---"); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("display_name"); + columns.push_back("id"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + valuesBucket.PutString("display_name", "testName"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + // query insert data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSetDeleteQuery = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + valuesBucket.PutInt("id", rawId); + CheckResultSet(valuesBucket, resultSetDeleteQuery, "calllog_Query_test_600"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Query_test_800 + * @tc.name Query the call record according to the combination conditions and return the query results + * @tc.desc Support combination condition query call record ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Query_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----calllog_Query_test_800 is starting!-----"); + int ringDuration = 9121215; + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + valuesBucket.PutString("display_name", "testName"); + valuesBucket.PutInt("ring_duration", ringDuration); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("display_name"); + columns.push_back("ring_duration"); + columns.push_back("id"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + predicates.And(); + predicates.EqualTo("ring_duration", std::to_string(ringDuration)); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + // add id check + valuesBucket.PutInt("id", rawId); + CheckResultSet(valuesBucket, resultSet, "calllog_Query_test_800"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Query_test_900 + * @tc.name Query all call records and return query results + * @tc.desc Query all call records + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Query_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----calllog_Query_test_900 is starting!-----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "12345678901254"); + valuesBucket.PutString("display_name", "testName"); + CalllogInsertValues(valuesBucket); + CalllogInsertValues(valuesBucket); + CalllogInsertValues(valuesBucket); + CalllogInsertValues(valuesBucket); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int current = 4; + // resultSet count 4 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(current, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/* + * @tc.number calllog_Delete_test_1000 + * @tc.name Delete a single call record and verify whether the deletion is successful + * @tc.desc Call log deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Delete_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Delete_test_1000 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + std::vector columns; + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/* + * @tc.number calllog_Delete_test_1100 + * @tc.name Delete a single call record data and verify whether the deletion is successful + * @tc.desc Call log deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Delete_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Delete_test_1100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "18552504057"); + int rawIdTwo = CalllogInsertValues(valuesBucketTwo); + EXPECT_GT(rawIdTwo, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawIdTwo)); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/* + * @tc.number calllog_Delete_test_1200 + * @tc.name Delete the data of all fields in the callog table and verify whether the deletion is successful + * @tc.desc Call log deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Delete_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----calllog_Delete_test_1200 is starting!-----"); + // insert + std::vector columns; + GetAllValuesColumn(columns); + int columnsSize = 27; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetCallLogValues(0, columnsSize, columns); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + + std::shared_ptr resultSetDeleteQuery = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSetDeleteQuery->Close(); + ClearCallLog(); +} + +/* + * @tc.number calllog_BatchInsert_test_1300 + * @tc.name Batch add call record data and verify whether the insertion is successful + * @tc.desc Add ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_BatchInsert_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_BatchInsert_test_1300 is starting!---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "test_1000_1234567890"); + valuesBucket.PutInt("ring_duration", 1000); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "test_1000_0987654321"); + valuesBucketTwo.PutInt("ring_duration", 1200); + OHOS::NativeRdb::ValuesBucket valuesBucketThree; + valuesBucketThree.PutString("phone_number", "test_1000_1111122222"); + valuesBucketThree.PutInt("ring_duration", 1500); + std::vector listAddValuesBucket; + listAddValuesBucket.push_back(valuesBucket); + listAddValuesBucket.push_back(valuesBucketTwo); + listAddValuesBucket.push_back(valuesBucketThree); + OHOS::Uri batchInsertUri(CallLogUri::CALL_LOG); + + int batchInsertCode = calllogAbility.BatchInsert(batchInsertUri, listAddValuesBucket); + EXPECT_EQ(batchInsertCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("ring_duration"); + predicates.EqualTo("phone_number", "test_1000_1234567890"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + predicates.Clear(); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + + CheckResultSet(valuesBucket, resultSet, "calllog_BatchInsert_test_1300"); + predicates.Clear(); + predicates.EqualTo("phone_number", "test_1000_0987654321"); + std::shared_ptr resultSetTwo = CalllogQuery(columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(1, rowCountTwo); + + CheckResultSet(valuesBucketTwo, resultSetTwo, "calllog_BatchInsert_test_1300"); + predicates.Clear(); + predicates.EqualTo("phone_number", "test_1000_1111122222"); + std::shared_ptr resultSetThree = CalllogQuery(columns, predicates); + int rowCountThree = 0; + resultSetThree->GetRowCount(rowCountThree); + EXPECT_EQ(1, rowCountThree); + CheckResultSet(valuesBucketThree, resultSetThree, "calllog_BatchInsert_test_1300"); + ClearCallLog(); +} + +/* + * @tc.number calllog_Delete_test_1400 + * @tc.name Delete call record data in batch and verify whether the deletion is successful + * @tc.desc delete ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Delete_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Delete_test_1400 is starting!---"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("phone_number", "999999999Bratch"); + valuesBucketOne.PutInt("ring_duration", 998); + int rawIdOne = CalllogInsertValues(valuesBucketOne); + EXPECT_GT(rawIdOne, 0); + int rawIdTwo = CalllogInsertValues(valuesBucketOne); + EXPECT_GT(rawIdTwo, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(CallLogUri::CALL_LOG); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewDeleteBuilder(uri) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + calllogAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::vector columns; + std::shared_ptr resultSetInsertQuery = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearCallLog(); +} + +/* + * @tc.number calllog_Update_test_1500 + * @tc.name Batch update call record data and verify whether the update is successful + * @tc.desc update ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_Update_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_Update_test_1500 is starting!---"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("phone_number", "999999999UpdateBratch"); + valuesBucketOne.PutInt("ring_duration", 998); + int rawIdOne = CalllogInsertValues(valuesBucketOne); + EXPECT_GT(rawIdOne, 0); + int rawIdTwo = CalllogInsertValues(valuesBucketOne); + EXPECT_GT(rawIdTwo, 0); + OHOS::NativeRdb::ValuesBucket calllogValues; + calllogValues.PutString("phone_number", "12345"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawIdTwo)); + std::shared_ptr values = + std::make_shared(calllogValues); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(CallLogUri::CALL_LOG); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewUpdateBuilder(uri) + ->WithValuesBucket(values) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + calllogAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr resultSetInsertQuery = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(calllogValues); + listValue.push_back(calllogValues); + CheckResultSetList(listValue, resultSetInsertQuery, "calllog_Update_test_1500"); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Insert_test_1600 + * @tc.name When adding individual contact data, a non-existent field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Insert_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Insert_test_1600 is starting!-----"); + + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::Uri errorUri(CallLogUri::ERROR_URI); + std::vector columns; + columns.push_back("phone_number"); + OHOS::NativeRdb::ValuesBucket calllogValues; + calllogValues.PutString("phone_numbers", "998877"); + int calllogId = calllogAbility.Insert(uriCalllog, calllogValues); + EXPECT_EQ(calllogId, -1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_numbers", "998877"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + + resultSet->Close(); + calllogValues.Clear(); + calllogValues.PutString("phone_number", "998877"); + calllogId = calllogAbility.Insert(errorUri, calllogValues); + EXPECT_EQ(calllogId, -1); + + calllogValues.Clear(); + predicates.EqualTo("phone_number", "998877"); + std::shared_ptr resultSetUriError = CalllogQuery(columns, predicates); + int rowCountUriError = 0; + resultSetUriError->GetRowCount(rowCountUriError); + EXPECT_EQ(-1, rowCountUriError); + resultSetUriError->Close(); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Update_test_1700 + * @tc.name Update a single call record and pass in non-existent fields + * @tc.desc Updated ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Update_test_1700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_calllog_Update_test_1700 is starting! ---"); + std::vector columns; + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + valuesBucket.PutString("display_name", "abnormal_sigle"); + columns.push_back("phone_number"); + columns.push_back("display_name"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number_sha", "0987654321"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + int updateCode = CalllogUpdate(updateValues, predicates); + EXPECT_EQ(-1, updateCode); + + // query insert data + std::shared_ptr resultSetInsertQuery = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSetInsertQuery, "abnormal_calllog_Update_test_1700"); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Update_test_1800 + * @tc.name Update all call records and pass in a non-existent field + * @tc.desc Updated ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Update_test_1800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_calllog_Update_test_1800 is starting! ---"); + std::vector columns; + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("phone_number", "1234567890"); + valuesBucketOne.PutInt("ring_duration", 998); + int rawIdOne = CalllogInsertValues(valuesBucketOne); + EXPECT_GT(rawIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "638292093737"); + valuesBucketTwo.PutInt("ring_duration", 999); + int rawIdTwo = CalllogInsertValues(valuesBucketTwo); + EXPECT_GT(rawIdTwo, 0); + + columns.push_back("phone_number"); + columns.push_back("ring_duration"); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", "0987654321"); + updateValues.PutInt("ring_duration", 888); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("ring_duration_shs", "999"); + int updateCode = CalllogUpdate(updateValues, predicates); + EXPECT_EQ(-1, updateCode); + + // query insert data + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawIdTwo)); + std::shared_ptr resultSetInsertQuery = CalllogQuery(columns, predicates); + + // resultSet count 2 + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(valuesBucketOne); + listValue.push_back(valuesBucketTwo); + CheckResultSetList(listValue, resultSetInsertQuery, "abnormal_calllog_Update_test_1800"); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Query_test_1900 + * @tc.name When querying the call record, a non-existent data is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Query_test_1900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Query_test_1900 is starting!-----"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", "100000000"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Query_test_2000 + * @tc.name An incorrect table name was passed in when querying the call record + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Query_test_2000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Query_test_2000 is starting!-----"); + OHOS::Uri uriCalllogs(CallLogUri::ERROR_URI); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllogs, columns, predicates); + EXPECT_EQ(resultSet, nullptr); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Query_test_2100 + * @tc.name When querying the call record according to the combination conditions, + * the wrong field name and nonexistent data are passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Query_test_2100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Query_test_2100 is starting!-----"); + + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("ids", "0"); + predicates.And(); + predicates.LessThan("id", "20"); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllog, columns, predicates); + // resultSet count + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Query_test_2200 + * @tc.name An error field is passed in when querying all call records + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Query_test_2200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Query_test_2200 is starting!-----"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + + int deleteCode = calllogAbility.Delete(uriCalllog, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_numbers"); + predicates.Clear(); + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + EXPECT_NE(resultSet, nullptr); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Delete_test_2300 + * @tc.name An error field is passed in when deleting a single call record + * @tc.desc Added ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Delete_test_2300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_calllog_Delete_test_2300 is starting!-----"); + std::vector columns; + GetAllValuesColumn(columns); + int columnsSize = 27; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetCallLogValues(0, columnsSize, columns); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "abnormal_calllog_Delete_test_2300"); + predicates.Clear(); + predicates.EqualTo("ids", std::to_string(rawId)); + // test end delete data + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, -1); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSetDelete = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCountDelete = 0; + resultSetDelete->GetRowCount(rowCountDelete); + EXPECT_EQ(1, rowCountDelete); + CheckResultSet(valuesBucket, resultSetDelete, "abnormal_calllog_Delete_test_2300"); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_BatchInsert_test_2400 + * @tc.name Batch call records are added and several of them fail. See the processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_BatchInsert_test_2400, testing::ext::TestSize.Level1) +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); + HILOG_INFO("--- abnormal_calllog_BatchInsert_test_2400 is starting! ---"); + + OHOS::Uri uriData(CallLogUri::CALL_LOG); + OHOS::NativeRdb::ValuesBucket calllogValues; + std::vector listAddBluk; + int batchInserCode = 0; + for (int i = 0; i < 10; i++) { + listAddBluk.clear(); + for (int j = 10 * i + 1; j <= 10 * (i + 1); j++) { + calllogValues.Clear(); + if (j == 14 || j == 27 || j == 57) { + calllogValues.PutString("phone_numbers", std::to_string(j)); + } else { + calllogValues.PutString("phone_number", std::to_string(j)); + } + listAddBluk.push_back(calllogValues); + } + batchInserCode = calllogAbility.BatchInsert(uriData, listAddBluk); + HILOG_INFO("abnormal_calllog_BatchInsert_test_2400 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_calllog_BatchInsert_test_2400 batch insert success!"); + EXPECT_EQ(batchInserCode, 0); + } else { + HILOG_INFO("abnormal_calllog_BatchInsert_test_2400 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + } + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_BatchInsert_test_2500 + * @tc.name Add 1000 pieces of data in batch to make article 500 fail. Check the subsequent processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_BatchInsert_test_2500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_calllog_BatchInsert_test_2500 is starting! ---"); + + OHOS::Uri uriData(CallLogUri::CALL_LOG); + OHOS::NativeRdb::ValuesBucket calllogValues; + std::vector listAddBluk; + int batchInserCode = 0; + for (int i = 0; i < 1000; i++) { + calllogValues.Clear(); + if (i == 500) { + calllogValues.PutString("phone_numbers", std::to_string(i + 1)); + } else { + calllogValues.PutString("phone_number", std::to_string(i + 1)); + } + listAddBluk.push_back(calllogValues); + } + batchInserCode = calllogAbility.BatchInsert(uriData, listAddBluk); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_calllog_BatchInsert_test_2500 batch insert success!"); + EXPECT_EQ(batchInserCode, 0); + } else { + HILOG_INFO("abnormal_calllog_BatchInsert_test_2500 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_delete_test_2600 + * @tc.name Delete call record data in batch, and several of them fail. Check the processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_delete_test_2600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_calllog_delete_test_2600 is starting! ---"); + + OHOS::Uri errorUriCalllogs(CallLogUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1234567890"); + int calllogIdOne = CalllogInsertValues(valuesBucket); + EXPECT_GT(calllogIdOne, 0); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "1234567890"); + int calllogIdTwo = CalllogInsertValues(valuesBucketTwo); + EXPECT_GT(calllogIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(calllogIdOne)); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, -1); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr resultSetOne = CalllogQuery(columns, predicates); + int rowCountOne = 0; + resultSetOne->GetRowCount(rowCountOne); + EXPECT_EQ(-1, rowCountOne); + + CheckResultSet(valuesBucket, resultSetOne, "abnormal_calllog_delete_test_2600"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(calllogIdTwo)); + deleteCode = calllogAbility.Delete(errorUriCalllogs, predicates); + EXPECT_EQ(deleteCode, -1); + std::shared_ptr resultSetTwo = CalllogQuery(columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(1, rowCountTwo); + resultSetTwo->Close(); + ClearCallLog(); +} + +/* + * @tc.number abnormal_calllog_Update_test_2700 + * @tc.name When batch call record is modified, the wrong field or table name is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, abnormal_calllog_Update_test_2700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_calllog_Update_test_2700 is starting! ---"); + + OHOS::Uri errorUri(CallLogUri::ERROR_URI); + int64_t calllogIdOne = CalllogInsert("1234567890"); + EXPECT_GT(calllogIdOne, 0); + int64_t calllogIdTwo = CalllogInsert("0987654321"); + EXPECT_GT(calllogIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket updateCalllogValues; + updateCalllogValues.PutString("phone_number", "998877"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(calllogIdOne)); + int updateCode = CalllogUpdate(updateCalllogValues, predicates); + EXPECT_EQ(updateCode, -1); + std::vector columns; + columns.push_back("phone_number"); + predicates.Clear(); + predicates.EqualTo("phone_number", "998877"); + std::shared_ptr resultSetOne = CalllogQuery(columns, predicates); + int rowCountOne = 0; + resultSetOne->GetRowCount(rowCountOne); + EXPECT_EQ(0, rowCountOne); + + resultSetOne->Close(); + updateCalllogValues.Clear(); + updateCalllogValues.PutString("phone_number", "987654"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(calllogIdTwo)); + updateCode = calllogAbility.Update(errorUri, updateCalllogValues, predicates); + EXPECT_EQ(updateCode, -1); + + std::shared_ptr resultSetTwo = CalllogQuery(columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountOne); + EXPECT_EQ(0, rowCountTwo); + OHOS::NativeRdb::ValuesBucket oldValue; + oldValue.PutString("phone_number", "0987654321"); + CheckResultSet(oldValue, resultSetTwo, "abnormal_calllog_Update_test_2700"); + ClearCallLog(); +} + +/* + * @tc.number calllog_async_insert_test_2800 + * @tc.name Add callLog async + * @tc.desc Ability to join or add calllog + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_async_insert_test_2800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_async_insert_test_2800 is staring! ---"); + std::map result; + std::vector callLogAsyncVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + name.append(std::to_string(i)); + values.PutString("display_name", name); + CallLogAsync *contactAsync = new CallLogAsync(values, result); + std::thread asyncThread(&CallLogAsync::Insert, contactAsync); + callLogAsyncVector.push_back(contactAsync); + asyncThread.detach(); + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::map::iterator it; + for (it = result.begin(); it != result.end(); it++) { + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(it->first)); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + CheckResultSet(it->second, resultSet, "calllog_async_insert_test_2800"); + } + for (int i = 0; i < threadNum; ++i) { + delete callLogAsyncVector[i]; + } + ClearCallLog(); +} + +/* + * @tc.number calllog_async_update_test_2900 + * @tc.name update calllog async + * @tc.desc Ability to join or update calllog + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_async_update_test_2900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_async_update_test_2900 is staring! ---"); + OHOS::NativeRdb::ValuesBucket callValues; + std::vector callLogId; + callLogId.push_back(CalllogInsertValue("async_update1", callValues)); + callValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update2", callValues)); + callValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update3", callValues)); + callValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update4", callValues)); + callValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update5", callValues)); + callValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update6", callValues)); + callValues.Clear(); + std::vector upDateValues; + OHOS::NativeRdb::DataAbilityPredicates queryPredicates; + std::vector callLogAsyncVector; + int size = callLogId.size(); + for (int i = 0; i < size; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + values.PutString("display_name", name); + upDateValues.push_back(values); + int id = callLogId[i]; + CallLogAsync *contactAsync = new CallLogAsync(values, id); + callLogAsyncVector.push_back(contactAsync); + std::thread asyncThread(&CallLogAsync::Update, contactAsync); + asyncThread.detach(); + queryPredicates.EqualTo("id", std::to_string(callLogId[i])); + if (i < size - 1) { + queryPredicates.Or(); + } + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::shared_ptr resultSet = CalllogQuery(columns, queryPredicates); + CheckResultSetList(upDateValues, resultSet, "calllog_async_update_test_2900"); + for (int i = 0; i < size; ++i) { + delete callLogAsyncVector[i]; + } + ClearCallLog(); +} + +/* + * @tc.number calllog_async_query_test_3000 + * @tc.name query calllog async + * @tc.desc Ability to join or query + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_async_query_test_3000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_async_query_test_3000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket callLogValues; + std::vector callLogId; + callLogId.push_back(CalllogInsertValue("async_query1", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_query2", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_query3", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_query4", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_query5", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_query6", callLogValues)); + callLogValues.Clear(); + std::vector callLogAsyncVector; + std::vector> resultSetVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + CallLogAsync *contactAsync = new CallLogAsync(resultSetVector, callLogId); + callLogAsyncVector.push_back(contactAsync); + std::thread asyncThread(&CallLogAsync::Query, contactAsync); + asyncThread.detach(); + } + int queryCount = 6; + int size = resultSetVector.size(); + for (int i = 0; i < size; ++i) { + int rowCount = 0; + resultSetVector[i]->GetRowCount(rowCount); + EXPECT_EQ(queryCount, rowCount); + resultSetVector[i]->Close(); + } + for (int i = 0; i < size; ++i) { + delete callLogAsyncVector[i]; + } + ClearCallLog(); +} + +/* + * @tc.number contact_async_update_test_7300 + * @tc.name delete calllog async + * @tc.desc Ability to join or delete calllog + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogAbilityTest, calllog_async_delete_test_3100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_async_delete_test_3100 is staring! ---"); + OHOS::NativeRdb::ValuesBucket callLogValues; + std::vector callLogId; + callLogId.push_back(CalllogInsertValue("async_update1", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update2", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update3", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update4", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update5", callLogValues)); + callLogValues.Clear(); + callLogId.push_back(CalllogInsertValue("async_update6", callLogValues)); + callLogValues.Clear(); + int size = callLogId.size(); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.BeginWrap(); + std::vector callLogAsyncVector; + for (int i = 0; i < size; ++i) { + int id = callLogId[i]; + CallLogAsync *contactAsync = new CallLogAsync(id); + callLogAsyncVector.push_back(contactAsync); + std::thread asyncThread(&CallLogAsync::Delete, contactAsync); + asyncThread.detach(); + predicates.EqualTo("id", std::to_string(id)); + if (i < size - 1) { + predicates.Or(); + } + } + predicates.EndWrap(); + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + for (int i = 0; i < size; ++i) { + delete callLogAsyncVector[i]; + } + ClearCallLog(); +} +} // namespace Test +} // namespace Contacts diff --git a/test/unittest/src/calllogfuzzyquery_test.cpp b/test/unittest/src/calllogfuzzyquery_test.cpp new file mode 100644 index 0000000..7c8904d --- /dev/null +++ b/test/unittest/src/calllogfuzzyquery_test.cpp @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2021 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 "calllogfuzzyquery_test.h" + +#include "test_common.h" + +namespace Contacts { +namespace Test { +CalllogFuzzyQueryTest::CalllogFuzzyQueryTest() +{ +} + +CalllogFuzzyQueryTest::~CalllogFuzzyQueryTest() +{ +} + +int CalllogFuzzyQueryTest::CalllogDelete(OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + int code = calllogAbility.Delete(uriCalllog, predicates); + return code; +} + +std::shared_ptr CalllogFuzzyQueryTest::CalllogQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllog, columns, predicates); + return resultSet; +} + +int64_t CalllogFuzzyQueryTest::CalllogInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + int64_t code = calllogAbility.Insert(uriCalllog, values); + return code; +} + +void CalllogFuzzyQueryTest::ClearCallLog() +{ + // clear all callLog data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = CalllogDelete(predicates); + EXPECT_EQ(deleteCode, 0); +} + +/** + * @tc.number calllog_Query_test_100 + * @tc.name Fuzzy query according to the beginning of mobile phone number + * @tc.desc Query call records of mobile phone numbers that start with 123 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogFuzzyQueryTest, calllog_Query_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("----calllog_Query_test_100 is starting!----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "123456789"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + valuesBucket.PutInt("id", rawId); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "1842794123"); + rawId = CalllogInsertValues(valuesBucketTwo); + valuesBucketTwo.PutInt("id", rawId); + EXPECT_GT(rawId, 0); + + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("phone_number", "123%"); + predicates.OrderByAsc("id"); + std::vector valuesBucketVector; + valuesBucketVector.push_back(valuesBucket); + valuesBucketVector.push_back(valuesBucketTwo); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + int currentCount = 1; + EXPECT_EQ(currentCount, rowCount); + CheckResultSetList(valuesBucketVector, resultSet, "calllog_Query_test_100"); + resultSet->Close(); + ClearCallLog(); +} + +/** + * @tc.number calllog_Query_test_200 + * @tc.name Fuzzy query according to the end of mobile phone number + * @tc.desc Query call records with mobile phone number ending in 0 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogFuzzyQueryTest, calllog_Query_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("----calllog_Query_test_200 is starting!----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "1854250750"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + valuesBucket.PutInt("id", rawId); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "17542368015"); + rawId = CalllogInsertValues(valuesBucketTwo); + valuesBucketTwo.PutInt("id", rawId); + EXPECT_GT(rawId, 0); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("phone_number", "%750"); + predicates.OrderByAsc("id"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + int currentCount = 1; + EXPECT_EQ(currentCount, rowCount); + CheckResultSet(valuesBucket, resultSet, "calllog_Query_test_200"); + resultSet->Close(); + ClearCallLog(); +} + +/** + * @tc.number calllog_Query_test_300 + * @tc.name Fuzzy query according to the middle digits of the mobile phone number + * @tc.desc Query the call history of the mobile phone number starting with 123 and ending with 8910 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogFuzzyQueryTest, calllog_Query_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("----calllog_Query_test_300 is starting!----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "12378418910"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + valuesBucket.PutInt("id", rawId); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "12374589961"); + rawId = CalllogInsertValues(valuesBucketTwo); + valuesBucketTwo.PutInt("id", rawId); + EXPECT_GT(rawId, 0); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("phone_number", "1238910516156465%"); + predicates.OrderByAsc("id"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 0 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearCallLog(); +} + +/** + * @tc.number calllog_Query_test_400 + * @tc.name Fuzzy query according to the fields contained in the mobile phone number + * @tc.desc Query the call history of the mobile phone number starting with 123 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogFuzzyQueryTest, calllog_Query_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("----calllog_Query_test_400 is starting!----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "17778418910"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + valuesBucket.PutInt("id", rawId); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "12378451245"); + rawId = CalllogInsertValues(valuesBucketTwo); + valuesBucketTwo.PutInt("id", rawId); + EXPECT_GT(rawId, 0); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("phone_number", "%37845%"); + predicates.OrderByAsc("id"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + // resultSet count 0 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucketTwo, resultSet, "calllog_Query_test_400"); + resultSet->Close(); + ClearCallLog(); +} + +/** + * @tc.number abnormal_calllog_Query_test_500 + * @tc.name An error field is passed in during fuzzy query based on mobile phone number + * @tc.desc Query the call history of the mobile phone number starting with 123 and ending with 8910 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(CalllogFuzzyQueryTest, abnormal_calllog_Query_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("----abnormal_calllog_Query_test_500 is starting!----"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "12378418910"); + int rawId = CalllogInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + valuesBucket.PutInt("id", rawId); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("phone_number", "12374589961"); + rawId = CalllogInsertValues(valuesBucketTwo); + valuesBucketTwo.PutInt("id", rawId); + EXPECT_GT(rawId, 0); + + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("phone_numbers", "1238910516156465%"); + predicates.OrderByAsc("id"); + std::shared_ptr resultSet = CalllogQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + resultSet->Close(); + ClearCallLog(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/contactability_test.cpp b/test/unittest/src/contactability_test.cpp new file mode 100644 index 0000000..6085bf7 --- /dev/null +++ b/test/unittest/src/contactability_test.cpp @@ -0,0 +1,3679 @@ +/* + * Copyright (c) 2021 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 "contactability_test.h" + +#include "data_ability_operation_builder.h" + +namespace Contacts { +namespace Test { +ContactAbilityTest::ContactAbilityTest() +{ +} + +ContactAbilityTest::~ContactAbilityTest() +{ +} + +int64_t ContactAbilityTest::RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactAbilityTest::RawContactExpandInsert( + std::vector valueVector, int isFavorite, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + int indexZero = 0; + int indexOne = 1; + int indexTwo = 2; + int indexThree = 3; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + rawContactValues.PutString("display_name", valueVector[indexZero]); + rawContactValues.PutString("company", valueVector[indexOne]); + rawContactValues.PutString("position", valueVector[indexTwo]); + rawContactValues.PutInt("favorite", isFavorite); + rawContactValues.PutString("phonetic_name", valueVector[indexThree]); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactAbilityTest::RawContactLastContactedInsert( + std::string displayName, int lastestContactedTime, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + rawContactValues.PutInt("lastest_contacted_time", lastestContactedTime); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactAbilityTest::ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues) +{ + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", contentType); + contactDataValues.PutString("detail_info", detailInfo); + contactDataValues.PutString("position", position); + int64_t code = contactsDataAbility.Insert(uriContactData, contactDataValues); + return code; +} + +int64_t ContactAbilityTest::GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues) +{ + OHOS::Uri uriGroups(ContactsUri::GROUPS); + groupValues.PutString("group_name", groupName); + int64_t code = contactsDataAbility.Insert(uriGroups, groupValues); + return code; +} + +int64_t ContactAbilityTest::ContactBlocklistInsert( + std::string phoneNumber, OHOS::NativeRdb::ValuesBucket &contactBlocklistValues) +{ + OHOS::Uri uriBlacklist(ContactsUri::BLOCKLIST); + contactBlocklistValues.PutString("phone_number", phoneNumber); + int64_t code = contactsDataAbility.Insert(uriBlacklist, contactBlocklistValues); + return code; +} + +int ContactAbilityTest::ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + code = contactsDataAbility.Update(uriRawContact, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + code = contactsDataAbility.Update(uriContactData, updateValues, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + code = contactsDataAbility.Update(uriGroups, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + code = contactsDataAbility.Update(uriBlocklist, updateValues, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +int ContactAbilityTest::ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + code = contactsDataAbility.Delete(uriRawContact, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + code = contactsDataAbility.Delete(uriContactData, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + code = contactsDataAbility.Delete(uriGroups, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + code = contactsDataAbility.Delete(uriBlocklist, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + code = contactsDataAbility.Delete(uriContact, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT_RECORD) { + OHOS::Uri deleteRawContact(ContactsUri::DELETED_RAW_CONTACT_RECORD); + code = contactsDataAbility.Delete(deleteRawContact, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +std::shared_ptr ContactAbilityTest::ContactQuery( + const std::string &tableName, std::vector &columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriRawContact, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + resultSet = contactsDataAbility.Query(uriContactData, columns, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + resultSet = contactsDataAbility.Query(uriContact, columns, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + resultSet = contactsDataAbility.Query(uriGroups, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + resultSet = contactsDataAbility.Query(uriBlocklist, columns, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT) { + OHOS::Uri uriDeletedRawContact(ContactsUri::DELETED_RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriDeletedRawContact, columns, predicates); + } else if (tableName == ContactTabName::SEARCH_CONTACT) { + OHOS::Uri uriSearchContact(ContactsUri::SEARCH); + resultSet = contactsDataAbility.Query(uriSearchContact, columns, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return resultSet; +} + +void ContactAbilityTest::QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName) +{ + std::vector columns; + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + CheckResultSet(values, resultSet, testName); +} + +int64_t ContactAbilityTest::RawContactInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + int64_t code = contactsDataAbility.Insert(uriRawContact, values); + return code; +} + +int64_t ContactAbilityTest::ContactDataInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + int64_t code = contactsDataAbility.Insert(uriContactData, values); + return code; +} + +int64_t ContactAbilityTest::GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriGroups(ContactsUri::GROUPS); + int64_t code = contactsDataAbility.Insert(uriGroups, values); + return code; +} + +int64_t ContactAbilityTest::ContactBlocklistInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriContactBolcklist(ContactsUri::BLOCKLIST); + int64_t code = contactsDataAbility.Insert(uriContactBolcklist, values); + return code; +} + +void ContactAbilityTest::GetAllRawContactColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("photo_id"); + columnInt.push_back("photo_file_id"); + columnInt.push_back("is_transfer_voicemail"); + columnInt.push_back("account_id"); + columnInt.push_back("version"); + columnInt.push_back("contacted_count"); + columnInt.push_back("lastest_contacted_time"); + columnInt.push_back("favorite"); + columnInt.push_back("phonetic_name_type"); + columnInt.push_back("read_only"); + columnInt.push_back("merge_mode"); + columnInt.push_back("is_need_merge"); + columnInt.push_back("merge_status"); + columnInt.push_back("is_merge_target"); + columnInt.push_back("vibration_setting"); + columnInt.push_back("sync_id"); + + columnStr.push_back("personal_ringtone"); + columnStr.push_back("personal_notification_ringtone"); + columnStr.push_back("photo_first_name"); + columnStr.push_back("display_name"); + columnStr.push_back("sort"); + columnStr.push_back("favorite_order"); + columnStr.push_back("phonetic_name"); + columnStr.push_back("company"); + columnStr.push_back("position"); + columnStr.push_back("sort_first_letter"); + columnStr.push_back("syn_1"); + columnStr.push_back("syn_2"); + columnStr.push_back("syn_3"); +} + +void ContactAbilityTest::GetAllContactDataColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("read_only"); + columnInt.push_back("version"); + columnInt.push_back("is_preferred_number"); + + columnStr.push_back("detail_info"); + columnStr.push_back("family_name"); + columnStr.push_back("middle_name_phonetic"); + columnStr.push_back("given_name"); + columnStr.push_back("given_name_phonetic"); + columnStr.push_back("alias_detail_info"); + columnStr.push_back("phonetic_name"); + columnStr.push_back("position"); + columnStr.push_back("extend1"); + columnStr.push_back("extend2"); + columnStr.push_back("extend3"); + columnStr.push_back("extend4"); + columnStr.push_back("city"); + columnStr.push_back("country"); + columnStr.push_back("neighborhood"); + columnStr.push_back("pobox"); + columnStr.push_back("region"); + columnStr.push_back("street"); + columnStr.push_back("alpha_name"); + columnStr.push_back("other_lan_last_name"); + columnStr.push_back("other_lan_first_name"); + columnStr.push_back("lan_style"); + columnStr.push_back("custom_data"); + columnStr.push_back("extend6"); + columnStr.push_back("extend7"); + columnStr.push_back("syn_1"); + columnStr.push_back("syn_2"); + columnStr.push_back("syn_3"); +} + +void ContactAbilityTest::GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("account_id"); + columnInt.push_back("ringtone_modify_time"); + columnInt.push_back("lastest_modify_time"); + columnStr.push_back("group_name"); + columnStr.push_back("group_notes"); + columnStr.push_back("group_ringtone"); +} + +void ContactAbilityTest::GetAllContactBlocklistColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("types"); + columnStr.push_back("phone_number"); + columnStr.push_back("content"); + columnStr.push_back("time_stamp"); +} + +void ContactAbilityTest::GetDetailsContactDataColumns(std::vector &columns) +{ + columns.push_back("email"); + columns.push_back("im"); + columns.push_back("nickname"); + columns.push_back("organization"); + columns.push_back("phone"); + columns.push_back("name"); + columns.push_back("postal_address"); + columns.push_back("photo"); + columns.push_back("group_membership"); + columns.push_back("note"); + columns.push_back("contact_event"); + columns.push_back("website"); + columns.push_back("relation"); + columns.push_back("contact_misc"); + columns.push_back("hicall_device"); + columns.push_back("camcard"); + columns.push_back("sip_address"); +} + +void ContactAbilityTest::MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr) +{ + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + columns.push_back(columnsInt[i]); + } + int columnsStrSize = columnsStr.size(); + for (int i = 0; i < columnsStrSize; i++) { + columns.push_back(columnsStr[i]); + } +} + +/** + * @brief get ValuesBucket + * @params columnsStart column start index + * @params columnsEnd column end index + * @return ValuesBucket + */ +OHOS::NativeRdb::ValuesBucket ContactAbilityTest::GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + int randomInt = 0; + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + randomInt = ContactsRand(); + HILOG_INFO("rand=%{public}d", randomInt); + valuesBucket.PutInt(columnsInt[i], randomInt); + } + std::string randomStr = ""; + int columnsStringSize = columnsStr.size(); + for (int i = 0; i < columnsStringSize; i++) { + randomStr = columnsStr[i] + std::to_string(ContactsRand()); + valuesBucket.PutString(columnsStr[i], randomStr); + } + + return valuesBucket; +} + +void ContactAbilityTest::ClearContacts() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 1000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number contact_Insert_test_100 + * @tc.name Add the basic information of a single contact and verify whether the insertion is successful + * @tc.desc New capabilities for basic contact data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("liming", values); + HILOG_INFO("contact_Insert_test_100 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_100"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_200 + * @tc.name Add the basic information of multiple contacts and verify whether the insertion is successful + * @tc.desc New capabilities for basic contact data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactIdOne = RawContactInsert("xiaoqian", values); + HILOG_INFO("contact_Insert_test_200 : rawContactIdOne = %{public}lld", rawContactIdOne); + EXPECT_GT(rawContactIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_200"); + values.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("xiaowang", values); + HILOG_INFO("contact_Insert_test_200 : rawContactIdTwo = %{public}lld", rawContactIdTwo); + EXPECT_GT(rawContactIdTwo, 0); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_200"); + predicates.Clear(); + + int64_t rawContactIdThree = RawContactInsert("xiaozhou", values); + HILOG_INFO("contact_Insert_test_200 : rawContactIdThree = %{public}lld", rawContactIdThree); + EXPECT_GT(rawContactIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_200"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_300 + * @tc.name Add a full field data to the raw_contact table and verify whether the insertion is successful + * @tc.desc Added ability to raw_contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Insert_test_300 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string rawContacts = ContactTabName::RAW_CONTACT; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_300"); + ClearContacts(); +} + +/* +* @tc.number contact_Insert_test_400 +* @tc.name Add the basic information of a single contact and verify whether the insertion is successful + (name, name Pinyin, Pinyin name, company, position, favorite or not) +* @tc.desc Add basic information of a single contact +* @tc.level Level1 +* @tc.size MediumTest +* @tc.type Function +*/ +HWTEST_F(ContactAbilityTest, contact_Insert_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("liming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("liming||lm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contact_Insert_test_400 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_400"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_500 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including name, nickname, company, position, mobile phone number and email address) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_500 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("ligang", rawContactValues); + HILOG_INFO("contact_Insert_test_500 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "ligang", "", values); + HILOG_INFO("contact_Insert_test_500 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + HILOG_INFO("contact_Insert_test_500 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "email", "8523@163.com", "", values); + HILOG_INFO("contact_Insert_test_500 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "phone", "188520314", "", values); + HILOG_INFO("contact_Insert_test_500 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdFive = ContactDataInsert(rawContactId, "nickname", "xiaogang", "", values); + HILOG_INFO("contact_Insert_test_500 : contactDataIdFive = %{public}lld", contactDataIdFive); + EXPECT_GT(contactDataIdFive, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFive)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_500"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_600 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including home, group, aim, notes, and URL) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_600 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("chengshao", values); + HILOG_INFO("contact_Insert_test_600 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "postal_address", "NanJingCity", "", values); + HILOG_INFO("contact_Insert_test_600 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "group_membership", "1", "", values); + HILOG_INFO("contact_Insert_test_600 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "note", "dalao", "", values); + HILOG_INFO("contact_Insert_test_600 : contactDataIdThree = %{public}lld", contactDataIdThree); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "im", "aaaa", "", values); + HILOG_INFO("contact_Insert_test_600 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdFive = ContactDataInsert(rawContactId, "website", "www.48236.com", "", values); + HILOG_INFO("contact_Insert_test_600 : contactDataIdFive = %{public}lld", contactDataIdFive); + EXPECT_GT(contactDataIdFive, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFive)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_600"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_700 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including phone ring tones, birthdays, and assistants) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_700 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("yanshao", values); + HILOG_INFO("contact_Insert_test_700 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "contact_event", "19960229", "", values); + HILOG_INFO("contact_Insert_test_700 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_700"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "relation", "Secretary", "", values); + HILOG_INFO("contact_Insert_test_700 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_700"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "contact_misc", "1314", "", values); + HILOG_INFO("contact_Insert_test_700 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_700"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_800 + * @tc.name Add all details of a single contact and verify whether the insertion is successful + * (name, mobile number, company, position, nickname, email, home, remarks, aim, birthday, website, + * assistant, group, phone ring) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_800 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("insert_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + GetDetailsContactDataColumns(columns); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::NativeRdb::ValuesBucket valuesBucket; + + std::string randomStr = ""; + std::string tableName = ContactTabName::CONTACT_DATA; + int columnSize = columns.size(); + for (int i = 0; i < columnSize; i++) { + randomStr = columns[i] + std::to_string(ContactsRand()); + valuesBucket.PutInt("raw_contact_id", rawContactId); + valuesBucket.PutString("content_type", columns[i]); + valuesBucket.PutString("detail_info", randomStr); + int contactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(contactDataId, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + std::shared_ptr resultSet = + ContactQuery(tableName, columnQuery, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_800"); + valuesBucket.Clear(); + } + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_900 + * @tc.name Add multiple contact details and verify that the insertion was successful + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_900 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("xiaoming", values); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "xiaoming", "", values); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_900"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_900"); + values.Clear(); + + rawContactId = RawContactInsert("lihong", values); + HILOG_INFO("contact_Insert_test_900 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "name", "lihong", "", values); + HILOG_INFO("contact_Insert_test_900 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_900"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + HILOG_INFO("contact_Insert_test_900 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contact_Insert_test_900"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_1000 + * @tc.name Add a full field data to the contact_data table and verify that the insertion was successful + * @tc.desc Added ability to contact_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Insert_test_1000 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaomao", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_1000"); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_1000"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1100 + * @tc.name Modify several basic information of the contact, and verify whether the modification is successful + * (including name, name Pinyin, Pinyin name, company, position and favorite) + * @tc.desc Contacts basic data table update ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contact_Update_test_1100 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_name", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("company", "XXXX"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("position", "Secretary"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("favorite", "0"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("phonetic_name", "dongming||dm"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1100"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1200 + * @tc.name Modify the basic information of multiple contacts and verify whether the modification is successful + * @tc.desc Contacts basic data table update ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactIdOne = RawContactInsert("zhangming", values); + EXPECT_GT(rawContactIdOne, 0); + values.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("ligang", values); + EXPECT_GT(rawContactIdTwo, 0); + values.Clear(); + + int64_t rawContactIdThree = RawContactInsert("wanghong", values); + EXPECT_GT(rawContactIdThree, 0); + values.Clear(); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_name", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1200"); + + updateValues.Clear(); + updateValues.PutString("display_name", std::string("laoliu")); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_1200"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1300 + * @tc.name Update the full field data of the raw_contact table and verify whether the modification is successful + * @tc.desc Support all raw_contact update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Update_test_1300 is starting!-----"); + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + std::string rawContacts = ContactTabName::RAW_CONTACT; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSetOne = ContactQuery(rawContacts, columns, predicates); + CheckResultSet(valuesBucket, resultSetOne, "contact_Update_test_1300"); + + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int upDateCode = ContactUpdate(rawContacts, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contact_Update_test_1300"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1400 + * @tc.name Modify the details of a single contact and verify whether the modification is successful + * (name, company, position and email address) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("ligang", values); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + OHOS::NativeRdb::ValuesBucket valuesOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "ligang", "", valuesOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", valuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesThree; + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "email", "8523@163.com", "", valuesThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1400"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "vivo"); + updateValues.PutString("position", "Developer"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1400"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "1220369@qq.com"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1400"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1500 + * @tc.name Modify the details of a single contact and verify that the modification is successful + * (mobile phone number, address and nickname) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaomi", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "phone", "1665230", "", contactDataValueOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "nickname", "xiaomi", "", contactDataValueTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueThree; + int64_t contactDataIdThree = + ContactDataInsert(rawContactId, "postal_address", "BeiJingFir", "", contactDataValueThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "33996652"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1500: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1500"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "mimi"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1500"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "NanJIngGulou"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1500"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1600 + * @tc.name Modify the details of individual contacts and verify whether the modification is successful + * (remarks, goals and birthdays) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "note", "dalao", "", contactDataValueOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "im", "aaaaaa", "", contactDataValueTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueThree; + int64_t contactDataIdThree = + ContactDataInsert(rawContactId, "contact_event", "19820314", "", contactDataValueThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "God"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1600"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "bcade"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1600: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1600"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "19820328"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1600: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1600"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1700 + * @tc.name Modify the details of a single contact and verify that the modification was successful + * (URL, assistant, and group) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1700 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "website", "www.aaa.com", "", contactValuesOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "relation", "fuzi", "", contactValuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesThree; + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "group_membership", "1", "", contactValuesThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "www.bbb.com"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1700"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "laozhang"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1700"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "2"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1700"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1800 + * @tc.name Modify the details of a single contact and verify that the modification was successful (phone ringing) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1800 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "contact_misc", "111", "", contactDataValues); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "222"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1800: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1800"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_1900 + * @tc.name Modify multiple contact details and verify whether the modification is successful + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_1900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_1900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("ligang", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "name", "ligang", "", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + contactDataId = ContactDataInsert(rawContactIdOne, "organization", "tiantianxaingshang", "Test", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("zhangming", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + contactDataId = ContactDataInsert(rawContactIdTwo, "name", "zhangming", "", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + contactDataId = ContactDataInsert(rawContactIdTwo, "organization", "tiantianxaingshang", "Test", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "lixiang"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactIdOne)); + predicates.And(); + // type 6 is phone + predicates.EqualTo("type_id", "6"); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1900"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "zhangsan"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactIdTwo)); + predicates.And(); + // type 6 is phone + predicates.EqualTo("type_id", "6"); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contact_Update_test_1900: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contact_Update_test_1900"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2000 + * @tc.name Update the full field data of the contact_data table and verify whether the modification is successful + * @tc.desc Update ability to contact_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Update_test_2000 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaotui", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type_id 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + + int upDateCode = ContactUpdate(tableName, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + OHOS::NativeRdb::ValueObject value; + valuesBucket.GetObject("version", value); + int versionCode = -1; + value.GetInt(versionCode); + versionCode += 1; + upDateValuesBucket.Delete("version"); + upDateValuesBucket.PutInt("version", versionCode); + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contact_Update_test_2000"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2100 + * @tc.name Update all contact details and verify that the modification was successful + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_2100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + GetDetailsContactDataColumns(columns); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::NativeRdb::ValuesBucket valuesBucket; + OHOS::NativeRdb::ValuesBucket upDateValuesBucket; + + std::string randomStr = ""; + std::string updateStrValue = ""; + std::string tableName = ContactTabName::CONTACT_DATA; + int columnSize = columns.size(); + for (int i = 0; i < columnSize; i++) { + randomStr = columns[i] + std::to_string(ContactsRand()); + valuesBucket.PutInt("raw_contact_id", rawContactId); + valuesBucket.PutString("content_type", columns[i]); + valuesBucket.PutString("detail_info", randomStr); + int contactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(contactDataId, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + updateStrValue = "update_all" + randomStr; + upDateValuesBucket.PutString("detail_info", updateStrValue); + int upDateCode = ContactUpdate(tableName, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + std::shared_ptr resultSet = + ContactQuery(tableName, columnQuery, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contact_Update_test_2100"); + + valuesBucket.Clear(); + upDateValuesBucket.Clear(); + } + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2200 + * @tc.name Add a single contact to your favorites and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_2200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaozong", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2200"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2300 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_2300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaowang", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("xiaozhou", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + rawContactValues.Clear(); + int64_t rawContactIdThree = RawContactInsert("laowei", rawContactValues); + EXPECT_GT(rawContactIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2300"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2300"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2300"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2400 + * @tc.name Unfriend individual contacts and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_2400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2400"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_2500 + * @tc.name Remove favorites from multiple contacts and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_2500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_2500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactId, 0); + + vectorValue.clear(); + values.Clear(); + vectorValue.push_back("laozhou"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("laozhou||lz"); + int64_t rawContactIdTwo = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactIdTwo, 0); + + vectorValue.clear(); + values.Clear(); + vectorValue.push_back("abiao"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("abiao||ab"); + int64_t rawContactIdThree = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contact_Update_test_2500 : rawContactIdThree = %{public}lld", rawContactIdThree); + EXPECT_GT(rawContactIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2500"); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2500"); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_2500"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_2600 + * @tc.name Add a single record to the blocklist and verify that the insertion was successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_2600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_2600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistId = ContactBlocklistInsert("10086", blocklistValues); + EXPECT_GT(blocklistId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistId)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contact_Insert_test_2600"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_2700 + * @tc.name Add multiple records to the blocklist and verify whether the insertion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_2700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_2700 is starting! ---"); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistIdOne = ContactBlocklistInsert("188520", blocklistValues); + EXPECT_GT(blocklistIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistIdOne)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contact_Insert_test_2700"); + + blocklistValues.Clear(); + predicates.Clear(); + int64_t blocklistIdTwo = ContactBlocklistInsert("130269", blocklistValues); + EXPECT_GT(blocklistIdTwo, 0); + predicates.EqualTo("id", std::to_string(blocklistIdTwo)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contact_Insert_test_2700"); + + blocklistValues.Clear(); + predicates.Clear(); + int64_t blocklistIdThree = ContactBlocklistInsert("772501", blocklistValues); + ; + EXPECT_GT(blocklistIdThree, 0); + predicates.EqualTo("id", std::to_string(blocklistIdThree)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contact_Insert_test_2700"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_2800 + * @tc.name Add a full field data to the contact_blocklist table and verify whether the insertion is successful + * @tc.desc Added ability to ContactBlocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_2800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Insert_test_2800 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_BLOCKLIST; + GetAllContactBlocklistColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int contactBlockId = ContactBlocklistInsertValues(valuesBucket); + EXPECT_GT(contactBlockId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactBlockId)); + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_2800"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_2900 + * @tc.name Delete a contact from the blocklist and verify whether the deletion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_2900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_2900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistId = ContactBlocklistInsert("147852369", blocklistValues); + EXPECT_GT(blocklistId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistId)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_3000 + * @tc.name Delete multiple contacts from the blocklist and verify whether the deletion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_3000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_3000 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistIdOne = ContactBlocklistInsert("111228855", blocklistValues); + EXPECT_GT(blocklistIdOne, 0); + + blocklistValues.Clear(); + int64_t blocklistIdTwo = ContactBlocklistInsert("11335566", blocklistValues); + EXPECT_GT(blocklistIdTwo, 0); + + blocklistValues.Clear(); + int64_t blocklistIdThree = ContactBlocklistInsert("9933220011", blocklistValues); + EXPECT_GT(blocklistIdThree, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(blocklistIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(blocklistIdThree)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_3100 + * @tc.name Delete a full field data of contact_blocklist table and verify whether the deletion is successful + * @tc.desc ContactBlocklist deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_3100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Delete_test_3100 is starting!-----"); + // insert + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + GetAllContactBlocklistColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int contacBlockId = ContactBlocklistInsertValues(valuesBucket); + EXPECT_GT(contacBlockId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contacBlockId)); + std::string tableName = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_3200 + * @tc.name Join a single contact to the group and verify whether the join is successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_3200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_3200 is staring! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupId = GroupsInsert("TestFirstGroup", groupValues); + EXPECT_GT(groupId, 0); + OHOS::NativeRdb::ValuesBucket contactDataValue; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", contactDataValue); + EXPECT_GT(contactDataId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataId)); + std::string contactData = ContactTabName::CONTACT_DATA; + QueryAndExpectResult(contactData, predicates, contactDataValue, "contact_Insert_test_3200"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_3300 + * @tc.name Multiple contacts join the group and verify whether the joining is successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_3300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_3300 is staring! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupIdOne = GroupsInsert("TestSecondGroup", groupValues); + EXPECT_GT(groupIdOne, 0); + groupValues.Clear(); + + int64_t groupIdTwo = GroupsInsert("DeveloperFirstGroup", groupValues); + EXPECT_GT(groupIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + rawContactValues.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("BossCai", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + int64_t contactDataIdOne = + ContactDataInsert(rawContactIdOne, "group_membership", std::to_string(groupIdOne), "", contactDataValuesOne); + EXPECT_GT(contactDataIdOne, 0); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, contactDataValuesOne, "contact_Insert_test_3300"); + + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + int64_t contactDataIdTwo = + ContactDataInsert(rawContactIdTwo, "group_membership", std::to_string(groupIdTwo), "", contactDataValuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, contactDataValuesTwo, "contact_Insert_test_3300"); + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_3400 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Added ability to groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_3400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Insert_test_3400 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string group = ContactTabName::GROUPS; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = GroupsInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = ContactQuery(group, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Insert_test_3400"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_3500 + * @tc.name Delete a single contact from the group and verify that the deletion was successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_3500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_3500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupId = GroupsInsert("CEO", groupValues); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", contactDataValues); + EXPECT_GT(contactDataId, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + predicates.And(); + // type_id 9 is group_membership + predicates.EqualTo("type_id", "9"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_3600 + * @tc.name Delete multiple contacts from the group and verify that the deletion was successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_3600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_3600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupIdOne = GroupsInsert("Test", groupValues); + HILOG_INFO("contact_Delete_test_3600: groupIdOne = %{public}lld", groupIdOne); + EXPECT_GT(groupIdOne, 0); + + groupValues.Clear(); + int64_t groupIdTwo = GroupsInsert("Developer", groupValues); + HILOG_INFO("contact_Delete_test_3600: groupIdTwo = %{public}lld", groupIdTwo); + EXPECT_GT(groupIdTwo, 0); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("xiaoyuan", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataIdOne = + ContactDataInsert(rawContactIdOne, "group_membership", std::to_string(groupIdOne), "", contactDataValues); + EXPECT_GT(contactDataIdOne, 0); + + contactDataValues.Clear(); + int64_t contactDataIdTwo = + ContactDataInsert(rawContactIdTwo, "group_membership", std::to_string(groupIdTwo), "", contactDataValues); + EXPECT_GT(contactDataIdTwo, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + std::shared_ptr resultSetTwo = ContactQuery(contactData, columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(0, rowCountTwo); + resultSetTwo->Close(); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_3700 + * @tc.name Delete the full field data of a groups table and verify whether the deletion is successful + * @tc.desc Groups deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_3700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Delete_test_3700 is starting!-----"); + // insert + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int groupId = GroupsInsertValues(valuesBucket); + EXPECT_GT(groupId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + EXPECT_GT(groupId, 0); + std::string tableName = ContactTabName::GROUPS; + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_3800 + * @tc.name Insert contact information and query contact information according to the returned ID + * @tc.desc The ability to query the basic information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_3800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_3800 is starting! ---"); + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + columns.push_back("favorite"); + columns.push_back("phonetic_name"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("display_name", "xiaoyuan"); + valuesBucket.PutString("company", "tiantianxiangshang"); + valuesBucket.PutString("position", "Test"); + valuesBucket.PutInt("favorite", 1); + valuesBucket.PutString("phonetic_name", "xiaoyuanxy"); + + int64_t rawContactId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Query_test_3800"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_3900 + * @tc.name Insert multiple contact information and query the contact information according to the returned ID + * @tc.desc The ability to query the basic information of multiple contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_3900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_3900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("display_name", "xiaohei"); + valuesBucketOne.PutString("company", "tiantianxiangshang"); + valuesBucketOne.PutString("position", "Test"); + valuesBucketOne.PutInt("favorite", 1); + valuesBucketOne.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdOne = RawContactInsertValues(valuesBucketOne); + EXPECT_GT(rawContactIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("display_name", "xiaobai"); + valuesBucketTwo.PutString("company", "tiantianxiangshang"); + valuesBucketTwo.PutString("position", "Test"); + valuesBucketTwo.PutInt("favorite", 1); + valuesBucketTwo.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdTwo = RawContactInsertValues(valuesBucketTwo); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketThr; + valuesBucketThr.PutString("display_name", "xiaocai"); + valuesBucketThr.PutString("company", "tiantianxiangshang"); + valuesBucketThr.PutString("position", "Test"); + valuesBucketThr.PutInt("favorite", 1); + valuesBucketThr.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdThr = RawContactInsertValues(valuesBucketThr); + EXPECT_GT(rawContactIdThr, 0); + + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + columns.push_back("favorite"); + columns.push_back("phonetic_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThr)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + std::vector listValue; + listValue.push_back(valuesBucketOne); + listValue.push_back(valuesBucketTwo); + listValue.push_back(valuesBucketThr); + CheckResultSetList(listValue, resultSet, "contact_Query_test_3900"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4000 + * @tc.name Query the basic information of all contacts in the raw_contact table + * @tc.desc The ability to query the basic information of all contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4000 is starting! ---"); + std::string tag("contact_Query_test_4000"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("display_name", "xiaohsaaei"); + valuesBucketOne.PutString("company", "tiantianxiadsjjnngshang"); + valuesBucketOne.PutString("position", "Tests"); + valuesBucketOne.PutInt("favorite", 1); + valuesBucketOne.PutString("phonetic_name", "xiaohssei||x00h"); + RawContactInsertValues(valuesBucketOne); + RawContactInsertValues(valuesBucketOne); + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.EqualTo("is_deleted", "0"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + // resultSet count + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 1); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4100 + * @tc.name Insert all contact information and query + * @tc.desc The ability to query all information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Query_test_4100 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("favorite", "1"); + int64_t rawContactId = RawContactInsert("feimaomao4100", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + CheckResultSet(valuesBucket, resultSet, "contact_Query_test_4100"); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Query_test_4100"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4200 + * @tc.name Add a group and add two new contacts to the group to query the members of the group + * @tc.desc Query group member ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4200 is starting! ---"); + std::string tag("contact_Query_test_4200"); + OHOS::NativeRdb::ValuesBucket valuesBucketGroup; + int64_t groupId = GroupsInsert("dongshihui", valuesBucketGroup); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValuesBucket; + int64_t rawContactId = RawContactInsert("licheng", rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", valuesBucketOne); + EXPECT_GT(contactDataId, 0); + + rawContactValuesBucket.Clear(); + rawContactId = RawContactInsert("xiaoyuan", rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + contactDataId = ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", valuesBucketTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("detail_info", std::to_string(groupId)); + predicates.And(); + // type_id 9 is group_membership + predicates.EqualTo("type_id", "9"); + std::string contactData = ContactTabName::CONTACT_DATA; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(valuesBucketOne); + listValue.push_back(valuesBucketTwo); + CheckResultSetList(listValue, resultSet, "contact_Query_test_4200"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4300 + * @tc.name Query favorite contacts + * @tc.desc Query the ability of favorite contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("display_name", "xiaoyuan"); + valuesBucket.PutString("company", "tiantianxiangshang"); + valuesBucket.PutString("position", "Test"); + valuesBucket.PutInt("favorite", 1); + valuesBucket.PutString("phonetic_name", "xiaoyuanxy"); + + int64_t rawContactId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("favorite", "1"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("id", std::to_string(rawContactId)); + + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contact_Query_test_4300"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4400 + * @tc.name Query recent contacts + * @tc.desc Query recent contact ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValuesBucket; + int64_t rawContactId = RawContactLastContactedInsert("wangwu", 60, rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("lastest_contacted_time"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("lastest_contacted_time", "60"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(rawContactValuesBucket, resultSet, "contact_Query_test_4400"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4500 + * @tc.name Query the recently deleted contacts in the deleted contacts table + * @tc.desc Ability to query recently deleted contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaobai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("display_name"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(rawContactValues, resultSet, "contact_Query_test_4500"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4600 + * @tc.name Query the mobile phone numbers of all contacts + * @tc.desc Query the capabilities of all mobile phone numbers + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4600 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "phone", "155825478", "", contactDataValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + int64_t rawContactIdTwo = RawContactInsert("xiaocai", rawContactValuesTwo); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataId = ContactDataInsert(rawContactIdTwo, "phone", "18853269857", "", contactDataValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + predicates.Clear(); + // type_id 5 is phone + predicates.EqualTo("type_id", "5"); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactDataValues); + listValue.push_back(contactDataValuesTwo); + CheckResultSetList(listValue, resultSet, "contact_Query_test_4600"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4700 + * @tc.name Query mailbox of all contacts + * @tc.desc Query all mailbox capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4700 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + rawContactValues.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "email", "166@163.com", "", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + contactDataId = ContactDataInsert(rawContactIdTwo, "email", "199@163.com", "", contactValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + predicates.Clear(); + // type_id 1 is email + predicates.EqualTo("type_id", "1"); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactValues); + listValue.push_back(contactValuesTwo); + CheckResultSetList(listValue, resultSet, "contact_Query_test_4700"); + ClearContacts(); +} + +/* + * @tc.number contact_Query_test_4800 + * @tc.name Query information about a single contact + * @tc.desc Ability to query data information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Query_test_4800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Query_test_4800 is starting! ---"); + std::string tag("contact_Query_test_4800"); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("BossCai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "BossCai", "", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + contactDataId = ContactDataInsert(rawContactId, "organization", "happy500", "Test", contactValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string contactData = ContactTabName::CONTACT_DATA; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactValues); + listValue.push_back(contactValuesTwo); + CheckResultSetList(listValue, resultSet, "contact_Query_test_4800"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_4900 + * @tc.name Query the deleted contact according to the original contact ID + * @tc.desc Ability to delete contact data from the basic raw data table and record basic raw data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_4900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_4900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + HILOG_INFO("rawContactId= %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contact_Delete_test_4900"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_5000 + * @tc.name Delete a single full field data in the raw_contact table + * @tc.desc Raw contact deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_5000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Delete_test_5000 is starting!-----"); + // insert + std::vector columnsInt; + std::vector columnsStr; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + EXPECT_GT(rawId, 0); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + columns.push_back("is_deleted"); + OHOS::NativeRdb::ValuesBucket valuesBucketDelete; + valuesBucketDelete.PutInt("is_deleted", 1); + QueryAndExpectResult(rawContacts, predicates, valuesBucketDelete, "contact_Delete_test_5000"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_5100 + * @tc.name Query the details of the newly deleted contact + * @tc.desc Ability to delete contact data from the detailed data table and record detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_5100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_5100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("siyuan", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValue; + int64_t contactDataId = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", contactValue); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contact_Delete_test_5100"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_5200 + * @tc.name Delete a single full field data in the contact_data table + * @tc.desc Deleted ability to contact_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_5200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_Delete_test_5200 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaotui", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type id 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + // resultSet count 0 + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_test_5300 + * @tc.name Query deleted basic data + * @tc.desc Ability to delete and record basic data of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_5300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_5300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaohong", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("name_raw_contact_id", std::to_string(rawContactId)); + std::string contact = ContactTabName::CONTACT; + int deleteCode = ContactDelete(contact, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contact_Delete_test_5300"); + ClearContacts(); +} + +/* + * @tc.number contact_BatchInsert_test_5400 + * @tc.name Add basic contact information in batch and verify whether the insertion is successful + * @tc.desc Bulk increase capacity of address book + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_BatchInsert_test_5400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_BatchInsert_test_5400 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValuesOne; + rawContactValuesOne.PutString("display_name", std::string("zhangming")); + rawContactValuesOne.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesOne.PutString("position", std::string("Test")); + + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + rawContactValuesTwo.PutString("display_name", std::string("ligang")); + rawContactValuesTwo.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesTwo.PutString("position", std::string("Developer")); + + OHOS::NativeRdb::ValuesBucket rawContactValuesThree; + rawContactValuesThree.PutString("display_name", std::string("wanghong")); + rawContactValuesThree.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesThree.PutString("position", std::string("manage")); + + std::vector listAddBluk; + listAddBluk.push_back(rawContactValuesOne); + listAddBluk.push_back(rawContactValuesTwo); + listAddBluk.push_back(rawContactValuesThree); + + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + std::string rawContacts = ContactTabName::RAW_CONTACT; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("company", "tiantainxiangzuo4200000000"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + predicates.OrderByAsc("id"); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + int rowCount = 0; + int queryCount = 3; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(queryCount, rowCount); + CheckResultSetList(listAddBluk, resultSet, "contact_BatchInsert_test_5400"); + ClearContacts(); +} + +/* + * @tc.number contact_BatchInsert_test_5500 + * @tc.name Batch add contact details and verify that the insertion was successful + * @tc.desc Bulk increase capacity of address book + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_BatchInsert_test_5500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_BatchInsert_test_5500 is starting! ---"); + + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_name", "zhangming"); + int64_t rawContactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + EXPECT_GT(rawContactId, 0); + + std::vector listAddBluk = GetBatchList(rawContactId); + ; + int batchInserCode = contactsDataAbility.BatchInsert(uriContactData, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + // type_id 1 is email + predicates.EqualTo("type_id", "1"); + predicates.And(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + int indexTwo = 2; + CheckResultSet(listAddBluk[indexTwo], resultSet, "contact_BatchInsert_test_5500"); + predicates.Clear(); + // type 5 is phone + predicates.EqualTo("type_id", "5"); + predicates.And(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSetFour = ContactQuery(contactData, columns, predicates); + int rowCountFour = 0; + resultSetFour->GetRowCount(rowCountFour); + EXPECT_EQ(1, rowCountFour); + int indexThree = 3; + CheckResultSet(listAddBluk[indexThree], resultSetFour, "contact_BatchInsert_test_5500"); + ClearContacts(); +} + +std::vector ContactAbilityTest::GetBatchList(int64_t rawContactId) +{ + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + contactDataValuesOne.PutInt("raw_contact_id", rawContactId); + contactDataValuesOne.PutString("content_type", "name"); + contactDataValuesOne.PutString("detail_info", "zhangming"); + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataValuesTwo.PutInt("raw_contact_id", rawContactId); + contactDataValuesTwo.PutString("content_type", "organization"); + contactDataValuesTwo.PutString("detail_info", "tiantianxaingshang"); + contactDataValuesTwo.PutString("position", "Test"); + OHOS::NativeRdb::ValuesBucket contactDataValuesThree; + contactDataValuesThree.PutInt("raw_contact_id", rawContactId); + contactDataValuesThree.PutString("content_type", "email"); + contactDataValuesThree.PutString("detail_info", "199632@163.com"); + OHOS::NativeRdb::ValuesBucket contactDataValuesFour; + contactDataValuesFour.PutInt("raw_contact_id", rawContactId); + contactDataValuesFour.PutString("content_type", "phone"); + contactDataValuesFour.PutString("detail_info", "1234567898"); + std::vector listAddBluk; + listAddBluk.push_back(contactDataValuesOne); + listAddBluk.push_back(contactDataValuesTwo); + listAddBluk.push_back(contactDataValuesThree); + listAddBluk.push_back(contactDataValuesFour); + return listAddBluk; +} + +/* + * @tc.number contact_Delete_test_5600 + * @tc.name Delete contacts in batch and verify whether the deletion is successful + * @tc.desc delete ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_test_5600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_test_5600 is starting!---"); + int time = 10000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactIdOne = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdOne, 0); + int64_t rawContactIdTwo = RawContactInsert("update_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(ContactsUri::RAW_CONTACT); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewDeleteBuilder(uri) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + contactsDataAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::string tableName = ContactTabName::CONTACT_DATA; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + predicates.EqualTo("is_deleted", "0"); + std::shared_ptr resultSet = ContactQuery(tableName, columnQuery, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_5700 + * @tc.name Batch favorite / cancel favorite contacts + * @tc.desc Batch collection and uncollection capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_5700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_5700 is starting! ---"); + + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValuesOne; + rawContactValuesOne.PutString("display_name", "zhangmingming"); + rawContactValuesOne.PutInt("favorite", 1); + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + rawContactValuesTwo.PutString("display_name", "yuanmoumou"); + rawContactValuesTwo.PutInt("favorite", 1); + OHOS::NativeRdb::ValuesBucket rawContactValuesThree; + rawContactValuesThree.PutString("display_name", "xiaofenren"); + rawContactValuesThree.PutInt("favorite", 1); + + std::vector listAddBluk; + listAddBluk.push_back(rawContactValuesOne); + listAddBluk.push_back(rawContactValuesTwo); + listAddBluk.push_back(rawContactValuesThree); + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("contact_Update_test_5700 : batchInserCode = %{public}d", batchInserCode); + EXPECT_EQ(batchInserCode, 0); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("display_name", "zhangmingming"); + predicates.Or(); + predicates.EqualTo("display_name", "yuanmoumou"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("contact_Update_test_5700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("display_name", "zhangmingming"); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contact_Update_test_5700"); + + predicates.Clear(); + predicates.EqualTo("display_name", "xiaofenren"); + QueryAndExpectResult(rawContacts, predicates, rawContactValuesThree, "contact_Update_test_5700"); + ClearContacts(); +} + +/* + * @tc.number contact_Update_test_5800 + * @tc.name Update the contact in batch and verify whether the modification is successful + * @tc.desc update ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Update_test_5800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Update_test_5800 is starting!---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactIdOne = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdOne, 0); + int64_t rawContactIdTwo = RawContactInsert("update_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + std::shared_ptr values = + std::make_shared(rawValuesBucket); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(ContactsUri::RAW_CONTACT); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewUpdateBuilder(uri) + ->WithValuesBucket(values) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + contactsDataAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::string tableName = ContactTabName::RAW_CONTACT; + std::vector columnQuery; + columnQuery.push_back("display_name"); + std::shared_ptr resultSet = ContactQuery(tableName, columnQuery, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(rawValuesBucket); + listValue.push_back(rawValuesBucket); + CheckResultSetList(listValue, resultSet, "contact_Update_test_5800"); + ClearContacts(); +} + +/* + * @tc.number contact_BatchInsertAndDelete_test_5900 + * @tc.name Batch add / delete contact blocklist + * @tc.desc Ability to add and remove contacts from the blocklist in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_BatchInsertAndDelete_test_5900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_BatchInsertAndDelete_test_5900 is starting! ---"); + OHOS::Uri uriContactBlacklist(ContactsUri::BLOCKLIST); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesOne; + contactBlacklistValuesOne.PutString("phone_number", "147258369"); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesTwo; + contactBlacklistValuesTwo.PutString("phone_number", "963852741"); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesThree; + contactBlacklistValuesThree.PutString("phone_number", "1234789602"); + + std::vector listAddBluk; + listAddBluk.push_back(contactBlacklistValuesOne); + listAddBluk.push_back(contactBlacklistValuesTwo); + listAddBluk.push_back(contactBlacklistValuesThree); + int batchInsertCode = contactsDataAbility.BatchInsert(uriContactBlacklist, listAddBluk); + EXPECT_EQ(batchInsertCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", std::string("147258369")); + predicates.Or(); + predicates.EqualTo("phone_number", std::string("963852741")); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contact_BatchInsertAndDelete_test_6000 + * @tc.name Batch add contacts to the group, and then delete contacts from the group + * @tc.desc Ability to join or remove contacts from groups in bulk + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_BatchInsertAndDelete_test_6000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_BatchInsertAndDelete_test_6000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupIdOne = GroupsInsert("TestFourth", valuesGroup); + EXPECT_GT(groupIdOne, 0); + + valuesGroup.Clear(); + int64_t groupIdTwo = GroupsInsert("TestFifth", valuesGroup); + EXPECT_GT(groupIdTwo, 0); + + valuesGroup.Clear(); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocheng", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + contactDataValuesOne.PutInt("raw_contact_id", rawContactId); + contactDataValuesOne.PutString("content_type", std::string("group_membership")); + contactDataValuesOne.PutString("detail_info", std::to_string(groupIdOne)); + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataValuesTwo.PutInt("raw_contact_id", rawContactId); + contactDataValuesTwo.PutString("content_type", std::string("group_membership")); + contactDataValuesTwo.PutString("detail_info", std::to_string(groupIdTwo)); + + std::vector listAddBluk; + listAddBluk.push_back(contactDataValuesOne); + listAddBluk.push_back(contactDataValuesTwo); + int batchInserCode = contactsDataAbility.BatchInsert(uriContactData, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + predicates.And(); + predicates.EqualTo("detail_info", std::to_string(groupIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Insert_test_6100 + * @tc.name When inserting a contact, pass in a non-existent field or table name + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Insert_test_6100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_Insert_test_6100 is starting! ---"); + + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::Uri errorUri(ContactsUri::ERROR_URI); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_names", "liming"); + int64_t rawontactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + HILOG_INFO("abnormal_contact_Insert_test_6100 : rawontactId = %{public}lld", rawontactId); + EXPECT_EQ(rawontactId, -1); + + rawContactValues.Clear(); + rawContactValues.PutString("display_name", "liming"); + rawontactId = contactsDataAbility.Insert(errorUri, rawContactValues); + EXPECT_EQ(rawontactId, -1); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Insert_test_6200 + * @tc.name Verification of required fields(type_id) in contact_data table + * @tc.desc Added ability to contact_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Insert_test_6200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_contact_Insert_test_6200 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("lock_type_id", rawValuesBucket); + valuesBucket.PutInt("raw_contact_id", rawContactId); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_EQ(ContactDataId, -1); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + // resultSet count 0 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + CheckResultSet(valuesBucket, resultSet, "abnormal_contact_Insert_test_6200"); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Insert_test_6300 + * @tc.name Verification of required fields(raw_contact_id) in contact_data table + * @tc.desc Added ability to contact_data + * @tc.level Level1 + * @tc.size MediumTest + * + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Insert_test_6300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_contact_Insert_test_6300 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("lock_raw_contact_id", rawValuesBucket); + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_EQ(ContactDataId, -1); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + // resultSet count 0 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + CheckResultSet(valuesBucket, resultSet, "abnormal_contact_Insert_test_6300"); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Update_test_6400 + * @tc.name When modifying, an incorrect field or table name or non-existent value is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Update_test_6400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_Update_test_6400 is starting! ---"); + OHOS::Uri errorUri(ContactsUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("zhangming", rawContactValues); + HILOG_INFO("abnormal_contact_Update_test_6400 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_names", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("abnormal_contact_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(rawContacts, predicates, rawContactValues, "abnormal_contact_Update_test_6400"); + + updateValues.Clear(); + updateValues.PutString("display_name", "dongming"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + updateCode = contactsDataAbility.Update(errorUri, updateValues, predicates); + HILOG_INFO("abnormal_contact_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(rawContacts, predicates, rawContactValues, "abnormal_contact_Update_test_6400"); + + predicates.Clear(); + predicates.EqualTo("id", "100000"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("abnormal_contact_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Query_test_6500 + * @tc.name A wrong field was passed in when querying + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Query_test_6500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_Query_test_6500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("display_names"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -2; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Query_test_6600 + * @tc.name Pass in a non-existent table name when querying + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Query_test_6600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_Query_test_6600 is starting! ---"); + std::string tag("abnormal_contact_Query_test_6600"); + + OHOS::Uri errorUri(ContactsUri::ERROR_URI); + + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + contactsDataAbility.Query(errorUri, columns, predicates); + EXPECT_EQ(resultSet, nullptr); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_Delete_test_6700 + * @tc.name When deleting, pass in an incorrect field or table name or a non-existent value + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_Delete_test_6700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------abnormal_contact_Delete_test_6700 is starting!-------"); + OHOS::Uri errorUri(ContactsUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("zhangming", values); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, -1); + + OHOS::NativeRdb::DataAbilityPredicates predicatesQuery; + predicatesQuery.EqualTo("id", std::to_string(rawContactId)); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + resultSet->Close(); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + deleteCode = contactsDataAbility.Delete(errorUri, predicates); + EXPECT_EQ(deleteCode, -1); + std::shared_ptr resultSetUri = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCountUri = 0; + resultSetUri->GetRowCount(rowCountUri); + EXPECT_EQ(1, rowCountUri); + resultSetUri->Close(); + + predicates.Clear(); + predicates.EqualTo("id", "10000000"); + deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, -1); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + std::shared_ptr resultSetId = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCountId = 0; + resultSetId->GetRowCount(rowCountId); + EXPECT_EQ(1, rowCountId); + resultSetId->Close(); + ClearContacts(); +} + +/* + * @tc.number abnormal_contact_BatchInsert_test_6800 + * @tc.name When adding contacts in batches, some of them failed, check the processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_BatchInsert_test_6800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_BatchInsert_test_6800 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::vector listAddBluk; + int batchInserCode = 0; + for (int i = 0; i < 10; i++) { + listAddBluk.clear(); + for (int j = 10 * i + 1; j <= 10 * (i + 1); j++) { + rawContactValues.Clear(); + std::string name("zhangming"); + name.append(std::to_string(j)); + if (j == 14 || j == 27 || j == 57) { + rawContactValues.PutString("display_names", name); + } else { + rawContactValues.PutString("display_name", name); + } + listAddBluk.push_back(rawContactValues); + } + batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("abnormal_contact_BatchInsert_test_6800 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_contact_BatchInsert_test_6800 batch insert success!"); + } else { + HILOG_INFO("abnormal_contact_BatchInsert_test_6800 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + } + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 20000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number abnormal_contact_BatchInsert_test_6900 + * @tc.name When adding contacts in batch, item 500 fails. Check the subsequent processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, abnormal_contact_BatchInsert_test_6900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contact_BatchInsert_test_6900 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::vector listAddBluk; + for (int i = 0; i < 1000; i++) { + rawContactValues.Clear(); + std::string name("xiaoyuan"); + name.append(std::to_string(i)); + if (i == 500) { + rawContactValues.PutString("display_names", name); + } else { + rawContactValues.PutString("display_name", name); + } + listAddBluk.push_back(rawContactValues); + } + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("abnormal_contact_BatchInsert_test_6900 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_contact_BatchInsert_test_6900 batch insert success!"); + } else { + HILOG_INFO("abnormal_contact_BatchInsert_test_6900 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 20000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number contact_async_insert_test_7000 + * @tc.name Add contacts async + * @tc.desc Ability to join or add contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_async_insert_test_7000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_async_insert_test_7000 is staring! ---"); + std::map result; + std::vector contactAsyncVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + name.append(std::to_string(i)); + values.PutString("display_name", name); + ContactAsync *contactAsync = new ContactAsync(values, result); + std::thread asyncThread(&ContactAsync::Insert, contactAsync); + contactAsyncVector.push_back(contactAsync); + asyncThread.detach(); + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::map::iterator it; + for (it = result.begin(); it != result.end(); it++) { + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(it->first)); + std::shared_ptr resultSet = + ContactQuery(ContactTabName::RAW_CONTACT, columns, predicates); + CheckResultSet(it->second, resultSet, "contact_async_insert_test_7000"); + } + for (int i = 0; i < threadNum; ++i) { + delete contactAsyncVector[i]; + } + ClearContacts(); +} + +/* + * @tc.number contact_async_update_test_7100 + * @tc.name update contacts async + * @tc.desc Ability to join or update contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_async_update_test_7100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_async_update_test_7100 is staring! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + std::vector rawContactId; + rawContactId.push_back(RawContactInsert("async_update1", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update2", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update3", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update4", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update5", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update6", rawValuesBucket)); + rawValuesBucket.Clear(); + std::vector upDateValues; + OHOS::NativeRdb::DataAbilityPredicates queryPredicates; + std::vector contactAsyncVector; + int size = rawContactId.size(); + for (int i = 0; i < size; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + values.PutString("display_name", name); + upDateValues.push_back(values); + int id = rawContactId[i]; + ContactAsync *contactAsync = new ContactAsync(values, id); + contactAsyncVector.push_back(contactAsync); + std::thread asyncThread(&ContactAsync::Update, contactAsync); + asyncThread.detach(); + queryPredicates.EqualTo("id", std::to_string(rawContactId[i])); + if (i < size - 1) { + queryPredicates.Or(); + } + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::shared_ptr resultSet = + ContactQuery(ContactTabName::RAW_CONTACT, columns, queryPredicates); + CheckResultSetList(upDateValues, resultSet, "contact_async_update_test_7100"); + for (int i = 0; i < size; ++i) { + delete contactAsyncVector[i]; + } + ClearContacts(); +} + +/* + * @tc.number contact_async_query_test_7200 + * @tc.name query contacts async + * @tc.desc Ability to join or query + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_async_query_test_7200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_async_query_test_7200 is staring! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + std::vector rawContactId; + rawContactId.push_back(RawContactInsert("async_query1", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_query2", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_query3", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_query4", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_query5", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_query6", rawValuesBucket)); + rawValuesBucket.Clear(); + std::vector contactAsyncVector; + std::vector> resultSetVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + ContactAsync *contactAsync = new ContactAsync(resultSetVector, rawContactId); + contactAsyncVector.push_back(contactAsync); + std::thread asyncThread(&ContactAsync::Query, contactAsync); + asyncThread.detach(); + } + int queryCount = 6; + int size = resultSetVector.size(); + for (int i = 0; i < size; ++i) { + int rowCount = 0; + resultSetVector[i]->GetRowCount(rowCount); + EXPECT_EQ(queryCount, rowCount); + resultSetVector[i]->Close(); + } + for (int i = 0; i < size; ++i) { + delete contactAsyncVector[i]; + } + ClearContacts(); +} + +/* + * @tc.number contact_async_delete_test_7300 + * @tc.name delete contacts async + * @tc.desc Ability to join or delete contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_async_delete_test_7300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_async_delete_test_7300 is staring! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + std::vector rawContactId; + rawContactId.push_back(RawContactInsert("async_update1", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update2", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update3", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update4", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update5", rawValuesBucket)); + rawValuesBucket.Clear(); + rawContactId.push_back(RawContactInsert("async_update6", rawValuesBucket)); + rawValuesBucket.Clear(); + int size = rawContactId.size(); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.BeginWrap(); + std::vector contactAsyncVector; + for (int i = 0; i < size; ++i) { + int id = rawContactId[i]; + ContactAsync *contactAsync = new ContactAsync(id); + contactAsyncVector.push_back(contactAsync); + std::thread asyncThread(&ContactAsync::Delete, contactAsync); + asyncThread.detach(); + predicates.EqualTo("id", std::to_string(id)); + if (i < size - 1) { + predicates.Or(); + } + } + predicates.EndWrap(); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(ContactTabName::RAW_CONTACT, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + for (int i = 0; i < size; ++i) { + delete contactAsyncVector[i]; + } + ClearContacts(); +} + +/* + * @tc.number contact_Insert_test_7400 + * @tc.name Add the basic information of a single contact and verify text whether the insertion is successful + * @tc.desc New capabilities for basic contact data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Insert_test_7400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Insert_test_7400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int size = 20000; + std::string name; + for (int i = 0; i < size; ++i) { + name.append("l"); + } + int64_t rawContactId = RawContactInsert(name, values); + HILOG_INFO("contact_Insert_test_7400 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contact_Insert_test_7400"); + ClearContacts(); +} + +/* + * @tc.number contact_Delete_Recover_test_7500 + * @tc.name recover deleted basic data + * @tc.desc Ability to recover record basic data of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactAbilityTest, contact_Delete_Recover_test_7500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_Delete_Recover_test_7500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaohongDelete", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("name_raw_contact_id", std::to_string(rawContactId)); + std::string contact = ContactTabName::CONTACT; + int deleteCode = ContactDelete(contact, predicates); + EXPECT_EQ(deleteCode, 0); + int time = 2000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("is_deleted", "0"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + OHOS::NativeRdb::DataAbilityPredicates predicatesUpdate; + predicatesUpdate.EqualTo("id", std::to_string(rawContactId)); + int updateCode = ContactUpdate(rawContacts, updateValues, predicatesUpdate); + HILOG_INFO("contact_Delete_Recover_test_7500 : updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicatesDelete; + predicatesDelete.EqualTo("raw_contact_id", std::to_string(rawContactId)); + int deleteCodeOne = ContactDelete(ContactTabName::DELETED_RAW_CONTACT_RECORD, predicatesDelete); + EXPECT_EQ(deleteCodeOne, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicatesQuery; + predicatesQuery.EqualTo("id", std::to_string(rawContactId)); + predicatesQuery.And(); + predicatesQuery.EqualTo("is_deleted", "0"); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(ContactTabName::RAW_CONTACT, columns, predicatesQuery); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + resultSet->Close(); + ClearContacts(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/contactgroup_test.cpp b/test/unittest/src/contactgroup_test.cpp new file mode 100644 index 0000000..d922c10 --- /dev/null +++ b/test/unittest/src/contactgroup_test.cpp @@ -0,0 +1,703 @@ +/* + * Copyright (c) 2021 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 "contactgroup_test.h" + +#include "test_common.h" + +namespace Contacts { +namespace Test { +ContactGroupTest::ContactGroupTest() +{ +} + +ContactGroupTest::~ContactGroupTest() +{ +} + +void ContactGroupTest::ClearData() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::string groups = "groups"; + int deleteCode = ContactDelete(groups, predicates); + EXPECT_EQ(deleteCode, 0); +} + +int64_t ContactGroupTest::GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues) +{ + OHOS::Uri uriGroups(ContactsUri::GROUPS); + groupValues.PutString("group_name", groupName); + int64_t code = contactsDataAbility.Insert(uriGroups, groupValues); + return code; +} + +int ContactGroupTest::ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + code = contactsDataAbility.Update(uriRawContact, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + code = contactsDataAbility.Update(uriContactData, updateValues, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + code = contactsDataAbility.Update(uriGroups, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + code = contactsDataAbility.Update(uriBlocklist, updateValues, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +int ContactGroupTest::ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + code = contactsDataAbility.Delete(uriRawContact, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + code = contactsDataAbility.Delete(uriContactData, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + code = contactsDataAbility.Delete(uriGroups, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + code = contactsDataAbility.Delete(uriBlocklist, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + code = contactsDataAbility.Delete(uriContact, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +std::shared_ptr ContactGroupTest::ContactQuery( + const std::string &tableName, std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriRawContact, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + resultSet = contactsDataAbility.Query(uriContactData, columns, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + resultSet = contactsDataAbility.Query(uriContact, columns, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + resultSet = contactsDataAbility.Query(uriGroups, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + resultSet = contactsDataAbility.Query(uriBlocklist, columns, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT) { + OHOS::Uri uriDeletedRawContact(ContactsUri::DELETED_RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriDeletedRawContact, columns, predicates); + } else if (tableName == ContactTabName::SEARCH_CONTACT) { + OHOS::Uri uriSearchContact(ContactsUri::SEARCH); + resultSet = contactsDataAbility.Query(uriSearchContact, columns, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return resultSet; +} + +void ContactGroupTest::QueryAndExpectResult(const std::string &tableName, + OHOS::NativeRdb::DataAbilityPredicates predicates, OHOS::NativeRdb::ValuesBucket &values, std::string testName) +{ + std::vector columns; + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + CheckResultSet(values, resultSet, testName); +} + +void ContactGroupTest::GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("account_id"); + columnInt.push_back("ringtone_modify_time"); + columnInt.push_back("lastest_modify_time"); + + columnStr.push_back("group_name"); + columnStr.push_back("group_notes"); + columnStr.push_back("group_ringtone"); +} + +void ContactGroupTest::MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr) +{ + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + columns.push_back(columnsInt[i]); + } + int columnsStrSize = columnsStr.size(); + for (int i = 0; i < columnsStrSize; i++) { + columns.push_back(columnsStr[i]); + } +} + +/** + * @brief get ValuesBucket + * @params columnsStart column start index + * @params columnsEnd column end index + * @return ValuesBucket + */ +OHOS::NativeRdb::ValuesBucket ContactGroupTest::GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + int randomInt = 0; + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + randomInt = ContactsRand(); + HILOG_INFO("rand=%{public}d", randomInt); + valuesBucket.PutInt(columnsInt[i], randomInt); + } + std::string randomStr = ""; + int columnsStringSize = columnsStr.size(); + for (int i = 0; i < columnsStringSize; i++) { + randomStr = columnsStr[i] + std::to_string(ContactsRand()); + valuesBucket.PutString(columnsStr[i], randomStr); + } + + return valuesBucket; +} + +int64_t ContactGroupTest::GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriGroups(ContactsUri::GROUPS); + int64_t code = contactsDataAbility.Insert(uriGroups, values); + return code; +} + +/* + * @tc.number groups_Insert_test_100 + * @tc.name Add a single contact group + * @tc.desc Add capabilities for contact groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Insert_test_100 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupId = GroupsInsert("personnel", valuesGroup); + HILOG_INFO("groups_Insert_test_100: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + QueryAndExpectResult(groups, predicates, valuesGroup, "groups_Insert_test_100"); + ClearData(); +} + +/* + * @tc.number groups_Insert_test_200 + * @tc.name Adding multiple contact groups + * @tc.desc Add capabilities for contact groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Insert_test_200 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupId = GroupsInsert("Test a set", valuesGroup); + HILOG_INFO("groups_Insert_test_200: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + QueryAndExpectResult(groups, predicates, valuesGroup, "groups_Insert_test_200"); + + valuesGroup.Clear(); + groupId = GroupsInsert("Test group two", valuesGroup); + HILOG_INFO("groups_Insert_test_200: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupId)); + QueryAndExpectResult(groups, predicates, valuesGroup, "groups_Insert_test_200"); + + valuesGroup.Clear(); + groupId = GroupsInsert("Test three groups", valuesGroup); + HILOG_INFO("groups_Insert_test_200: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupId)); + QueryAndExpectResult(groups, predicates, valuesGroup, "groups_Insert_test_200"); + ClearData(); +} + +/* + * @tc.number groups_Insert_test_300 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Added ability to groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Insert_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----groups_Insert_test_300 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string groups = ContactTabName::GROUPS; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = GroupsInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "groups_Insert_test_300"); + HILOG_INFO("-----groups_Insert_test_300 is end!-----"); + ClearData(); +} + +/* + * @tc.number groups_Delete_test_400 + * @tc.name Single contact group deletion + * @tc.desc Delete group ability based on group ID + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Delete_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Delete_test_400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupId = GroupsInsert("Personnel Group", valuesGroup); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + int deleteCode = ContactDelete(groups, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearData(); +} + +/* + * @tc.number groups_Delete_test_500 + * @tc.name Multiple contact groups deleted + * @tc.desc Delete group ability based on group ID + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Delete_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Delete_test_500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupIdOne = GroupsInsert("Personnel Group", valuesGroup); + EXPECT_GT(groupIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesGroupTwo; + int64_t groupIdTwo = GroupsInsert("Sell one", valuesGroupTwo); + EXPECT_GT(groupIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesGroupThree; + int64_t groupIdThree = GroupsInsert("Develop a group", valuesGroupThree); + EXPECT_GT(groupIdThree, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(groupIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(groupIdThree)); + std::string groups = ContactTabName::GROUPS; + int deleteCode = ContactDelete(groups, predicates); + HILOG_INFO("groups_Delete_test_500: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(groupIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(groupIdThree)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearData(); +} + +/* + * @tc.number groups_Delete_test_600 + * @tc.name Delete a full field data in the groups table and verify whether the deletion is successful + * @tc.desc Groups deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Delete_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----groups_Delete_test_600 is starting!-----"); + // insert + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int groupId = GroupsInsertValues(valuesBucket); + EXPECT_GT(groupId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + EXPECT_GT(groupId, 0); + std::string groups = ContactTabName::GROUPS; + int deleteCode = ContactDelete(groups, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(groups, columns, predicates); + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearData(); +} + +/* + * @tc.number groups_Query_test_700 + * @tc.name Query all contact groups + * @tc.desc Query all group capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Query_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Query_test_700 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroupTwo; + GroupsInsert("Sell one1", valuesGroupTwo); + valuesGroupTwo.Clear(); + GroupsInsert("Sell one2", valuesGroupTwo); + valuesGroupTwo.Clear(); + GroupsInsert("Sell one3", valuesGroupTwo); + valuesGroupTwo.Clear(); + GroupsInsert("Sell one4", valuesGroupTwo); + valuesGroupTwo.Clear(); + GroupsInsert("Sell one5", valuesGroupTwo); + valuesGroupTwo.Clear(); + std::vector columns; + columns.push_back("id"); + columns.push_back("group_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::string groups = ContactTabName::GROUPS; + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + int rowCount = 0; + int currentCount = 5; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(currentCount, rowCount); + ClearData(); +} + +/* + * @tc.number groups_Update_test_800 + * @tc.name Single contact group update + * @tc.desc Contacts group update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Update_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Update_test_800 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupId = GroupsInsert("physical education", valuesGroup); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("group_name", std::string("Language")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + int updateCode = ContactUpdate(groups, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(groups, predicates, updateValues, "groups_Update_test_800"); + ClearData(); +} + +/* + * @tc.number groups_Update_test_900 + * @tc.name Multiple contact group updates + * @tc.desc Contacts group update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Update_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- groups_Update_test_900 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroupOne; + int64_t groupIdOne = GroupsInsert("Develop a group", valuesGroupOne); + EXPECT_GT(groupIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesGroupTwo; + int64_t groupIdTwo = GroupsInsert("Development Group 2", valuesGroupTwo); + EXPECT_GT(groupIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesGroupThree; + int64_t groupIdThree = GroupsInsert("Development three groups", valuesGroupThree); + EXPECT_GT(groupIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("group_name", std::string("Develop a group")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupIdOne)); + std::string groups = ContactTabName::GROUPS; + int updateCode = ContactUpdate(groups, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(groups, predicates, updateValues, "groups_Update_test_900"); + + updateValues.Clear(); + updateValues.PutString("group_name", std::string("Development Second Group")); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupIdTwo)); + updateCode = ContactUpdate(groups, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(groups, predicates, updateValues, "groups_Update_test_900"); + + updateValues.Clear(); + updateValues.PutString("group_name", std::string("Develop three groups")); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupIdThree)); + updateCode = ContactUpdate(groups, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(groups, predicates, updateValues, "groups_Update_test_900"); + ClearData(); +} + +/* + * @tc.number groups_Update_test_1000 + * @tc.name Update a full field data of the groups table and verify whether the update is successful + * @tc.desc Support all groups update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, groups_Update_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----groups_Update_test_1000 is starting!-----"); + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + std::string groups = ContactTabName::GROUPS; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int groupId = GroupsInsertValues(valuesBucket); + EXPECT_GT(groupId, 0); + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::shared_ptr resultSetOne = ContactQuery(groups, columns, predicates); + CheckResultSet(valuesBucket, resultSetOne, "groups_Update_test_1000"); + + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int upDateCode = ContactUpdate(groups, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "groups_Update_test_1000"); + ClearData(); +} + +/* + * @tc.number abnormal_groups_Insert_test_1100 + * @tc.name An incorrect field or table name was passed in when inserting a group + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, abnormal_groups_Insert_test_1100, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriGroups(ContactsUri::GROUPS); + OHOS::Uri errorUri(ContactsUri::GROUPS_ERROR); + OHOS::NativeRdb::ValuesBucket groupValues; + groupValues.PutString("group_names", "Board of Directors"); + int64_t groupId = contactsDataAbility.Insert(uriGroups, groupValues); + EXPECT_EQ(groupId, -1); + + groupValues.Clear(); + groupValues.PutString("group_name", "Board of Directors"); + groupId = contactsDataAbility.Insert(errorUri, groupValues); + EXPECT_EQ(groupId, -1); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("group_name", "Board of Directors"); + std::string groups = ContactTabName::GROUPS; + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearData(); +} + +/* + * @tc.number abnormal_groups_Delete_test_1200 + * @tc.name When deleting a group, pass in non-existent fields, field values, and table names + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, abnormal_groups_Delete_test_1200, testing::ext::TestSize.Level1) +{ + OHOS::Uri errorUri(ContactsUri::GROUPS_ERROR); + OHOS::NativeRdb::ValuesBucket values; + int64_t groupId = GroupsInsert("Board of Directors 2", values); + HILOG_INFO("abnormal_groups_Delete_test_1200: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + int deleteCode = ContactDelete(groups, predicates); + HILOG_INFO("abnormal_groups_Delete_test_1200: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, -1); + std::vector columns; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupId)); + std::shared_ptr resultSet = ContactQuery(groups, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(groupId)); + deleteCode = contactsDataAbility.Delete(errorUri, predicates); + HILOG_INFO("abnormal_groups_Delete_test_1200: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, -1); + + std::shared_ptr resultSetTwo = ContactQuery(groups, columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(1, rowCountTwo); + + predicates.Clear(); + predicates.EqualTo("id", "10000000"); + deleteCode = ContactDelete(groups, predicates); + EXPECT_EQ(deleteCode, 0); + ClearData(); +} + +/* + * @tc.number abnormal_groups_Query_test_1300 + * @tc.name When querying a group, pass in non-existent fields, field values, and table names + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, abnormal_groups_Query_test_1300, testing::ext::TestSize.Level1) +{ + std::string tag("abnormal_groups_Query_test_1300"); + OHOS::Uri errorUri(ContactsUri::GROUPS_ERROR); + std::string groups = ContactTabName::GROUPS; + std::vector columns; + columns.push_back("id"); + columns.push_back("group_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("ids", "0"); + std::shared_ptr resultSetOne = ContactQuery(groups, columns, predicates); + int rowCountOne = 0; + resultSetOne->GetRowCount(rowCountOne); + EXPECT_EQ(-1, rowCountOne); + + predicates.Clear(); + predicates.EqualTo("id", "10000000"); + std::shared_ptr resultSetTwo = ContactQuery(groups, columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(0, rowCountTwo); + + predicates.Clear(); + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSetThree = + contactsDataAbility.Query(errorUri, columns, predicates); + EXPECT_EQ(resultSetThree, nullptr); + ClearData(); +} + +/* + * @tc.number abnormal_groups_Update_test_1400 + * @tc.name When modifying a group, pass in non-existent fields, field values, and table names + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactGroupTest, abnormal_groups_Update_test_1400, testing::ext::TestSize.Level1) +{ + OHOS::Uri errorUri(ContactsUri::GROUPS_ERROR); + OHOS::NativeRdb::ValuesBucket valuesInsert; + int64_t groupId = GroupsInsert("Board of Directors", valuesInsert); + HILOG_INFO("abnormal_groups_Update_test_1400: groupId = %{public}lld", groupId); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("group_names", "Develop a group"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + std::string groups = ContactTabName::GROUPS; + int updateCode = ContactUpdate(groups, updateValues, predicates); + HILOG_INFO("abnormal_groups_Update_test_1400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(groups, predicates, valuesInsert, "abnormal_groups_Update_test_1400"); + + updateValues.Clear(); + updateValues.PutString("group_name", "Develop a group"); + updateCode = contactsDataAbility.Update(errorUri, updateValues, predicates); + HILOG_INFO("abnormal_groups_Update_test_1400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(groups, predicates, valuesInsert, "abnormal_groups_Update_test_1400"); + predicates.Clear(); + + predicates.EqualTo("id", "10000000"); + updateCode = ContactUpdate(groups, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + ClearData(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/contactpinyin_test.cpp b/test/unittest/src/contactpinyin_test.cpp new file mode 100644 index 0000000..b958626 --- /dev/null +++ b/test/unittest/src/contactpinyin_test.cpp @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2021 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 "contactpinyin_test.h" + +#include "construction_name.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +ContactPinyinTest::ContactPinyinTest() +{ +} + +ContactPinyinTest::~ContactPinyinTest() +{ +} + +int64_t ContactPinyinTest::RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactPinyinTest::ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues) +{ + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", contentType); + contactDataValues.PutString("detail_info", detailInfo); + contactDataValues.PutString("position", position); + int64_t code = contactsDataAbility.Insert(uriContactData, contactDataValues); + return code; +} + +std::shared_ptr ContactPinyinTest::ContactQuery( + const std::string &tableName, std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriRawContact, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + resultSet = contactsDataAbility.Query(uriContactData, columns, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + resultSet = contactsDataAbility.Query(uriContact, columns, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + resultSet = contactsDataAbility.Query(uriGroups, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + resultSet = contactsDataAbility.Query(uriBlocklist, columns, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT) { + OHOS::Uri uriDeletedRawContact(ContactsUri::DELETED_RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriDeletedRawContact, columns, predicates); + } else if (tableName == ContactTabName::SEARCH_CONTACT) { + OHOS::Uri uriSearchContact(ContactsUri::SEARCH); + resultSet = contactsDataAbility.Query(uriSearchContact, columns, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return resultSet; +} + +void ContactPinyinTest::QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName) +{ + std::vector columns; + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + CheckResultSet(values, resultSet, testName); +} + +void ContactPinyinTest::ClearData() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 1000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number name_convert_to_pinyin_test_100 + * @tc.name Insert a simplified Chinese name to view the converted Pinyin + * @tc.desc Contacts name conversion pinyin ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactPinyinTest, pinyin_conversion_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------pinyin_conversion_Insert_test_100 is starting!------"); + std::string tag("pinyin_conversion_Insert_test_100"); + OHOS::Contacts::ConstructionName::local = "zh-CN"; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("李想", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "李想", "", values); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + QueryAndExpectResult(searchContact, predicates, values, "pinyin_conversion_Insert_test_100"); + ClearData(); +} + +/* + * @tc.number pinyin_conversion_Insert_test_200 + * @tc.name Insert a traditional Chinese name and view the converted Pinyin + * @tc.desc Contacts name conversion pinyin ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactPinyinTest, pinyin_conversion_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------pinyin_conversion_Insert_test_200 is starting!------"); + std::string tag("pinyin_conversion_Insert_test_200"); + OHOS::Contacts::ConstructionName::local = "zh-CN"; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("張三", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "張三", "", values); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + QueryAndExpectResult(searchContact, predicates, values, "pinyin_conversion_Insert_test_200"); + ClearData(); +} + +/* + * @tc.number pinyin_conversion_Insert_test_300 + * @tc.name Insert an English name to view the converted Pinyin + * @tc.desc Contacts name conversion pinyin ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactPinyinTest, pinyin_conversion_Insert_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------pinyin_conversion_Insert_test_300 is starting!------"); + OHOS::Contacts::ConstructionName::local = "other"; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("Tom", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "Tom", "", values); + HILOG_INFO("pinyin_conversion_Insert_test_300 : contactDataId = %{public}lld", contactDataId); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + QueryAndExpectResult(searchContact, predicates, values, "Tom||Tom||Tom"); + ClearData(); +} + +/* + * @tc.number abnormal_pinyin_conversion_Insert_test_400 + * @tc.name Insert a name with special characters to view the converted Pinyin + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactPinyinTest, abnormal_pinyin_conversion_Insert_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------abnormal_pinyin_conversion_Insert_test_400 is starting!------"); + OHOS::Contacts::ConstructionName::local = "zh-CN"; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("李%^玉@成", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "李%^玉@成", "", values); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + QueryAndExpectResult(searchContact, predicates, values, "李%^玉@成||li%^yu@cheng||l%^y@c"); + ClearData(); +} + +/* + * @tc.number abnormal_pinyin_conversion_Insert_test_500 + * @tc.name Insert a name in multiple languages and view the converted Pinyin + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactPinyinTest, abnormal_pinyin_conversion_Insert_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------abnormal_pinyin_conversion_Insert_test_500 is starting!------"); + OHOS::Contacts::ConstructionName::local = "zh-CN"; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("李bp玉成욱", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "李bp玉成욱", "", values); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + QueryAndExpectResult(searchContact, predicates, values, "李bp玉成욱||libpyucheng욱||lbpyc욱"); + ClearData(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/contactprofile_test.cpp b/test/unittest/src/contactprofile_test.cpp new file mode 100644 index 0000000..e5ae495 --- /dev/null +++ b/test/unittest/src/contactprofile_test.cpp @@ -0,0 +1,3390 @@ +/* + * Copyright (c) 2021 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 "contactprofile_test.h" + +#include "data_ability_operation_builder.h" + +#include "test_common.h" + +namespace Contacts { +namespace Test { +ContactProfileTest::ContactProfileTest() +{ +} + +ContactProfileTest::~ContactProfileTest() +{ +} + +int64_t ContactProfileTest::RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactProfileTest::RawContactExpandInsert( + std::vector valueVector, int isFavorite, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + int indexZero = 0; + int indexOne = 1; + int indexTwo = 2; + int indexThree = 3; + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + rawContactValues.PutString("display_name", valueVector[indexZero]); + rawContactValues.PutString("company", valueVector[indexOne]); + rawContactValues.PutString("position", valueVector[indexTwo]); + rawContactValues.PutInt("favorite", isFavorite); + rawContactValues.PutString("phonetic_name", valueVector[indexThree]); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactProfileTest::RawContactLastContactedInsert( + std::string displayName, int lastestContactedTime, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + rawContactValues.PutInt("lastest_contacted_time", lastestContactedTime); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactProfileTest::ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues) +{ + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", contentType); + contactDataValues.PutString("detail_info", detailInfo); + contactDataValues.PutString("position", position); + int64_t code = contactsDataAbility.Insert(uriContactData, contactDataValues); + return code; +} + +int64_t ContactProfileTest::GroupsInsert(std::string groupName, OHOS::NativeRdb::ValuesBucket &groupValues) +{ + OHOS::Uri uriGroups(ProfileUri::GROUPS); + groupValues.PutString("group_name", groupName); + int64_t code = contactsDataAbility.Insert(uriGroups, groupValues); + return code; +} + +int64_t ContactProfileTest::ContactBlocklistInsert( + std::string phoneNumber, OHOS::NativeRdb::ValuesBucket &contactBlocklistValues) +{ + OHOS::Uri uriBlacklist(ProfileUri::BLOCKLIST); + contactBlocklistValues.PutString("phone_number", phoneNumber); + int64_t code = contactsDataAbility.Insert(uriBlacklist, contactBlocklistValues); + return code; +} + +int ContactProfileTest::ContactUpdate(const std::string &tableName, OHOS::NativeRdb::ValuesBucket updateValues, + OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + code = contactsDataAbility.Update(uriRawContact, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + code = contactsDataAbility.Update(uriContactData, updateValues, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ProfileUri::GROUPS); + code = contactsDataAbility.Update(uriGroups, updateValues, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ProfileUri::BLOCKLIST); + code = contactsDataAbility.Update(uriBlocklist, updateValues, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +int ContactProfileTest::ContactDelete(const std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + int code = 0; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + code = contactsDataAbility.Delete(uriRawContact, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + code = contactsDataAbility.Delete(uriContactData, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ProfileUri::GROUPS); + code = contactsDataAbility.Delete(uriGroups, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ProfileUri::BLOCKLIST); + code = contactsDataAbility.Delete(uriBlocklist, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ProfileUri::CONTACT); + code = contactsDataAbility.Delete(uriContact, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return code; +} + +std::shared_ptr ContactProfileTest::ContactQuery( + const std::string &tableName, std::vector &columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriRawContact, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + resultSet = contactsDataAbility.Query(uriContactData, columns, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ProfileUri::CONTACT); + resultSet = contactsDataAbility.Query(uriContact, columns, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ProfileUri::GROUPS); + resultSet = contactsDataAbility.Query(uriGroups, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ProfileUri::BLOCKLIST); + resultSet = contactsDataAbility.Query(uriBlocklist, columns, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT) { + OHOS::Uri uriDeletedRawContact(ProfileUri::DELETED_RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriDeletedRawContact, columns, predicates); + } else if (tableName == ContactTabName::SEARCH_CONTACT) { + OHOS::Uri uriSearchContact(ProfileUri::SEARCH); + resultSet = contactsDataAbility.Query(uriSearchContact, columns, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return resultSet; +} + +void ContactProfileTest::QueryAndExpectResult(std::string &tableName, OHOS::NativeRdb::DataAbilityPredicates predicates, + OHOS::NativeRdb::ValuesBucket &values, std::string testName) +{ + std::vector columns; + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + CheckResultSet(values, resultSet, testName); +} + +int64_t ContactProfileTest::RawContactInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + int64_t code = contactsDataAbility.Insert(uriRawContact, values); + return code; +} + +int64_t ContactProfileTest::ContactDataInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + int64_t code = contactsDataAbility.Insert(uriContactData, values); + return code; +} + +int64_t ContactProfileTest::GroupsInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriGroups(ProfileUri::GROUPS); + int64_t code = contactsDataAbility.Insert(uriGroups, values); + return code; +} + +int64_t ContactProfileTest::ContactBlocklistInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriContactBolcklist(ProfileUri::BLOCKLIST); + int64_t code = contactsDataAbility.Insert(uriContactBolcklist, values); + return code; +} + +void ContactProfileTest::GetAllRawContactColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("photo_id"); + columnInt.push_back("photo_file_id"); + columnInt.push_back("is_transfer_voicemail"); + columnInt.push_back("account_id"); + columnInt.push_back("version"); + columnInt.push_back("contacted_count"); + columnInt.push_back("lastest_contacted_time"); + columnInt.push_back("favorite"); + columnInt.push_back("phonetic_name_type"); + columnInt.push_back("read_only"); + columnInt.push_back("merge_mode"); + columnInt.push_back("is_need_merge"); + columnInt.push_back("merge_status"); + columnInt.push_back("is_merge_target"); + columnInt.push_back("vibration_setting"); + columnInt.push_back("sync_id"); + + columnStr.push_back("personal_ringtone"); + columnStr.push_back("personal_notification_ringtone"); + columnStr.push_back("photo_first_name"); + columnStr.push_back("display_name"); + columnStr.push_back("sort"); + columnStr.push_back("favorite_order"); + columnStr.push_back("phonetic_name"); + columnStr.push_back("company"); + columnStr.push_back("position"); + columnStr.push_back("sort_first_letter"); + columnStr.push_back("syn_1"); + columnStr.push_back("syn_2"); + columnStr.push_back("syn_3"); +} + +void ContactProfileTest::GetAllContactDataColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("read_only"); + columnInt.push_back("version"); + columnInt.push_back("is_preferred_number"); + + columnStr.push_back("detail_info"); + columnStr.push_back("family_name"); + columnStr.push_back("middle_name_phonetic"); + columnStr.push_back("given_name"); + columnStr.push_back("given_name_phonetic"); + columnStr.push_back("alias_detail_info"); + columnStr.push_back("phonetic_name"); + columnStr.push_back("position"); + columnStr.push_back("extend1"); + columnStr.push_back("extend2"); + columnStr.push_back("extend3"); + columnStr.push_back("extend4"); + columnStr.push_back("city"); + columnStr.push_back("country"); + columnStr.push_back("neighborhood"); + columnStr.push_back("pobox"); + columnStr.push_back("region"); + columnStr.push_back("street"); + columnStr.push_back("alpha_name"); + columnStr.push_back("other_lan_last_name"); + columnStr.push_back("other_lan_first_name"); + columnStr.push_back("lan_style"); + columnStr.push_back("custom_data"); + columnStr.push_back("extend6"); + columnStr.push_back("extend7"); + columnStr.push_back("syn_1"); + columnStr.push_back("syn_2"); + columnStr.push_back("syn_3"); +} + +void ContactProfileTest::GetAllGroupsColumns(std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("account_id"); + columnInt.push_back("ringtone_modify_time"); + columnInt.push_back("lastest_modify_time"); + columnStr.push_back("group_name"); + columnStr.push_back("group_notes"); + columnStr.push_back("group_ringtone"); +} + +void ContactProfileTest::GetAllContactBlocklistColumns( + std::vector &columnInt, std::vector &columnStr) +{ + columnInt.push_back("types"); + columnStr.push_back("phone_number"); + columnStr.push_back("content"); + columnStr.push_back("time_stamp"); +} + +void ContactProfileTest::GetDetailsContactDataColumns(std::vector &columns) +{ + columns.push_back("email"); + columns.push_back("im"); + columns.push_back("nickname"); + columns.push_back("organization"); + columns.push_back("phone"); + columns.push_back("name"); + columns.push_back("postal_address"); + columns.push_back("photo"); + columns.push_back("group_membership"); + columns.push_back("note"); + columns.push_back("contactProfile_event"); + columns.push_back("website"); + columns.push_back("relation"); + columns.push_back("contactProfile_misc"); + columns.push_back("hicall_device"); + columns.push_back("camcard"); + columns.push_back("sip_address"); +} + +void ContactProfileTest::MergeColumns( + std::vector &columns, std::vector &columnsInt, std::vector &columnsStr) +{ + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + columns.push_back(columnsInt[i]); + } + int columnsStrSize = columnsStr.size(); + for (int i = 0; i < columnsStrSize; i++) { + columns.push_back(columnsStr[i]); + } +} + +/** + * @brief get ValuesBucket + * @params columnsStart column start index + * @params columnsEnd column end index + * @return ValuesBucket + */ +OHOS::NativeRdb::ValuesBucket ContactProfileTest::GetAllColumnsValues( + std::vector &columnsInt, std::vector &columnsStr) +{ + OHOS::NativeRdb::ValuesBucket valuesBucket; + int randomInt = 0; + int columnsIntSize = columnsInt.size(); + for (int i = 0; i < columnsIntSize; i++) { + randomInt = ContactsRand(); + HILOG_INFO("rand=%{public}d", randomInt); + valuesBucket.PutInt(columnsInt[i], randomInt); + } + std::string randomStr = ""; + int columnsStringSize = columnsStr.size(); + for (int i = 0; i < columnsStringSize; i++) { + randomStr = columnsStr[i] + std::to_string(ContactsRand()); + valuesBucket.PutString(columnsStr[i], randomStr); + } + + return valuesBucket; +} + +void ContactProfileTest::ClearContacts() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 1000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ProfileUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number contactProfile_Insert_test_100 + * @tc.name Add the basic information of a single contact and verify whether the insertion is successful + * @tc.desc New capabilities for basic contact data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("liming", values); + HILOG_INFO("contactProfile_Insert_test_100 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contactProfile_Insert_test_100"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_200 + * @tc.name Add the basic information of multiple contacts and verify whether the insertion is successful + * @tc.desc New capabilities for basic contact data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactIdOne = RawContactInsert("xiaoqian", values); + HILOG_INFO("contactProfile_Insert_test_200 : rawContactIdOne = %{public}lld", rawContactIdOne); + EXPECT_GT(rawContactIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contactProfile_Insert_test_200"); + values.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("xiaowang", values); + HILOG_INFO("contactProfile_Insert_test_200 : rawContactIdTwo = %{public}lld", rawContactIdTwo); + EXPECT_GT(rawContactIdTwo, 0); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, values, "contactProfile_Insert_test_200"); + predicates.Clear(); + + int64_t rawContactIdThree = RawContactInsert("xiaozhou", values); + HILOG_INFO("contactProfile_Insert_test_200 : rawContactIdThree = %{public}lld", rawContactIdThree); + EXPECT_GT(rawContactIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, values, "contactProfile_Insert_test_200"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_300 + * @tc.name Add a full field data to the raw_contact table and verify whether the insertion is successful + * @tc.desc Added ability to raw_contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Insert_test_300 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string rawContacts = ContactTabName::RAW_CONTACT; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_300"); + ClearContacts(); +} + +/* +* @tc.number contactProfile_Insert_test_400 +* @tc.name Add the basic information of a single contact and verify whether the insertion is successful + (name, name Pinyin, Pinyin name, company, position, favorite or not) +* @tc.desc Add basic information of a single contact +* @tc.level Level1 +* @tc.size MediumTest +* @tc.type Function +*/ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("liming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("liming||lm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contactProfile_Insert_test_400 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + QueryAndExpectResult(rawContacts, predicates, values, "contactProfile_Insert_test_400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_500 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including name, nickname, company, position, mobile phone number and email address) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_500 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("ligang", rawContactValues); + HILOG_INFO("contactProfile_Insert_test_500 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket values; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "ligang", "", values); + HILOG_INFO("contactProfile_Insert_test_500 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + HILOG_INFO("contactProfile_Insert_test_500 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "email", "8523@163.com", "", values); + HILOG_INFO("contactProfile_Insert_test_500 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "phone", "188520314", "", values); + HILOG_INFO("contactProfile_Insert_test_500 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_500"); + values.Clear(); + + int64_t contactDataIdFive = ContactDataInsert(rawContactId, "nickname", "xiaogang", "", values); + HILOG_INFO("contactProfile_Insert_test_500 : contactDataIdFive = %{public}lld", contactDataIdFive); + EXPECT_GT(contactDataIdFive, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFive)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_500"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_600 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including home, group, aim, notes, and URL) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_600 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("chengshao", values); + HILOG_INFO("contactProfile_Insert_test_600 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "postal_address", "NanJingCity", "", values); + HILOG_INFO("contactProfile_Insert_test_600 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "group_membership", "1", "", values); + HILOG_INFO("contactProfile_Insert_test_600 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "note", "dalao", "", values); + HILOG_INFO("contactProfile_Insert_test_600 : contactDataIdThree = %{public}lld", contactDataIdThree); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "im", "aaaa", "", values); + HILOG_INFO("contactProfile_Insert_test_600 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_600"); + values.Clear(); + + int64_t contactDataIdFive = ContactDataInsert(rawContactId, "website", "www.48236.com", "", values); + HILOG_INFO("contactProfile_Insert_test_600 : contactDataIdFive = %{public}lld", contactDataIdFive); + EXPECT_GT(contactDataIdFive, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFive)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_600"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_700 + * @tc.name Add individual contact details and verify that the insertion was successful + * (including phone ring tones, birthdays, and assistants) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_700 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("yanshao", values); + HILOG_INFO("contactProfile_Insert_test_700 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "contactProfile_event", "19960229", "", values); + HILOG_INFO("contactProfile_Insert_test_700 : contactDataIdOne = %{public}lld", contactDataIdOne); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_700"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "relation", "Secretary", "", values); + HILOG_INFO("contactProfile_Insert_test_700 : contactDataIdTwo = %{public}lld", contactDataIdTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_700"); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "contactProfile_misc", "1314", "", values); + HILOG_INFO("contactProfile_Insert_test_700 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_700"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_800 + * @tc.name Add all details of a single contact and verify whether the insertion is successful + * (name, mobile number, company, position, nickname, email, home, remarks, aim, birthday, website, + * assistant, group, phone ring) + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_800 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("insert_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + GetDetailsContactDataColumns(columns); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::NativeRdb::ValuesBucket valuesBucket; + + std::string randomStr = ""; + std::string tableName = ContactTabName::CONTACT_DATA; + int columnSize = columns.size(); + for (int i = 0; i < columnSize; i++) { + randomStr = columns[i] + std::to_string(ContactsRand()); + valuesBucket.PutInt("raw_contact_id", rawContactId); + valuesBucket.PutString("content_type", columns[i]); + valuesBucket.PutString("detail_info", randomStr); + int contactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(contactDataId, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + std::shared_ptr resultSet = + ContactQuery(tableName, columnQuery, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_800"); + valuesBucket.Clear(); + } + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_900 + * @tc.name Add multiple contact details and verify that the insertion was successful + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_900 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("xiaoming", values); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "xiaoming", "", values); + EXPECT_GT(contactDataIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_900"); + values.Clear(); + + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_900"); + values.Clear(); + + rawContactId = RawContactInsert("lihong", values); + HILOG_INFO("contactProfile_Insert_test_900 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "name", "lihong", "", values); + HILOG_INFO("contactProfile_Insert_test_900 : contactDataIdThree = %{public}lld", contactDataIdThree); + EXPECT_GT(contactDataIdThree, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_900"); + values.Clear(); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", values); + HILOG_INFO("contactProfile_Insert_test_900 : contactDataIdFour = %{public}lld", contactDataIdFour); + EXPECT_GT(contactDataIdFour, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdFour)); + QueryAndExpectResult(contactData, predicates, values, "contactProfile_Insert_test_900"); + values.Clear(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_1000 + * @tc.name Add a full field data to the contact_data table and verify that the insertion was successful + * @tc.desc Added ability to contactProfile_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Insert_test_1000 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaomao", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_1000"); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_1000"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1100 + * @tc.name Modify several basic information of the contact, and verify whether the modification is successful + * (including name, name Pinyin, Pinyin name, company, position and favorite) + * @tc.desc Contacts basic data table update ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contactProfile_Update_test_1100 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_name", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("company", "XXXX"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("position", "Secretary"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("favorite", "0"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1100"); + + updateValues.Clear(); + updateValues.PutString("phonetic_name", "dongming||dm"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1100"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1200 + * @tc.name Modify the basic information of multiple contacts and verify whether the modification is successful + * @tc.desc Contacts basic data table update ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactIdOne = RawContactInsert("zhangming", values); + EXPECT_GT(rawContactIdOne, 0); + values.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("ligang", values); + EXPECT_GT(rawContactIdTwo, 0); + values.Clear(); + + int64_t rawContactIdThree = RawContactInsert("wanghong", values); + EXPECT_GT(rawContactIdThree, 0); + values.Clear(); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_name", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1200"); + + updateValues.Clear(); + updateValues.PutString("display_name", std::string("laoliu")); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_1200"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1300 + * @tc.name Update the full field data of the raw_contact table and verify whether the modification is successful + * @tc.desc Support all raw_contact update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Update_test_1300 is starting!-----"); + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + std::string rawContacts = ContactTabName::RAW_CONTACT; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSetOne = ContactQuery(rawContacts, columns, predicates); + CheckResultSet(valuesBucket, resultSetOne, "contactProfile_Update_test_1300"); + + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int upDateCode = ContactUpdate(rawContacts, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contactProfile_Update_test_1300"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1400 + * @tc.name Modify the details of a single contact and verify whether the modification is successful + * (name, company, position and email address) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("ligang", values); + EXPECT_GT(rawContactId, 0); + values.Clear(); + + OHOS::NativeRdb::ValuesBucket valuesOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "ligang", "", valuesOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", valuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesThree; + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "email", "8523@163.com", "", valuesThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1400"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "vivo"); + updateValues.PutString("position", "Developer"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1400"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "1220369@qq.com"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1500 + * @tc.name Modify the details of a single contact and verify that the modification is successful + * (mobile phone number, address and nickname) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaomi", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "phone", "1665230", "", contactDataValueOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "nickname", "xiaomi", "", contactDataValueTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueThree; + int64_t contactDataIdThree = + ContactDataInsert(rawContactId, "postal_address", "BeiJingFir", "", contactDataValueThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "33996652"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1500: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1500"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "mimi"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1500"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "NanJIngGulou"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1500"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1600 + * @tc.name Modify the details of individual contacts and verify whether the modification is successful + * (remarks, goals and birthdays) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "note", "dalao", "", contactDataValueOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "im", "aaaaaa", "", contactDataValueTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValueThree; + int64_t contactDataIdThree = + ContactDataInsert(rawContactId, "contactProfile_event", "19820314", "", contactDataValueThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "God"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1600"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "bcade"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1600: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1600"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "19820328"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1600: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1600"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1700 + * @tc.name Modify the details of a single contact and verify that the modification was successful + * (URL, assistant, and group) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1700 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesOne; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "website", "www.aaa.com", "", contactValuesOne); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + int64_t contactDataIdTwo = ContactDataInsert(rawContactId, "relation", "fuzi", "", contactValuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesThree; + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "group_membership", "1", "", contactValuesThree); + EXPECT_GT(contactDataIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "www.bbb.com"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1700"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "laozhang"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1700"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "2"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdThree)); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1700"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1800 + * @tc.name Modify the details of a single contact and verify that the modification was successful (phone ringing) + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1800 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "contactProfile_misc", "111", "", contactDataValues); + EXPECT_GT(contactDataIdOne, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "222"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1800: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1800"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_1900 + * @tc.name Modify multiple contact details and verify whether the modification is successful + * @tc.desc The ability to update the contact detail data table + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_1900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_1900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("ligang", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "name", "ligang", "", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + contactDataId = ContactDataInsert(rawContactIdOne, "organization", "tiantianxaingshang", "Test", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("zhangming", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + contactDataId = ContactDataInsert(rawContactIdTwo, "name", "zhangming", "", contactValues); + EXPECT_GT(contactDataId, 0); + contactValues.Clear(); + + contactDataId = ContactDataInsert(rawContactIdTwo, "organization", "tiantianxaingshang", "Test", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("detail_info", "lixiang"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactIdOne)); + predicates.And(); + // type 6 is phone + predicates.EqualTo("type_id", "6"); + std::string contactData = ContactTabName::CONTACT_DATA; + int updateCode = ContactUpdate(contactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1900"); + + updateValues.Clear(); + updateValues.PutString("detail_info", "zhangsan"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactIdTwo)); + predicates.And(); + // type 6 is phone + predicates.EqualTo("type_id", "6"); + updateCode = ContactUpdate(contactData, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_1900: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(contactData, predicates, updateValues, "contactProfile_Update_test_1900"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2000 + * @tc.name Update the full field data of the contact_data table and verify whether the modification is successful + * @tc.desc Update ability to contactProfile_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Update_test_2000 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaotui", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type_id 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + + int upDateCode = ContactUpdate(tableName, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + OHOS::NativeRdb::ValueObject value; + valuesBucket.GetObject("version", value); + int versionCode = -1; + value.GetInt(versionCode); + versionCode += 1; + upDateValuesBucket.Delete("version"); + upDateValuesBucket.PutInt("version", versionCode); + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contactProfile_Update_test_2000"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2100 + * @tc.name Update all contact details and verify that the modification was successful + * @tc.desc New ability to contact detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_2100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + GetDetailsContactDataColumns(columns); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::NativeRdb::ValuesBucket valuesBucket; + OHOS::NativeRdb::ValuesBucket upDateValuesBucket; + + std::string randomStr = ""; + std::string updateStrValue = ""; + std::string tableName = ContactTabName::CONTACT_DATA; + int columnSize = columns.size(); + for (int i = 0; i < columnSize; i++) { + randomStr = columns[i] + std::to_string(ContactsRand()); + valuesBucket.PutInt("raw_contact_id", rawContactId); + valuesBucket.PutString("content_type", columns[i]); + valuesBucket.PutString("detail_info", randomStr); + int contactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(contactDataId, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + updateStrValue = "update_all" + randomStr; + upDateValuesBucket.PutString("detail_info", updateStrValue); + int upDateCode = ContactUpdate(tableName, upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + std::shared_ptr resultSet = + ContactQuery(tableName, columnQuery, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(upDateValuesBucket, resultSet, "contactProfile_Update_test_2100"); + + valuesBucket.Clear(); + upDateValuesBucket.Clear(); + } + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2200 + * @tc.name Add a single contact to your favorites and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_2200 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaozong", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2200"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2300 + * @tc.name Add multiple contacts to favorites and verify that the favorites field is changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_2300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaowang", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("xiaozhou", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + rawContactValues.Clear(); + int64_t rawContactIdThree = RawContactInsert("laowei", rawContactValues); + EXPECT_GT(rawContactIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2300"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2300"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2300"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2400 + * @tc.name Unfriend individual contacts and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_2400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_2500 + * @tc.name Remove favorites from multiple contacts and verify that the favorites field has changed + * @tc.desc Contacts favorites and unfavorite capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_2500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_2500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + std::vector vectorValue; + vectorValue.push_back("zhangming"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("zhangming||zm"); + int64_t rawContactId = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactId, 0); + + vectorValue.clear(); + values.Clear(); + vectorValue.push_back("laozhou"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("laozhou||lz"); + int64_t rawContactIdTwo = RawContactExpandInsert(vectorValue, 1, values); + EXPECT_GT(rawContactIdTwo, 0); + + vectorValue.clear(); + values.Clear(); + vectorValue.push_back("abiao"); + vectorValue.push_back("tiantianxaingshang"); + vectorValue.push_back("Test"); + vectorValue.push_back("abiao||ab"); + int64_t rawContactIdThree = RawContactExpandInsert(vectorValue, 1, values); + HILOG_INFO("contactProfile_Update_test_2500 : rawContactIdThree = %{public}lld", rawContactIdThree); + EXPECT_GT(rawContactIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2500"); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2500"); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactIdThree)); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_2500"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_2600 + * @tc.name Add a single record to the blocklist and verify that the insertion was successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_2600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_2600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistId = ContactBlocklistInsert("10086", blocklistValues); + EXPECT_GT(blocklistId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistId)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contactProfile_Insert_test_2600"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_2700 + * @tc.name Add multiple records to the blocklist and verify whether the insertion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_2700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_2700 is starting! ---"); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistIdOne = ContactBlocklistInsert("188520", blocklistValues); + EXPECT_GT(blocklistIdOne, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistIdOne)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contactProfile_Insert_test_2700"); + + blocklistValues.Clear(); + predicates.Clear(); + int64_t blocklistIdTwo = ContactBlocklistInsert("130269", blocklistValues); + EXPECT_GT(blocklistIdTwo, 0); + predicates.EqualTo("id", std::to_string(blocklistIdTwo)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contactProfile_Insert_test_2700"); + + blocklistValues.Clear(); + predicates.Clear(); + int64_t blocklistIdThree = ContactBlocklistInsert("772501", blocklistValues); + ; + EXPECT_GT(blocklistIdThree, 0); + predicates.EqualTo("id", std::to_string(blocklistIdThree)); + QueryAndExpectResult(contactBlocklist, predicates, blocklistValues, "contactProfile_Insert_test_2700"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_2800 + * @tc.name Add a full field data to the contact_blocklist table and verify whether the insertion is successful + * @tc.desc Added ability to ContactBlocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_2800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Insert_test_2800 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_BLOCKLIST; + GetAllContactBlocklistColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int contactBlockId = ContactBlocklistInsertValues(valuesBucket); + EXPECT_GT(contactBlockId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactBlockId)); + std::shared_ptr resultSet = ContactQuery(tableName, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_2800"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_2900 + * @tc.name Delete a contact from the blocklist and verify whether the deletion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_2900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_2900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistId = ContactBlocklistInsert("147852369", blocklistValues); + EXPECT_GT(blocklistId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistId)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_3000 + * @tc.name Delete multiple contacts from the blocklist and verify whether the deletion is successful + * @tc.desc The ability to add and remove contacts from the blocklist + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_3000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_3000 is starting! ---"); + OHOS::NativeRdb::ValuesBucket blocklistValues; + int64_t blocklistIdOne = ContactBlocklistInsert("111228855", blocklistValues); + EXPECT_GT(blocklistIdOne, 0); + + blocklistValues.Clear(); + int64_t blocklistIdTwo = ContactBlocklistInsert("11335566", blocklistValues); + EXPECT_GT(blocklistIdTwo, 0); + + blocklistValues.Clear(); + int64_t blocklistIdThree = ContactBlocklistInsert("9933220011", blocklistValues); + EXPECT_GT(blocklistIdThree, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(blocklistIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(blocklistIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(blocklistIdThree)); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_3100 + * @tc.name Delete a full field data of contact_blocklist table and verify whether the deletion is successful + * @tc.desc ContactBlocklist deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_3100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Delete_test_3100 is starting!-----"); + // insert + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + GetAllContactBlocklistColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int contacBlockId = ContactBlocklistInsertValues(valuesBucket); + EXPECT_GT(contacBlockId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contacBlockId)); + std::string tableName = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_3200 + * @tc.name Join a single contact to the group and verify whether the join is successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_3200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_3200 is staring! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupId = GroupsInsert("TestFirstGroup", groupValues); + EXPECT_GT(groupId, 0); + OHOS::NativeRdb::ValuesBucket contactDataValue; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", contactDataValue); + EXPECT_GT(contactDataId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataId)); + std::string contactData = ContactTabName::CONTACT_DATA; + QueryAndExpectResult(contactData, predicates, contactDataValue, "contactProfile_Insert_test_3200"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_3300 + * @tc.name Multiple contacts join the group and verify whether the joining is successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_3300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Insert_test_3300 is staring! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupIdOne = GroupsInsert("TestSecondGroup", groupValues); + EXPECT_GT(groupIdOne, 0); + groupValues.Clear(); + + int64_t groupIdTwo = GroupsInsert("DeveloperFirstGroup", groupValues); + EXPECT_GT(groupIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + rawContactValues.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("BossCai", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + int64_t contactDataIdOne = + ContactDataInsert(rawContactIdOne, "group_membership", std::to_string(groupIdOne), "", contactDataValuesOne); + EXPECT_GT(contactDataIdOne, 0); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + QueryAndExpectResult(contactData, predicates, contactDataValuesOne, "contactProfile_Insert_test_3300"); + + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + int64_t contactDataIdTwo = + ContactDataInsert(rawContactIdTwo, "group_membership", std::to_string(groupIdTwo), "", contactDataValuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + QueryAndExpectResult(contactData, predicates, contactDataValuesTwo, "contactProfile_Insert_test_3300"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Insert_test_3400 + * @tc.name Add a full field data to the groups table and verify whether the insertion is successful + * @tc.desc Added ability to groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Insert_test_3400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Insert_test_3400 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string group = ContactTabName::GROUPS; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = GroupsInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = ContactQuery(group, columns, predicates); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Insert_test_3400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_3500 + * @tc.name Delete a single contact from the group and verify that the deletion was successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_3500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_3500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupId = GroupsInsert("CEO", groupValues); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", contactDataValues); + EXPECT_GT(contactDataId, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + predicates.And(); + // type_id 9 is group_membership + predicates.EqualTo("type_id", "9"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataId)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_3600 + * @tc.name Delete multiple contacts from the group and verify that the deletion was successful + * @tc.desc Ability to add and remove contacts from groups + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_3600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_3600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket groupValues; + int64_t groupIdOne = GroupsInsert("Test", groupValues); + HILOG_INFO("contactProfile_Delete_test_3600: groupIdOne = %{public}lld", groupIdOne); + EXPECT_GT(groupIdOne, 0); + + groupValues.Clear(); + int64_t groupIdTwo = GroupsInsert("Developer", groupValues); + HILOG_INFO("contactProfile_Delete_test_3600: groupIdTwo = %{public}lld", groupIdTwo); + EXPECT_GT(groupIdTwo, 0); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("xiaoli", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + rawContactValues.Clear(); + int64_t rawContactIdTwo = RawContactInsert("xiaoyuan", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataIdOne = + ContactDataInsert(rawContactIdOne, "group_membership", std::to_string(groupIdOne), "", contactDataValues); + EXPECT_GT(contactDataIdOne, 0); + + contactDataValues.Clear(); + int64_t contactDataIdTwo = + ContactDataInsert(rawContactIdTwo, "group_membership", std::to_string(groupIdTwo), "", contactDataValues); + EXPECT_GT(contactDataIdTwo, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdOne)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(contactDataIdTwo)); + std::shared_ptr resultSetTwo = ContactQuery(contactData, columns, predicates); + int rowCountTwo = 0; + resultSetTwo->GetRowCount(rowCountTwo); + EXPECT_EQ(0, rowCountTwo); + resultSetTwo->Close(); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_3700 + * @tc.name Delete the full field data of a groups table and verify whether the deletion is successful + * @tc.desc Groups deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_3700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Delete_test_3700 is starting!-----"); + // insert + std::vector columns; + std::vector columnsInt; + std::vector columnsStr; + GetAllGroupsColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int groupId = GroupsInsertValues(valuesBucket); + EXPECT_GT(groupId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(groupId)); + EXPECT_GT(groupId, 0); + std::string tableName = ContactTabName::GROUPS; + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_3800 + * @tc.name Insert contact information and query contact information according to the returned ID + * @tc.desc The ability to query the basic information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_3800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_3800 is starting! ---"); + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + columns.push_back("favorite"); + columns.push_back("phonetic_name"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("display_name", "xiaoyuan"); + valuesBucket.PutString("company", "tiantianxiangshang"); + valuesBucket.PutString("position", "Test"); + valuesBucket.PutInt("favorite", 1); + valuesBucket.PutString("phonetic_name", "xiaoyuanxy"); + + int64_t rawContactId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Query_test_3800"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_3900 + * @tc.name Insert multiple contact information and query the contact information according to the returned ID + * @tc.desc The ability to query the basic information of multiple contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_3900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_3900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("display_name", "xiaohei"); + valuesBucketOne.PutString("company", "tiantianxiangshang"); + valuesBucketOne.PutString("position", "Test"); + valuesBucketOne.PutInt("favorite", 1); + valuesBucketOne.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdOne = RawContactInsertValues(valuesBucketOne); + EXPECT_GT(rawContactIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + valuesBucketTwo.PutString("display_name", "xiaobai"); + valuesBucketTwo.PutString("company", "tiantianxiangshang"); + valuesBucketTwo.PutString("position", "Test"); + valuesBucketTwo.PutInt("favorite", 1); + valuesBucketTwo.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdTwo = RawContactInsertValues(valuesBucketTwo); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesBucketThr; + valuesBucketThr.PutString("display_name", "xiaocai"); + valuesBucketThr.PutString("company", "tiantianxiangshang"); + valuesBucketThr.PutString("position", "Test"); + valuesBucketThr.PutInt("favorite", 1); + valuesBucketThr.PutString("phonetic_name", "xiaohei||xh"); + int64_t rawContactIdThr = RawContactInsertValues(valuesBucketThr); + EXPECT_GT(rawContactIdThr, 0); + + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + columns.push_back("favorite"); + columns.push_back("phonetic_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdThr)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + std::vector listValue; + listValue.push_back(valuesBucketOne); + listValue.push_back(valuesBucketTwo); + listValue.push_back(valuesBucketThr); + CheckResultSetList(listValue, resultSet, "contactProfile_Query_test_3900"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4000 + * @tc.name Query the basic information of all contacts in the raw_contact table + * @tc.desc The ability to query the basic information of all contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4000 is starting! ---"); + std::string tag("contactProfile_Query_test_4000"); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + valuesBucketOne.PutString("display_name", "xiaohsaaei"); + valuesBucketOne.PutString("company", "tiantianxiadsjjnngshang"); + valuesBucketOne.PutString("position", "Tests"); + valuesBucketOne.PutInt("favorite", 1); + valuesBucketOne.PutString("phonetic_name", "xiaohssei||x00h"); + RawContactInsertValues(valuesBucketOne); + RawContactInsertValues(valuesBucketOne); + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.EqualTo("is_deleted", "0"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + // resultSet count + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 1); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4100 + * @tc.name Insert all contact information and query + * @tc.desc The ability to query all information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Query_test_4100 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("favorite", "1"); + int64_t rawContactId = RawContactInsert("feimaomao4100", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Query_test_4100"); + // resultSet count 1 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Query_test_4100"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4200 + * @tc.name Add a group and add two new contacts to the group to query the members of the group + * @tc.desc Query group member ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4200 is starting! ---"); + std::string tag("contactProfile_Query_test_4200"); + OHOS::NativeRdb::ValuesBucket valuesBucketGroup; + int64_t groupId = GroupsInsert("dongshihui", valuesBucketGroup); + EXPECT_GT(groupId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValuesBucket; + int64_t rawContactId = RawContactInsert("licheng", rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket valuesBucketOne; + int64_t contactDataId = + ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", valuesBucketOne); + EXPECT_GT(contactDataId, 0); + + rawContactValuesBucket.Clear(); + rawContactId = RawContactInsert("xiaoyuan", rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + OHOS::NativeRdb::ValuesBucket valuesBucketTwo; + contactDataId = ContactDataInsert(rawContactId, "group_membership", std::to_string(groupId), "", valuesBucketTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("detail_info", std::to_string(groupId)); + predicates.And(); + // type_id 9 is group_membership + predicates.EqualTo("type_id", "9"); + std::string contactData = ContactTabName::CONTACT_DATA; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(valuesBucketOne); + listValue.push_back(valuesBucketTwo); + CheckResultSetList(listValue, resultSet, "contactProfile_Query_test_4200"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4300 + * @tc.name Query favorite contacts + * @tc.desc Query the ability of favorite contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("display_name", "xiaoyuan"); + valuesBucket.PutString("company", "tiantianxiangshang"); + valuesBucket.PutString("position", "Test"); + valuesBucket.PutInt("favorite", 1); + valuesBucket.PutString("phonetic_name", "xiaoyuanxy"); + + int64_t rawContactId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("favorite", "1"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + predicates.And(); + predicates.EqualTo("id", std::to_string(rawContactId)); + + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesBucket, resultSet, "contactProfile_Query_test_4300"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4400 + * @tc.name Query recent contacts + * @tc.desc Query recent contact ability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValuesBucket; + int64_t rawContactId = RawContactLastContactedInsert("wangwu", 60, rawContactValuesBucket); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("lastest_contacted_time"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("lastest_contacted_time", "60"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(rawContactValuesBucket, resultSet, "contactProfile_Query_test_4400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4500 + * @tc.name Query the recently deleted contacts in the deleted contacts table + * @tc.desc Ability to query recently deleted contacts + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaobai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("display_name"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(rawContactValues, resultSet, "contactProfile_Query_test_4500"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4600 + * @tc.name Query the mobile phone numbers of all contacts + * @tc.desc Query the capabilities of all mobile phone numbers + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4600 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "phone", "155825478", "", contactDataValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + int64_t rawContactIdTwo = RawContactInsert("xiaocai", rawContactValuesTwo); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataId = ContactDataInsert(rawContactIdTwo, "phone", "18853269857", "", contactDataValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + predicates.Clear(); + // type_id 5 is phone + predicates.EqualTo("type_id", "5"); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactDataValues); + listValue.push_back(contactDataValuesTwo); + CheckResultSetList(listValue, resultSet, "contactProfile_Query_test_4600"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4700 + * @tc.name Query mailbox of all contacts + * @tc.desc Query all mailbox capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4700 is starting! ---"); + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactIdOne = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactIdOne, 0); + rawContactValues.Clear(); + + int64_t rawContactIdTwo = RawContactInsert("xiaocai", rawContactValues); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactIdOne, "email", "166@163.com", "", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + contactDataId = ContactDataInsert(rawContactIdTwo, "email", "199@163.com", "", contactValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + predicates.Clear(); + // type_id 1 is email + predicates.EqualTo("type_id", "1"); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactValues); + listValue.push_back(contactValuesTwo); + CheckResultSetList(listValue, resultSet, "contactProfile_Query_test_4700"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Query_test_4800 + * @tc.name Query information about a single contact + * @tc.desc Ability to query data information of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Query_test_4800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Query_test_4800 is starting! ---"); + std::string tag("contactProfile_Query_test_4800"); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("BossCai", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValues; + int64_t contactDataId = ContactDataInsert(rawContactId, "name", "BossCai", "", contactValues); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::ValuesBucket contactValuesTwo; + contactDataId = ContactDataInsert(rawContactId, "organization", "happy500", "Test", contactValuesTwo); + EXPECT_GT(contactDataId, 0); + + std::vector columns; + columns.push_back("detail_info"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string contactData = ContactTabName::CONTACT_DATA; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + std::vector listValue; + listValue.push_back(contactValues); + listValue.push_back(contactValuesTwo); + CheckResultSetList(listValue, resultSet, "contactProfile_Query_test_4800"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_4900 + * @tc.name Query the deleted contact according to the original contact ID + * @tc.desc Ability to delete contact data from the basic raw data table and record basic raw data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_4900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_4900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaoli", rawContactValues); + HILOG_INFO("rawContactId= %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contactProfile_Delete_test_4900"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_5000 + * @tc.name Delete a single full field data in the raw_contact table + * @tc.desc Raw contact deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_5000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Delete_test_5000 is starting!-----"); + // insert + std::vector columnsInt; + std::vector columnsStr; + GetAllRawContactColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + int rawId = RawContactInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + // test end delete data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + EXPECT_GT(rawId, 0); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + columns.push_back("is_deleted"); + OHOS::NativeRdb::ValuesBucket valuesBucketDelete; + valuesBucketDelete.PutInt("is_deleted", 1); + QueryAndExpectResult(rawContacts, predicates, valuesBucketDelete, "contactProfile_Delete_test_5000"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_5100 + * @tc.name Query the details of the newly deleted contact + * @tc.desc Ability to delete contact data from the detailed data table and record detailed data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_5100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_5100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("siyuan", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket contactValue; + int64_t contactDataId = ContactDataInsert(rawContactId, "organization", "tiantianxaingshang", "Test", contactValue); + EXPECT_GT(contactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contactProfile_Delete_test_5100"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_5200 + * @tc.name Delete a single full field data in the contact_data table + * @tc.desc Deleted ability to contactProfile_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_5200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contactProfile_Delete_test_5200 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string tableName = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("feimaotui", rawContactValues); + valuesBucket.PutInt("raw_contact_id", rawContactId); + // type id 6 is name + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_GT(ContactDataId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + int deleteCode = ContactDelete(tableName, predicates); + EXPECT_EQ(deleteCode, 0); + + MergeColumns(columns, columnsInt, columnsStr); + std::shared_ptr resultSetDeleteQuery = + ContactQuery(tableName, columns, predicates); + // resultSet count 0 + int rowCount = -1; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Delete_test_5300 + * @tc.name Query deleted basic data + * @tc.desc Ability to delete and record basic data of a single contact + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_5300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_5300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaohong", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("name_raw_contact_id", std::to_string(rawContactId)); + std::string contact = ContactTabName::CONTACT; + int deleteCode = ContactDelete(contact, predicates); + EXPECT_EQ(deleteCode, 0); + + sleep(SLEEP_TIME); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("display_name"); + predicates.Clear(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::string deletedRawContact = ContactTabName::DELETED_RAW_CONTACT; + std::shared_ptr resultSet = + ContactQuery(deletedRawContact, columns, predicates); + + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + rawContactValues.PutInt("raw_contact_id", rawContactId); + CheckResultSet(rawContactValues, resultSet, "contactProfile_Delete_test_5300"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_BatchInsert_test_5400 + * @tc.name Add basic contact information in batch and verify whether the insertion is successful + * @tc.desc Bulk increase capacity of address book + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_BatchInsert_test_5400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_BatchInsert_test_5400 is starting! ---"); + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValuesOne; + rawContactValuesOne.PutString("display_name", std::string("zhangming")); + rawContactValuesOne.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesOne.PutString("position", std::string("Test")); + + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + rawContactValuesTwo.PutString("display_name", std::string("ligang")); + rawContactValuesTwo.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesTwo.PutString("position", std::string("Developer")); + + OHOS::NativeRdb::ValuesBucket rawContactValuesThree; + rawContactValuesThree.PutString("display_name", std::string("wanghong")); + rawContactValuesThree.PutString("company", std::string("tiantainxiangzuo4200000000")); + rawContactValuesThree.PutString("position", std::string("manage")); + + std::vector listAddBluk; + listAddBluk.push_back(rawContactValuesOne); + listAddBluk.push_back(rawContactValuesTwo); + listAddBluk.push_back(rawContactValuesThree); + + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + std::string rawContacts = ContactTabName::RAW_CONTACT; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("company", "tiantainxiangzuo4200000000"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + predicates.OrderByAsc("id"); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + int rowCount = 0; + int queryCount = 3; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(queryCount, rowCount); + CheckResultSetList(listAddBluk, resultSet, "contactProfile_BatchInsert_test_5400"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_BatchInsert_test_5500 + * @tc.name Batch add contact details and verify that the insertion was successful + * @tc.desc Bulk increase capacity of address book + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_BatchInsert_test_5500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_BatchInsert_test_5500 is starting! ---"); + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_name", "zhangming"); + int64_t rawContactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + EXPECT_GT(rawContactId, 0); + + std::vector listAddBluk = GetBatchList(rawContactId); + int batchInserCode = contactsDataAbility.BatchInsert(uriContactData, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + std::string contactData = ContactTabName::CONTACT_DATA; + OHOS::NativeRdb::DataAbilityPredicates predicates; + // type_id 1 is email + predicates.EqualTo("type_id", "1"); + predicates.And(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + int indexTwo = 2; + CheckResultSet(listAddBluk[indexTwo], resultSet, "contactProfile_BatchInsert_test_5500"); + predicates.Clear(); + // type 5 is phone + predicates.EqualTo("type_id", "5"); + predicates.And(); + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSetFour = ContactQuery(contactData, columns, predicates); + int rowCountFour = 0; + resultSetFour->GetRowCount(rowCountFour); + EXPECT_EQ(1, rowCountFour); + int indexThree = 3; + CheckResultSet(listAddBluk[indexThree], resultSetFour, "contactProfile_BatchInsert_test_5500"); + ClearContacts(); +} + +std::vector ContactProfileTest::GetBatchList(int64_t rawContactId) +{ + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + contactDataValuesOne.PutInt("raw_contact_id", rawContactId); + contactDataValuesOne.PutString("content_type", "name"); + contactDataValuesOne.PutString("detail_info", "zhangming"); + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataValuesTwo.PutInt("raw_contact_id", rawContactId); + contactDataValuesTwo.PutString("content_type", "organization"); + contactDataValuesTwo.PutString("detail_info", "tiantianxaingshang"); + contactDataValuesTwo.PutString("position", "Test"); + OHOS::NativeRdb::ValuesBucket contactDataValuesThree; + contactDataValuesThree.PutInt("raw_contact_id", rawContactId); + contactDataValuesThree.PutString("content_type", "email"); + contactDataValuesThree.PutString("detail_info", "199632@163.com"); + OHOS::NativeRdb::ValuesBucket contactDataValuesFour; + contactDataValuesFour.PutInt("raw_contact_id", rawContactId); + contactDataValuesFour.PutString("content_type", "phone"); + contactDataValuesFour.PutString("detail_info", "1234567898"); + std::vector listAddBluk; + listAddBluk.push_back(contactDataValuesOne); + listAddBluk.push_back(contactDataValuesTwo); + listAddBluk.push_back(contactDataValuesThree); + listAddBluk.push_back(contactDataValuesFour); + return listAddBluk; +} + +/* + * @tc.number contactProfile_Delete_test_5600 + * @tc.name Delete contacts in batch and verify whether the deletion is successful + * @tc.desc delete ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Delete_test_5600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Delete_test_5600 is starting!---"); + int time = 10000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactIdOne = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdOne, 0); + int64_t rawContactIdTwo = RawContactInsert("update_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(ProfileUri::RAW_CONTACT); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewDeleteBuilder(uri) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + contactsDataAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::string tableName = ContactTabName::CONTACT_DATA; + std::vector columnQuery; + columnQuery.push_back("detail_info"); + predicates.EqualTo("is_deleted", "0"); + std::shared_ptr resultSet = ContactQuery(tableName, columnQuery, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_5700 + * @tc.name Batch favorite / cancel favorite contacts + * @tc.desc Batch collection and uncollection capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_5700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_5700 is starting! ---"); + + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValuesOne; + rawContactValuesOne.PutString("display_name", "zhangmingming"); + rawContactValuesOne.PutInt("favorite", 1); + OHOS::NativeRdb::ValuesBucket rawContactValuesTwo; + rawContactValuesTwo.PutString("display_name", "yuanmoumou"); + rawContactValuesTwo.PutInt("favorite", 1); + OHOS::NativeRdb::ValuesBucket rawContactValuesThree; + rawContactValuesThree.PutString("display_name", "xiaofenren"); + rawContactValuesThree.PutInt("favorite", 1); + + std::vector listAddBluk; + listAddBluk.push_back(rawContactValuesOne); + listAddBluk.push_back(rawContactValuesTwo); + listAddBluk.push_back(rawContactValuesThree); + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("contactProfile_Update_test_5700 : batchInserCode = %{public}d", batchInserCode); + EXPECT_EQ(batchInserCode, 0); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("display_name", "zhangmingming"); + predicates.Or(); + predicates.EqualTo("display_name", "yuanmoumou"); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("contactProfile_Update_test_5700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("display_name", "zhangmingming"); + QueryAndExpectResult(rawContacts, predicates, updateValues, "contactProfile_Update_test_5700"); + + predicates.Clear(); + predicates.EqualTo("display_name", "xiaofenren"); + QueryAndExpectResult(rawContacts, predicates, rawContactValuesThree, "contactProfile_Update_test_5700"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_Update_test_5800 + * @tc.name Update the contact in batch and verify whether the modification is successful + * @tc.desc update ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_Update_test_5800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_Update_test_5800 is starting!---"); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactIdOne = RawContactInsert("update_detail_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdOne, 0); + int64_t rawContactIdTwo = RawContactInsert("update_contactdata", rawValuesBucket); + EXPECT_GT(rawContactIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawContactIdTwo)); + std::shared_ptr values = + std::make_shared(rawValuesBucket); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(ProfileUri::RAW_CONTACT); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewUpdateBuilder(uri) + ->WithValuesBucket(values) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + contactsDataAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::string tableName = ContactTabName::RAW_CONTACT; + std::vector columnQuery; + columnQuery.push_back("display_name"); + std::shared_ptr resultSet = ContactQuery(tableName, columnQuery, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(rawValuesBucket); + listValue.push_back(rawValuesBucket); + CheckResultSetList(listValue, resultSet, "contactProfile_Update_test_5800"); + ClearContacts(); +} + +/* + * @tc.number contactProfile_BatchInsertAndDelete_test_5900 + * @tc.name Batch add / delete contact blocklist + * @tc.desc Ability to add and remove contacts from the blocklist in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_BatchInsertAndDelete_test_5900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_BatchInsertAndDelete_test_5900 is starting! ---"); + OHOS::Uri uriContactBlacklist(ProfileUri::BLOCKLIST); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesOne; + contactBlacklistValuesOne.PutString("phone_number", "147258369"); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesTwo; + contactBlacklistValuesTwo.PutString("phone_number", "963852741"); + OHOS::NativeRdb::ValuesBucket contactBlacklistValuesThree; + contactBlacklistValuesThree.PutString("phone_number", "1234789602"); + + std::vector listAddBluk; + listAddBluk.push_back(contactBlacklistValuesOne); + listAddBluk.push_back(contactBlacklistValuesTwo); + listAddBluk.push_back(contactBlacklistValuesThree); + int batchInsertCode = contactsDataAbility.BatchInsert(uriContactBlacklist, listAddBluk); + EXPECT_EQ(batchInsertCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", std::string("147258369")); + predicates.Or(); + predicates.EqualTo("phone_number", std::string("963852741")); + std::string contactBlocklist = ContactTabName::CONTACT_BLOCKLIST; + int deleteCode = ContactDelete(contactBlocklist, predicates); + EXPECT_EQ(deleteCode, 0); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(contactBlocklist, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number contactProfile_BatchInsertAndDelete_test_6000 + * @tc.name Batch add contacts to the group, and then delete contacts from the group + * @tc.desc Ability to join or remove contacts from groups in bulk + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, contactProfile_BatchInsertAndDelete_test_6000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contactProfile_BatchInsertAndDelete_test_6000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesGroup; + int64_t groupIdOne = GroupsInsert("TestFourth", valuesGroup); + EXPECT_GT(groupIdOne, 0); + + valuesGroup.Clear(); + int64_t groupIdTwo = GroupsInsert("TestFifth", valuesGroup); + EXPECT_GT(groupIdTwo, 0); + + valuesGroup.Clear(); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("xiaocheng", rawContactValues); + EXPECT_GT(rawContactId, 0); + + OHOS::Uri uriContactData(ProfileUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket contactDataValuesOne; + contactDataValuesOne.PutInt("raw_contact_id", rawContactId); + contactDataValuesOne.PutString("content_type", std::string("group_membership")); + contactDataValuesOne.PutString("detail_info", std::to_string(groupIdOne)); + OHOS::NativeRdb::ValuesBucket contactDataValuesTwo; + contactDataValuesTwo.PutInt("raw_contact_id", rawContactId); + contactDataValuesTwo.PutString("content_type", std::string("group_membership")); + contactDataValuesTwo.PutString("detail_info", std::to_string(groupIdTwo)); + + std::vector listAddBluk; + listAddBluk.push_back(contactDataValuesOne); + listAddBluk.push_back(contactDataValuesTwo); + int batchInserCode = contactsDataAbility.BatchInsert(uriContactData, listAddBluk); + EXPECT_EQ(batchInserCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + predicates.And(); + predicates.EqualTo("detail_info", std::to_string(groupIdOne)); + std::string contactData = ContactTabName::CONTACT_DATA; + int deleteCode = ContactDelete(contactData, predicates); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Insert_test_6100 + * @tc.name When inserting a contact, a field or table name that does not exist is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Insert_test_6100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_Insert_test_6100 is starting! ---"); + + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::Uri errorUri(ProfileUri::ERROR_URI); + + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_names", "liming"); + int64_t rawontactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + HILOG_INFO("abnormal_contactProfile_Insert_test_6100 : rawontactId = %{public}lld", rawontactId); + EXPECT_EQ(rawontactId, -1); + + rawContactValues.Clear(); + rawContactValues.PutString("display_name", "liming"); + rawontactId = contactsDataAbility.Insert(errorUri, rawContactValues); + EXPECT_EQ(rawontactId, -1); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Insert_test_6200 + * @tc.name Verify contact_ Required field in data table (type_id) + * @tc.desc Added ability to contactProfile_data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Insert_test_6200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_contactProfile_Insert_test_6200 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("lock_type_id", rawValuesBucket); + valuesBucket.PutInt("raw_contact_id", rawContactId); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_EQ(ContactDataId, -1); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + // resultSet count 0 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + CheckResultSet(valuesBucket, resultSet, "abnormal_contactProfile_Insert_test_6200"); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Insert_test_6300 + * @tc.name Verify contact_ Required field in data table (raw_contact_id) + * @tc.desc Added ability to contactProfile_data + * @tc.level Level1 + * @tc.size MediumTest + * + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Insert_test_6300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_contactProfile_Insert_test_6300 is starting!-----"); + std::vector columnsInt; + std::vector columnsStr; + std::vector columns; + std::string contactData = ContactTabName::CONTACT_DATA; + GetAllContactDataColumns(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket valuesBucket = GetAllColumnsValues(columnsInt, columnsStr); + OHOS::NativeRdb::ValuesBucket rawValuesBucket; + int64_t rawContactId = RawContactInsert("lock_raw_contact_id", rawValuesBucket); + valuesBucket.PutInt("type_id", 6); + int ContactDataId = ContactDataInsertValues(valuesBucket); + EXPECT_EQ(ContactDataId, -1); + + MergeColumns(columns, columnsInt, columnsStr); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawContactId)); + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + // resultSet count 0 + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + CheckResultSet(valuesBucket, resultSet, "abnormal_contactProfile_Insert_test_6300"); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Update_test_6400 + * @tc.name When modifying, incorrect field or table name or nonexistent value is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Update_test_6400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_Update_test_6400 is starting! ---"); + OHOS::Uri errorUri(ProfileUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("zhangming", rawContactValues); + HILOG_INFO("abnormal_contactProfile_Update_test_6400 : rawContactId = %{public}lld", rawContactId); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("display_names", "dongming"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("abnormal_contactProfile_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(rawContacts, predicates, rawContactValues, "abnormal_contactProfile_Update_test_6400"); + + updateValues.Clear(); + updateValues.PutString("display_name", "dongming"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + updateCode = contactsDataAbility.Update(errorUri, updateValues, predicates); + HILOG_INFO("abnormal_contactProfile_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + QueryAndExpectResult(rawContacts, predicates, rawContactValues, "abnormal_contactProfile_Update_test_6400"); + + predicates.Clear(); + predicates.EqualTo("id", "100000"); + updateCode = ContactUpdate(rawContacts, updateValues, predicates); + HILOG_INFO("abnormal_contactProfile_Update_test_6400: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Query_test_6500 + * @tc.name An incorrect field was passed in while querying + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Query_test_6500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_Query_test_6500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket rawContactValues; + int64_t rawContactId = RawContactInsert("dongming", rawContactValues); + EXPECT_GT(rawContactId, 0); + + std::vector columns; + columns.push_back("display_names"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + std::shared_ptr resultSet = ContactQuery(rawContacts, columns, predicates); + + int rowCount = -2; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Query_test_6600 + * @tc.name Bad URI passed in when querying + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Query_test_6600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_Query_test_6600 is starting! ---"); + std::string tag("abnormal_contactProfile_Query_test_6600"); + + OHOS::Uri errorUri(ProfileUri::ERROR_URI); + + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + contactsDataAbility.Query(errorUri, columns, predicates); + EXPECT_EQ(resultSet, nullptr); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_Delete_test_6700 + * @tc.name When deleting, an incorrect URI, field or non-existent value is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_Delete_test_6700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-------abnormal_contactProfile_Delete_test_6700 is starting!-------"); + OHOS::Uri errorUri(ProfileUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket values; + int64_t rawContactId = RawContactInsert("zhangming", values); + EXPECT_GT(rawContactId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(rawContactId)); + std::string rawContacts = ContactTabName::RAW_CONTACT; + int deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, -1); + + OHOS::NativeRdb::DataAbilityPredicates predicatesQuery; + predicatesQuery.EqualTo("id", std::to_string(rawContactId)); + std::vector columns; + std::shared_ptr resultSet = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + resultSet->Close(); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + deleteCode = contactsDataAbility.Delete(errorUri, predicates); + EXPECT_EQ(deleteCode, -1); + std::shared_ptr resultSetUri = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCountUri = 0; + resultSetUri->GetRowCount(rowCountUri); + EXPECT_EQ(1, rowCountUri); + resultSetUri->Close(); + + predicates.Clear(); + predicates.EqualTo("id", "10000000"); + deleteCode = ContactDelete(rawContacts, predicates); + EXPECT_EQ(deleteCode, -1); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawContactId)); + std::shared_ptr resultSetId = + ContactQuery(rawContacts, columns, predicatesQuery); + int rowCountId = 0; + resultSetId->GetRowCount(rowCountId); + EXPECT_EQ(1, rowCountId); + resultSetId->Close(); + ClearContacts(); +} + +/* + * @tc.number abnormal_contactProfile_BatchInsert_test_6800 + * @tc.name When adding contacts in batch, several of them fail. Check the processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_BatchInsert_test_6800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_BatchInsert_test_6800 is starting! ---"); + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::vector listAddBluk; + int batchInserCode = 0; + for (int i = 0; i < 10; i++) { + listAddBluk.clear(); + for (int j = 10 * i + 1; j <= 10 * (i + 1); j++) { + rawContactValues.Clear(); + std::string name("zhangming"); + name.append(std::to_string(j)); + if (j == 14 || j == 27 || j == 57) { + rawContactValues.PutString("display_names", name); + } else { + rawContactValues.PutString("display_name", name); + } + listAddBluk.push_back(rawContactValues); + } + batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("abnormal_contactProfile_BatchInsert_test_6800 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_contactProfile_BatchInsert_test_6800 batch insert success!"); + } else { + HILOG_INFO("abnormal_contactProfile_BatchInsert_test_6800 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + } + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 20000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ProfileUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number abnormal_contactProfile_BatchInsert_test_6900 + * @tc.name When adding contacts in batch, item 500 fails. Check the subsequent processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactProfileTest, abnormal_contactProfile_BatchInsert_test_6900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_contactProfile_BatchInsert_test_6900 is starting! ---"); + OHOS::Uri uriRawContact(ProfileUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::vector listAddBluk; + for (int i = 0; i < 1000; i++) { + rawContactValues.Clear(); + std::string name("xiaoyuan"); + name.append(std::to_string(i)); + if (i == 500) { + rawContactValues.PutString("display_names", name); + } else { + rawContactValues.PutString("display_name", name); + } + listAddBluk.push_back(rawContactValues); + } + int batchInserCode = contactsDataAbility.BatchInsert(uriRawContact, listAddBluk); + HILOG_INFO("abnormal_contactProfile_BatchInsert_test_6900 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_contactProfile_BatchInsert_test_6900 batch insert success!"); + } else { + HILOG_ERROR("abnormal_contactProfile_BatchInsert_test_6900 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 20000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ProfileUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/contactquery_test.cpp b/test/unittest/src/contactquery_test.cpp new file mode 100644 index 0000000..3365a30 --- /dev/null +++ b/test/unittest/src/contactquery_test.cpp @@ -0,0 +1,492 @@ +/* + * Copyright (c) 2021 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 "contactquery_test.h" + +#include "construction_name.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +ContactQueryTest::ContactQueryTest() +{ +} + +ContactQueryTest::~ContactQueryTest() +{ +} + +int64_t ContactQueryTest::RawContactInsert(std::string displayName, OHOS::NativeRdb::ValuesBucket &rawContactValues) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + return code; +} + +int64_t ContactQueryTest::ContactDataInsert(int64_t rawContactId, std::string contentType, std::string detailInfo, + std::string position, OHOS::NativeRdb::ValuesBucket &contactDataValues) +{ + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", contentType); + contactDataValues.PutString("detail_info", detailInfo); + contactDataValues.PutString("position", position); + int64_t code = contactsDataAbility.Insert(uriContactData, contactDataValues); + return code; +} + +std::shared_ptr ContactQueryTest::ContactQuery( + const std::string &tableName, std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + std::shared_ptr resultSet; + if (tableName == ContactTabName::RAW_CONTACT) { + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriRawContact, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_DATA) { + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + resultSet = contactsDataAbility.Query(uriContactData, columns, predicates); + } else if (tableName == ContactTabName::CONTACT) { + OHOS::Uri uriContact(ContactsUri::CONTACT); + resultSet = contactsDataAbility.Query(uriContact, columns, predicates); + } else if (tableName == ContactTabName::GROUPS) { + OHOS::Uri uriGroups(ContactsUri::GROUPS); + resultSet = contactsDataAbility.Query(uriGroups, columns, predicates); + } else if (tableName == ContactTabName::CONTACT_BLOCKLIST) { + OHOS::Uri uriBlocklist(ContactsUri::BLOCKLIST); + resultSet = contactsDataAbility.Query(uriBlocklist, columns, predicates); + } else if (tableName == ContactTabName::DELETED_RAW_CONTACT) { + OHOS::Uri uriDeletedRawContact(ContactsUri::RAW_CONTACT); + resultSet = contactsDataAbility.Query(uriDeletedRawContact, columns, predicates); + } else if (tableName == ContactTabName::SEARCH_CONTACT) { + OHOS::Uri uriSearchContact(ContactsUri::SEARCH); + resultSet = contactsDataAbility.Query(uriSearchContact, columns, predicates); + } else { + HILOG_ERROR("ContactsDataAbility ====>no match uri action"); + } + return resultSet; +} + +void ContactQueryTest::ClearData() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = 2000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* +* @tc.number contact_data_Insert_test_100 +* @tc.name Insert contact details, including + (name, company, position, mobile phone number, nickname, email, home, remarks, aim) +* @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities +* @tc.level Level1 +* @tc.size MediumTest +* @tc.type Function +*/ +HWTEST_F(ContactQueryTest, contact_data_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----contact_data_Insert_test_100-----"); + OHOS::Contacts::ConstructionName::local = "zh-CN"; + OHOS::NativeRdb::ValuesBucket values; + OHOS::NativeRdb::ValuesBucket valuesOne; + OHOS::NativeRdb::ValuesBucket valuesTwo; + OHOS::NativeRdb::ValuesBucket valuesThree; + OHOS::NativeRdb::ValuesBucket valuesFour; + OHOS::NativeRdb::ValuesBucket valuesFive; + OHOS::NativeRdb::ValuesBucket valuesSix; + OHOS::NativeRdb::ValuesBucket valuesSeven; + OHOS::NativeRdb::ValuesBucket valuesEight; + std::string searchContact = ContactTabName::SEARCH_CONTACT; + int64_t rawContactId = RawContactInsert("买键盘", values); + EXPECT_GT(rawContactId, 0); + + int64_t contactDataIdOne = ContactDataInsert(rawContactId, "name", "买键盘", "", valuesOne); + EXPECT_GT(contactDataIdOne, 0); + + int64_t contactDataIdTwo = + ContactDataInsert(rawContactId, "organization", "你好天天向上hsk", "安全测试", valuesTwo); + EXPECT_GT(contactDataIdTwo, 0); + + int64_t contactDataIdThree = ContactDataInsert(rawContactId, "phone", "18552504058", "", valuesThree); + EXPECT_GT(contactDataIdThree, 0); + + int64_t contactDataIdFour = ContactDataInsert(rawContactId, "nickname", "买键盘", "", valuesFour); + EXPECT_GT(contactDataIdFour, 0); + + int64_t contactDataIdFive = ContactDataInsert(rawContactId, "email", "1667894561@163.com", "", valuesFive); + EXPECT_GT(contactDataIdFive, 0); + + int64_t contactDataIdSix = ContactDataInsert(rawContactId, "postal_address", "南京市", "", valuesSix); + EXPECT_GT(contactDataIdSix, 0); + + int64_t contactDataIdSeven = ContactDataInsert(rawContactId, "note", "LanguagemjavaC++", "", valuesSeven); + EXPECT_GT(contactDataIdSeven, 0); + + int64_t contactDataIdEight = ContactDataInsert(rawContactId, "im", "14487956@1.com", "", valuesEight); + EXPECT_GT(contactDataIdEight, 0); + ClearData(); +} + +/* + * @tc.number query_by_name_test_200 + * @tc.name Fuzzy search by name + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_name_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_name_test_200 is starting!-----"); + std::string tag("query_by_name_test_200"); + std::vector columns; + columns.push_back("display_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("display_name", "%买%"); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + std::shared_ptr resultSet = ContactQuery(searchContact, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("display_name", "买键盘"); + CheckResultSet(values, resultSet, "query_by_name_test_200"); + ClearData(); +} + +/* + * @tc.number query_by_pinyin_test_300 + * @tc.name Fuzzy search based on name Pinyin + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_pinyin_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_pinyin_test_300 is starting!-----"); + std::string tag("query_by_pinyin_test_300"); + std::vector columns; + columns.push_back("id"); + columns.push_back("search_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("search_name", "%mai%"); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + std::shared_ptr resultSet = ContactQuery(searchContact, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("search_name", "买键盘||maijianpan||mjp"); + CheckResultSet(values, resultSet, "query_by_pinyin_test_300"); + ClearData(); +} + +/* + * @tc.number query_by_pinyin_test_400 + * @tc.name Fuzzy search based on Pinyin name + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_pinyin_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_pinyin_test_400 is starting!-----"); + std::string tag("query_by_pinyin_test_400"); + std::vector columns; + columns.push_back("id"); + columns.push_back("search_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("search_name", "%mjp%"); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + std::shared_ptr resultSet = ContactQuery(searchContact, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("search_name", "买键盘||maijianpan||mjp"); + CheckResultSet(values, resultSet, "query_by_pinyin_test_400"); + ClearData(); +} + +/* + * @tc.number query_by_company_test_500 + * @tc.name Fuzzy search by company + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_company_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_company_test_500 is starting!-----"); + std::string tag("query_by_company_test_500"); + std::vector columns; + columns.push_back("detail_info"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "%天天向上%"); + predicates.And(); + predicates.EqualTo("type_id", "4"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "你好天天向上hsk"); + values.PutString("position", "安全测试"); + CheckResultSet(values, resultSet, "query_by_company_test_500"); + ClearData(); +} + +/* + * @tc.number query_by_position_test_600 + * @tc.name Fuzzy search by position + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_position_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_position_test_600 is starting!-----"); + std::string tag("query_by_position_test_600"); + std::vector columns; + columns.push_back("detail_info"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("position", "%测试%"); + predicates.And(); + predicates.EqualTo("type_id", "4"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "你好天天向上hsk"); + values.PutString("position", "安全测试"); + CheckResultSet(values, resultSet, "query_by_position_test_600"); + ClearData(); +} + +/* + * @tc.number query_by_phone_test_700 + * @tc.name Fuzzy search according to mobile phone number + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_phone_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_phone_test_700 is starting!-----"); + std::string tag("query_by_phone_test_700"); + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "1855250%"); + predicates.And(); + predicates.EqualTo("type_id", "5"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "18552504058"); + CheckResultSet(values, resultSet, "query_by_phone_test_700"); + ClearData(); +} + +/* + * @tc.number query_by_nick_name_test_800 + * @tc.name Fuzzy search by nickname + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_nick_name_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_nick_name_test_800 is starting!-----"); + std::string tag("query_by_nick_name_test_800"); + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "%买%"); + predicates.And(); + predicates.EqualTo("type_id", "3"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "买键盘"); + CheckResultSet(values, resultSet, "query_by_nick_name_test_800"); + ClearData(); +} + +/* + * @tc.number query_by_email_test_900 + * @tc.name Fuzzy search by mailbox + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_email_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_email_test_900 is starting!-----"); + std::string tag("query_by_email_test_900"); + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "166%"); + predicates.And(); + predicates.EqualTo("type_id", "1"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "1667894561@163.com"); + CheckResultSet(values, resultSet, "query_by_email_test_900"); + ClearData(); +} + +/* + * @tc.number query_by_address_test_1000 + * @tc.name Fuzzy search based on house + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_address_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_address_test_1000 is starting!-----"); + std::string tag("query_by_address_test_1000"); + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "%南京%"); + predicates.And(); + predicates.EqualTo("type_id", "7"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "南京市"); + CheckResultSet(values, resultSet, "query_by_address_test_1000"); + ClearData(); +} + +/* + * @tc.number query_by_note_test_1100 + * @tc.name Fuzzy search based on comments + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_note_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_note_test_1100 is starting!-----"); + std::string tag("query_by_note_test_1100"); + std::vector columns; + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "%mjava%"); + predicates.And(); + predicates.EqualTo("type_id", "10"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "LanguagemjavaC++"); + CheckResultSet(values, resultSet, "query_by_note_test_1100"); + ClearData(); +} + +/* + * @tc.number query_by_aim_test_1200 + * @tc.name Fuzzy search according to aim + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, query_by_aim_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----query_by_aim_test_1200 is starting!-----"); + std::string tag("query_by_aim_test_1200"); + std::vector columns; + columns.push_back("id"); + columns.push_back("raw_contact_id"); + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("detail_info", "144%"); + predicates.And(); + predicates.EqualTo("type_id", "2"); + std::string contactData = "contact_data"; + std::shared_ptr resultSet = ContactQuery(contactData, columns, predicates); + + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "14487956@1.com"); + CheckResultSet(values, resultSet, "query_by_aim_test_1200"); + ClearData(); +} + +/* + * @tc.number abnormal_contact_Query_test_1300 + * @tc.name An incorrect field name was passed in during retrieval + * @tc.desc Based on name, name pinyin, pinyin name, company, position, mobile phone number, nickname, + email address, residence, remarks, AIM fuzzy search capabilities + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(ContactQueryTest, abnormal_contact_Query_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_contact_Query_test_1300 is starting!-----"); + std::string tag("abnormal_contact_Query_test_1300"); + std::vector columns; + columns.push_back("id"); + columns.push_back("search_name"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.Like("search_namesss", "%mjp%"); + std::string searchContact = ContactTabName::SEARCH_CONTACT; + std::shared_ptr resultSet = ContactQuery(searchContact, columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + ClearData(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/mergecontact_test.cpp b/test/unittest/src/mergecontact_test.cpp new file mode 100644 index 0000000..a16d0ba --- /dev/null +++ b/test/unittest/src/mergecontact_test.cpp @@ -0,0 +1,1301 @@ +/* + * Copyright (c) 2021 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 "mergecontact_test.h" + +#include + +#include "match_candidate.h" +#include "merger_contacts.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +void MergeContactTest::DeleteRawContact() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + int time = Time::SLEEP_TIME_MERGE_DELETE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +void MergeContactTest::CheckMergeResultId(std::vector ids, bool merge) +{ + std::vector resultIdVector; + int mergeIdSize = ids.size(); + for (int i = 0; i < mergeIdSize; i++) { + std::vector columns; + columns.push_back("contact_id"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(ids[i])); + std::shared_ptr resultOne = ContactQuery(columns, predicates); + int contactIdOne = GetMergeResultContactId(resultOne); + resultIdVector.push_back(contactIdOne); + } + int size = resultIdVector.size(); + int64_t contactId = resultIdVector[0]; + for (int i = 1; i < size; i++) { + if (merge) { + EXPECT_EQ(contactId, resultIdVector[i]); + HILOG_INFO("merge contact_id = %{public}lld, contact_idTwo %{public}lld", contactId, resultIdVector[i]); + } else { + EXPECT_NE(contactId, resultIdVector[i]); + HILOG_INFO("split contact_id = %{public}lld", resultIdVector[i]); + } + } +} + +int MergeContactTest::GetMergeResultContactId(const std::shared_ptr resultSet) +{ + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + int resultSetNum = resultSet->GoToFirstRow(); + int resultSetIntValue = 0; + while (resultSetNum == OHOS::NativeRdb::E_OK) { + std::string typeValue = "contact_id"; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + resultSet->GetInt(columnIndex, resultSetIntValue); + break; + } + resultSet->Close(); + return resultSetIntValue; +} + +std::vector MergeContactTest::GetMergeResultRawContactId( + const std::shared_ptr resultSet) +{ + std::vector rawContactIdVector; + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int resultSetIntValue = 0; + std::string typeValue = "raw_contact_id"; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + resultSet->GetInt(columnIndex, resultSetIntValue); + rawContactIdVector.push_back(resultSetIntValue); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return rawContactIdVector; +} + +std::vector MergeContactTest::GetMergeRawContactId( + const std::shared_ptr resultSet) +{ + std::vector rawContactIdVector; + std::vector columnNames; + resultSet->GetAllColumnNames(columnNames); + int resultSetNum = resultSet->GoToFirstRow(); + while (resultSetNum == OHOS::NativeRdb::E_OK) { + int resultSetIntValue = 0; + std::string typeValue = "id"; + int columnIndex = 0; + resultSet->GetColumnIndex(typeValue, columnIndex); + resultSet->GetInt(columnIndex, resultSetIntValue); + rawContactIdVector.push_back(resultSetIntValue); + resultSetNum = resultSet->GoToNextRow(); + } + resultSet->Close(); + return rawContactIdVector; +} + +std::shared_ptr MergeContactTest::ContactQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uri(ContactsUri::RAW_CONTACT); + std::shared_ptr resultSet = + contactsDataAbility.Query(uri, columns, predicates); + return resultSet; +} + +int64_t MergeContactTest::RawContactInsert(std::string displayName) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + rawContactValues.Clear(); + return code; +} + +int64_t MergeContactTest::ContactDataInsert( + int64_t rawContactId, std::string contentType, std::string detailInfo, std::string position) +{ + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket contactDataValues; + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", contentType); + contactDataValues.PutString("detail_info", detailInfo); + contactDataValues.PutString("position", position); + int64_t code = contactsDataAbility.Insert(uriContactData, contactDataValues); + contactDataValues.Clear(); + return code; +} + +HWTEST_F(MergeContactTest, merge_test_start, testing::ext::TestSize.Level1) +{ + DeleteRawContact(); +} + +/* + * @tc.number merge_Query_test_100 + * @tc.name Insert contacts with the same name and different mobile numbers, + * and check whether the database can find the contacts that can be merged + * @tc.desc A: xiaowuwuwu 123456, B: xiaowuwuwu 1234567 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Query_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Query_test_100 query is starting! ---"); + int64_t rawOne = RawContactInsert("xiaowuww"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaowuww", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Query_test_100 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaowuww"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaowuww", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "1234567", ""); + HILOG_INFO("merge_Query_test_100 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriQueryMergeList(ContactsUri::MERGE_LIST); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::shared_ptr resultSet = + contactsDataAbility.Query(uriQueryMergeList, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector rawVector = GetMergeResultRawContactId(resultSet); + EXPECT_EQ(rawOne, rawVector[0]); + EXPECT_EQ(rawTwo, rawVector[1]); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_200 + * @tc.name Insert two contacts with the same name to check whether the database can be merged successfully + * @tc.desc A: xiaochenc, B: xiaochenc + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_200 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaochenc"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaochenc", ""); + HILOG_INFO("merge_Update_test_200 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaochenc"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaochenc", ""); + HILOG_INFO("merge_Update_test_200 : = %{public}lld", dataIdTwo); + int time = 2000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_300 + * @tc.name Insert two contacts with the same name. One of them has a mobile phone number. + * Check whether the database can be merged + * @tc.desc A: xiaomingmingming 123456, B: xiaomingmingming + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_300 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaomingmm"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaomingmm", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_300 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaomingmm"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaomingmm", ""); + HILOG_INFO("merge_Update_test_300 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_400 + * @tc.name Insert two contacts with the same name. The mobile phone numbers of contacts a and B are the same. + * Check whether the database can be merged + * @tc.desc A: xiaohong、123456, B: xiaohong、123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_400 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaohong"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaohong", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_400 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaohong"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaohong", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_400 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_500 + * @tc.name Insert two contacts with the same name. The mobile phone numbers of contacts a and B are different. + * Check whether the database can be merged + * @tc.desc A: xiaozhang、123456, B: xiaozhang、1234567 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_500 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaozhang"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaozhang", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_500 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaozhang"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaozhang", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_500 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_600 + * @tc.name Insert two contacts with the same name. Contact a has two mobile phone numbers + * and contact B has no mobile phone number. Check whether the database can be merged + * @tc.desc A: xiaozhou 123456/1234567, B: xiaozhou + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_600 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaozhou"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaozhou", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_600 dataIdOne_1 = %{public}lld", dataIdOne); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_600 dataIdOne_2 = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaozhou"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaozhou", ""); + HILOG_INFO("merge_Update_test_600 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_700 + * @tc.name Insert two contacts with the same name. Both contacts a and B have the same mobile phone numbers. + * Check whether the database can be merged + * @tc.desc A: xiaobai、123456/1234567, B: xiaobai、123456/1234567 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_700 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaobai"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaobai", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_700 dataIdOne_1 = %{public}lld", dataIdOne); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_700 dataIdOne_2 = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaobai"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaobai", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_700 dataIdTwo_1 = %{public}lld", dataIdTwo); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_700 dataIdTwo_2 = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_800 + * @tc.name Insert two contacts with the same name. Each contact a and B has two mobile phone numbers, one of which + * is the same. Check whether the database can be merged + * @tc.desc A: xiaomi、123456/1234567, B: xiaomi、123456/12345678 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_800 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaomi"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaomi", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_800 dataIdOne_1 = %{public}lld", dataIdOne); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_800 dataIdOne_2 = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaomi"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaomi", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_800 dataIdTwo_1 = %{public}lld", dataIdTwo); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "12345678", ""); + HILOG_INFO("merge_Update_test_800 dataIdTwo_2 = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_900 + * @tc.name Insert two contacts with the same name. Contact a has two mobile phone numbers, and contact B has one + * mobile phone number and is the same as one of the mobile phone numbers of A. check whether the database can be merged + * @tc.desc A: daniu、123456/1234567, B: daniu、123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_900 Add is starting! ---"); + int64_t rawOne = RawContactInsert("daniu"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "daniu", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_900 dataIdOne_1 = %{public}lld", dataIdOne); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_900 dataIdOne_2 = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("daniu"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "daniu", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_900 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_1000 + * @tc.name Insert two contacts with the same name. Contact a has two mobile phone numbers + * and contact B has one mobile phone number. Check whether the database can be merged + * @tc.desc A: mazi、123456/1234567, B: mazi、123456789 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_1000 Add is starting! ---"); + int64_t rawOne = RawContactInsert("mazi"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "mazi", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_1000 dataIdOne_1 = %{public}lld", dataIdOne); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_1000 dataIdOne_2 = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("mazi"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "mazi", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456789", ""); + HILOG_INFO("merge_Update_test_1000 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + value.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_1100 + * @tc.name After consolidation, it is transferred to - 1 for splitting + * @tc.desc Exception use case: Merge and pass -1 to split + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_1100 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaocai"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaocai", ""); + HILOG_INFO("abnormal_merge_Update_test_1100 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaocai"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaocai", ""); + HILOG_INFO("abnormal_merge_Update_test_1100 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket valueOne; + OHOS::NativeRdb::DataAbilityPredicates predicates; + contactsDataAbility.Update(uriAutoMerge, valueOne, predicates); + OHOS::Uri uriSplitContact(ContactsUri::SPLIT_CONTACT); + OHOS::NativeRdb::ValuesBucket valueTwo; + predicates.Clear(); + std::vector ids; + ids.push_back("-1"); + predicates.In("raw_contact_id", ids); + int ret = contactsDataAbility.Update(uriSplitContact, valueTwo, predicates); + EXPECT_EQ(ret, -1); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_1200 + * @tc.name Insert multiple automatically merged contacts to check whether the database can be merged + * @tc.desc A: xiaoliu、123456, B: xiaoliu、123456, C:xiaoliu、123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_1200, testing::ext::TestSize.Level1) +{ + int64_t rawOne = RawContactInsert("xiaoliu"); + int64_t dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + dataIdOne = ContactDataInsert(rawOne, "name", "xiaoliu", ""); + HILOG_INFO("merge_Update_test_1200 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaoliu"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaoliu", ""); + HILOG_INFO("merge_Update_test_1200 : = %{public}lld", dataIdTwo); + int64_t rawThree = RawContactInsert("xiaoliu"); + int64_t dataIdThree = ContactDataInsert(rawThree, "phone", "123456", ""); + dataIdThree = ContactDataInsert(rawThree, "name", "xiaoliu", ""); + HILOG_INFO("merge_Update_test_1200 : = %{public}lld", dataIdThree); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + ids.push_back(std::to_string(rawThree)); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + HILOG_INFO("ret : %{public}d ", ret); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_1300 + * @tc.name Insert two automatically merged contacts, modify a's name, + * and then automatically merge to see whether the database can be merged + * @tc.desc A: xiaohua、123456, B: xiaohua、123456 --> A: xiaohua、123456, B: dayu、123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_1300 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaohua"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaohua", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_1300 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaohua"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaohua", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Update_test_1300 dataIdTwo = %{public}lld", dataIdTwo); + + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "dayuy"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawTwo)); + predicates.And(); + predicates.EqualTo("type_id", "6"); + contactsDataAbility.Update(uriContactData, values, predicates); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + values.Clear(); + predicates.Clear(); + int ret = contactsDataAbility.Update(uriAutoMerge, values, predicates); + EXPECT_EQ(ret, -1); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_1400 + * @tc.name Insert two automatically merged contacts, modify a's mobile phone number, + * and then manually merge contacts to see whether the database can be merged + * @tc.desc A: xiaobei、123456, B: xiaobei、123456 --> A: xiaobei、123456, B: xiaobei、1234567 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_1400 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaobei"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaobei", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "17612345689", ""); + HILOG_INFO("merge_Update_test_1400 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaobei"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaobei", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "17612345689", ""); + HILOG_INFO("merge_Update_test_1400 dataIdTwo = %{public}lld", dataIdTwo); + + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("detail_info", "18355421566"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("raw_contact_id", std::to_string(rawTwo)); + predicates.And(); + predicates.EqualTo("type_id", "5"); + contactsDataAbility.Update(uriContactData, values, predicates); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + values.Clear(); + predicates.Clear(); + int ret = contactsDataAbility.Update(uriAutoMerge, values, predicates); + EXPECT_EQ(ret, -1); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + values.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, values, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_1500 + * @tc.name After consolidation, it is transferred to rowid1 for splitting + * @tc.desc After merging, pass rowId1 to split + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ + +HWTEST_F(MergeContactTest, merge_Update_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_1500 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaolil"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaolil", ""); + HILOG_INFO("merge_Update_test_1500 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaoli"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaolil", ""); + HILOG_INFO("merge_Update_test_1500 : = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + int ret; + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket valueOne; + OHOS::NativeRdb::DataAbilityPredicates predicates; + ret = contactsDataAbility.Update(uriAutoMerge, valueOne, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + + OHOS::Uri uriSplitContact(ContactsUri::SPLIT_CONTACT); + OHOS::NativeRdb::ValuesBucket valueTwo; + std::vector ids; + ids.push_back(std::to_string(rawOne)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriSplitContact, valueTwo, predicates); + EXPECT_EQ(ret, 0); + CheckMergeResultId(resultIdVector, false); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Query_test_1600 + * @tc.name Insert contacts with the same name and different mobile numbers. + * The URI address is wrong. Check whether the database can find the contacts that can be merged + * @tc.desc A: xiaoma 123456, B: xiaoma 1234567 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Query_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Query_test_1600 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaoma"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaoma", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("abnormal_merge_Query_test_1600 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaoma"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaoma", ""); + dataIdOne = ContactDataInsert(rawTwo, "phone", "1234567", ""); + HILOG_INFO("abnormal_merge_Query_test_1600 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriQueryMergeList(ContactsUri::MERGE_LIST_ERROR); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::shared_ptr resultSet = + contactsDataAbility.Query(uriQueryMergeList, columns, predicates); + EXPECT_EQ(resultSet, nullptr); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_1700 + * @tc.name Parameter URI address error + * @tc.desc Passing an error auto_merge uri + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_1700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_1700 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaoqian"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaoqian", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + int64_t rawTwo = RawContactInsert("xiaoqian"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaoqian", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("abnormal_merge_Update_test_1700 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::MERGE_ERROR); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + + HILOG_INFO("ret : %{public}d ", ret); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawTwo)); + contactsDataAbility.Delete(uriRawContact, predicates); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_1800 + * @tc.name Insert two contacts with different names and merge them automatically to see if the database can be + * merged + * @tc.desc A: xiaosun、123456, B: xiaomei、123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_1800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_1800 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaosun"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaosun", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("abnormal_merge_Update_test_1800 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaomei"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaomei", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("abnormal_merge_Update_test_1800 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + HILOG_INFO("ret : %{public}d ", ret); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_1900 + * @tc.name Insert two contacts with different names for automatic merging and manual merging + * @tc.desc A: bob2300, B: lileibob2300 --> A: bob2300, B: lileibob2300 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_1900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_1900 Add is starting! ---"); + int64_t rawOne = RawContactInsert("bob2300"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "bob2300", ""); + HILOG_INFO("abnormal_merge_Update_test_1900 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("lileibob2300"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "lileibob2300", ""); + HILOG_INFO("abnormal_merge_Update_test_1900 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + + OHOS::NativeRdb::ValuesBucket values; + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + int ret = contactsDataAbility.Update(uriAutoMerge, values, predicates); + EXPECT_EQ(ret, -1); + std::this_thread::sleep_for(dura); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + values.Clear(); + predicates.Clear(); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + ret = contactsDataAbility.Update(uriManualMerge, values, predicates); + EXPECT_EQ(ret, -1); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_2000 + * @tc.name Pass in the wrong field name -- nameee, name + * @tc.desc A: xiaowang, B: xiaowang + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_2000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_2000 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaowang"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "nameee", "xiaowang", ""); + HILOG_INFO("abnormal_merge_Update_test_2000 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaowang"); + EXPECT_GT(rawOne, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaowang", ""); + HILOG_INFO("abnormal_merge_Update_test_2000 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int ret = contactsDataAbility.Update(uriAutoMerge, value, predicates); + EXPECT_EQ(ret, -1); + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, false); + + HILOG_INFO("ret : %{public}d ", ret); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(dataIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(dataIdTwo)); + contactsDataAbility.Delete(uriRawContact, predicates); + DeleteRawContact(); +} + +/* + * @tc.number abnormal_merge_Update_test_2100 + * @tc.name After consolidation, it is transferred to 0 for splitting + * @tc.desc Exception use case: Merge and pass 0 to split + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, abnormal_merge_Update_test_2100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_merge_Update_test_2100 Add is starting! ---"); + int64_t rawOne = RawContactInsert("xiaocheng"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaocheng", ""); + HILOG_INFO("abnormal_merge_Update_test_2100 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaocheng"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaocheng", ""); + HILOG_INFO("abnormal_merge_Update_test_2100 : = %{public}lld", dataIdTwo); + std::chrono::milliseconds dura(Time::SLEEP_TIME_MERGE); + std::this_thread::sleep_for(dura); + OHOS::Uri uriAutoMerge(ContactsUri::AUTO_MERGE); + OHOS::NativeRdb::ValuesBucket valueOne; + OHOS::NativeRdb::DataAbilityPredicates predicates; + contactsDataAbility.Update(uriAutoMerge, valueOne, predicates); + OHOS::Uri uriSplitContact(ContactsUri::SPLIT_CONTACT); + OHOS::NativeRdb::ValuesBucket valueTwo; + predicates.Clear(); + std::vector ids; + ids.push_back("0"); + predicates.In("raw_contact_id", ids); + int ret = contactsDataAbility.Update(uriSplitContact, valueTwo, predicates); + EXPECT_EQ(ret, -1); + + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_2200 + * @tc.name Insert multiple manually merged contacts to check whether the database can be merged + * @tc.desc A: xiaocai、1234567, B: xiaocai、123456, C:xiaocai、12345678 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_2200, testing::ext::TestSize.Level1) +{ + int64_t rawOne = RawContactInsert("xiaocai"); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaocai", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234567", ""); + HILOG_INFO("merge_Update_test_2200 : = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaocai"); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaocai", ""); + HILOG_INFO("merge_Update_test_2200 : = %{public}lld", dataIdTwo); + int64_t rawThree = RawContactInsert("xiaocai"); + int64_t dataIdThree = ContactDataInsert(rawThree, "phone", "12345678", ""); + dataIdThree = ContactDataInsert(rawThree, "name", "xiaocai", ""); + HILOG_INFO("merge_Update_test_2200 : = %{public}lld", dataIdThree); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + ids.push_back(std::to_string(rawThree)); + predicates.In("raw_contact_id", ids); + int ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + HILOG_INFO("ret : %{public}d ", ret); + DeleteRawContact(); +} + +/* + * @tc.number merge_Query_test_2300 + * @tc.name Insert two contacts with the same name to check whether the database + * can find the contacts that can be merged + * @tc.desc A: xsiaowuwwwww B: xsiaowuwwwww + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Query_test_2300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Query_test_2300 query is starting! ---"); + int64_t rawOne = RawContactInsert("xsiaowuwwwww"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xsiaowuwwwww", ""); + HILOG_INFO("merge_Query_test_2300 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xsiaowuwwwww"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xsiaowuwwwww", ""); + HILOG_INFO("merge_Query_test_2300 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.BeginWrap(); + predicates.EqualTo("id", std::to_string(rawOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawTwo)); + predicates.EndWrap(); + predicates.And(); + predicates.EqualTo("merge_mode", "2"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector rawVector = GetMergeRawContactId(resultSet); + EXPECT_EQ(rawOne, rawVector[0]); + EXPECT_EQ(rawTwo, rawVector[1]); + DeleteRawContact(); +} + +/* + * @tc.number merge_Query_test_2400 + * @tc.name Insert two contacts with different names to check whether the database + * can find the contacts that can be merged + * @tc.desc A: jackxsiaowuwwwww, B: xsiaowuwwwww + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Query_test_2400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Query_test_2400 query is starting! ---"); + int64_t rawOne = RawContactInsert("jackxsiaowuwwwww"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "jackxsiaowuwwwww", ""); + HILOG_INFO("merge_Query_test_2400 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xsiaowuwwwww"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xsiaowuwwwww", ""); + HILOG_INFO("merge_Query_test_2400 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriQueryMergeList(ContactsUri::MERGE_LIST); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::shared_ptr resultSet = + contactsDataAbility.Query(uriQueryMergeList, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + DeleteRawContact(); +} + +/* + * @tc.number merge_Query_test_2500 + * @tc.name Insert contacts with the same name and phone number, and check whether the database + * can find contacts that can be merged + * @tc.desc A: xiaowuwwl 123456, B: xiaowuwwl 123456 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Query_test_2500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Query_test_2500 query is starting! ---"); + int64_t rawOne = RawContactInsert("xiaowuwwl"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "xiaowuwwl", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456", ""); + HILOG_INFO("merge_Query_test_2500 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("xiaowuww"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "xiaowuwwl", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "123456", ""); + HILOG_INFO("merge_Query_test_2500 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.BeginWrap(); + predicates.EqualTo("id", std::to_string(rawOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(rawTwo)); + predicates.EndWrap(); + predicates.And(); + predicates.EqualTo("merge_mode", "2"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector rawVector = GetMergeRawContactId(resultSet); + EXPECT_EQ(rawOne, rawVector[0]); + EXPECT_EQ(rawTwo, rawVector[1]); + DeleteRawContact(); +} + +/* + * @tc.number merge_Query_test_2600 + * @tc.name Insert contacts with different names and phone numbers, and check whether the + * database can find the contacts that can be merged + * @tc.desc A: cxiaowuwwl 123456565454, B: nxiaowuwwl 1234564488 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Query_test_2600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Query_test_2600 query is starting! ---"); + int64_t rawOne = RawContactInsert("cxiaowuwwl"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "cxiaowuwwl", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456565454", ""); + HILOG_INFO("merge_Query_test_2600 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("nxiaowuww"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "nxiaowuwwl", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "1234564488", ""); + HILOG_INFO("merge_Query_test_2600 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriQueryMergeList(ContactsUri::MERGE_LIST); + std::vector columns; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::shared_ptr resultSet = + contactsDataAbility.Query(uriQueryMergeList, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + DeleteRawContact(); +} + +/* + * @tc.number merge_Update_test_2700 + * @tc.name Insert two contacts with the same name. Contacts A and B have two different mobile + * phone numbers, and check whether the database can be merged + * @tc.desc A: jack12345 123456565454 1234565654546 , B: jack12345 1234564488 12345644888 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(MergeContactTest, merge_Update_test_2700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- merge_Update_test_2700 query is starting! ---"); + int64_t rawOne = RawContactInsert("jack12345"); + EXPECT_GT(rawOne, 0); + int64_t dataIdOne = ContactDataInsert(rawOne, "name", "jack12345", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "123456565454", ""); + dataIdOne = ContactDataInsert(rawOne, "phone", "1234565654546", ""); + HILOG_INFO("merge_Update_test_2700 dataIdOne = %{public}lld", dataIdOne); + int64_t rawTwo = RawContactInsert("jack12345"); + EXPECT_GT(rawTwo, 0); + int64_t dataIdTwo = ContactDataInsert(rawTwo, "name", "jack12345", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "1234564488", ""); + dataIdTwo = ContactDataInsert(rawTwo, "phone", "12345644888", ""); + HILOG_INFO("merge_Update_test_2700 dataIdTwo = %{public}lld", dataIdTwo); + int time = Time::SLEEP_TIME_MERGE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + OHOS::Uri uriManualMerge(ContactsUri::MANUAL_MERGE); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::vector ids; + ids.push_back(std::to_string(rawOne)); + ids.push_back(std::to_string(rawTwo)); + predicates.In("raw_contact_id", ids); + int ret = contactsDataAbility.Update(uriManualMerge, value, predicates); + EXPECT_EQ(ret, 0); + std::vector resultIdVector; + resultIdVector.push_back(rawOne); + resultIdVector.push_back(rawTwo); + CheckMergeResultId(resultIdVector, true); + DeleteRawContact(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/performance_test.cpp b/test/unittest/src/performance_test.cpp new file mode 100644 index 0000000..d35e355 --- /dev/null +++ b/test/unittest/src/performance_test.cpp @@ -0,0 +1,580 @@ +/* + * Copyright (c) 2021 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 "performance_test.h" + +#include + +#include "test_common.h" + +namespace Contacts { +namespace Test { +PerformanceTest::PerformanceTest() +{ +} + +PerformanceTest::~PerformanceTest() +{ +} + +long long PerformanceTest::GetCurrentTime() +{ + int subtle = 1000000; + struct timeval time; + gettimeofday(&time, nullptr); + return (time.tv_sec * subtle + time.tv_usec); +} + +int PerformanceTest::CalcTime(long long startTime, long long endTime) +{ + return (int)(endTime - startTime); +} + +void PerformanceTest::DeleteContact() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + predicates.Clear(); + int count = 0; + int deleteCount = 9999; + std::vector columns; + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + while (count < deleteCount) { + int time = Time::SLEEP_TIME_MERGE_DELETE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContactComplete, columns, predicates); + resultSet->GetRowCount(count); + resultSet->Close(); + } + int time = Time::SLEEP_TIME_MERGE_DELETE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number raw_contact_insert_performance_test_900 + * @tc.name raw_contact performance testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, raw_contact_insert_performance_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_insert_performance_test_900 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::string name("xiaoyan"); + name.append(std::to_string(i + 1)); + rawContactValues.PutString("display_name", name); + rawContactValues.PutString("company", "company"); + rawContactValues.PutString("position", "position"); + values.push_back(rawContactValues); + } + HILOG_INFO("raw_contact_insert_performance_test_900 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int batchInsertCode = contactsDataAbility.BatchInsert(uriRawContact, values); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("raw_contact_insert_performance_test_900 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_RAW_CONTACT_INSERT); + HILOG_INFO("raw_contact_insert_performance_test_900 finish! "); + HILOG_INFO("raw_contact_insert_performance_test_900 : batchInsertCode = %{public}d", batchInsertCode); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number raw_contact_update_performance_test_1000 + * @tc.name raw_contact performance testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, raw_contact_update_performance_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_update_performance_test_1000 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + HILOG_INFO("raw_contact_update_performance_test_1000 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int updateCode = contactsDataAbility.Update(uriRawContact, updateValues, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("raw_contact_update_performance_test_1000 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_RAW_CONTACT_UPDATE); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number raw_contact_query_performance_test_1100 + * @tc.name raw_contact performance testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, raw_contact_query_performance_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_query_performance_test_1100 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + HILOG_INFO("raw_contact_query_performance_test_1100 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + resultSet->Close(); + HILOG_INFO("raw_contact_query_performance_test_1100 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_RAW_CONTACT_QUERY); +} + +/* + * @tc.number raw_contact_delete_performance_test_1200 + * @tc.name raw_contact performance testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, raw_contact_delete_performance_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_delete_performance_test_1200 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + HILOG_INFO("raw_contact_delete_performance_test_1200 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int deleteCode = contactsDataAbility.Delete(uriRawContact, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("raw_contact_delete_performance_test_1200 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_RAW_CONTACT_DELETED); + HILOG_INFO("raw_contact_delete_performance_test_1200 : deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number contact_data_insert_performance_test_1300 + * @tc.name contact_data performance testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, contact_data_insert_performance_test_1300, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::string rawName("xiaoyan"); + rawContactValues.PutString("display_name", rawName); + rawContactValues.PutString("company", "company"); + rawContactValues.PutString("position", "position"); + int rawContactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + HILOG_INFO("--- contact_data_insert_performance_test_1300 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket contactDataValues; + std::string name("xiaoyan"); + name.append(std::to_string(i + 1)); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", "name"); + contactDataValues.PutString("detail_info", name); + values.push_back(contactDataValues); + } + HILOG_INFO("contact_data_insert_performance_test_1300 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int batchInsertCode = contactsDataAbility.BatchInsert(uriContactData, values); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("contact_data_insert_performance_test_1300 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CONTACT_DATA_INSERT); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number contact_data_update_performance_test_1400 + * @tc.name contact_data performance testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, contact_data_update_performance_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_update_performance_test_1400 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("syn_1", "test"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int updateCode = contactsDataAbility.Update(uriContactData, updateValues, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("contact_data_update_performance_test_1400 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CONTACT_DATA_UPDATE); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number contact_data_query_performance_test_1500 + * @tc.name contact_data performance testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, contact_data_query_performance_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_query_performance_test_1500 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriContactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + resultSet->Close(); + HILOG_INFO("contact_data_query_performance_test_1500 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CONTACT_DATA_QUERY); +} + +/* + * @tc.number contact_data_delete_performance_test_1600 + * @tc.name contact_data performance testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, contact_data_delete_performance_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_delete_performance_test_1600 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int deleteCode = contactsDataAbility.Delete(uriContactData, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("contact_data_delete_performance_test_1600 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CONTACT_DATA_DELETED); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number calllog_insert_performance_test_100 + * @tc.name calllog calllog performance testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, calllog_insert_performance_test_100, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicatesOne; + predicatesOne.GreaterThan("id", "0"); + HILOG_INFO("calllog_insert_performance_test_100 deleted start! "); + calllogAbility.Delete(uriCalllog, predicatesOne); + HILOG_INFO("--- calllog_insert_performance_test_100 is starting! ---"); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket calllogValues; + calllogValues.PutString("phone_number", std::to_string(i + 1)); + values.push_back(calllogValues); + } + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int batchInsertCode = calllogAbility.BatchInsert(uriCalllog, values); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("calllog_insert_performance_test_100 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CALL_LOG_INSERT); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number calllog_update_performance_test_200 + * @tc.name calllog calllog performance testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, calllog_update_performance_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_update_performance_test_200 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("answer_state", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int updateCode = calllogAbility.Update(uriCalllog, updateValues, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + ASSERT_LE(elaps, TIME_USEC_CALL_LOG_UPDATE); + HILOG_INFO("calllog_update_performance_test_200 : time is %{public}d", elaps); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number calllog_query_performance_test_300 + * @tc.name calllog calllog performance testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, calllog_query_performance_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_query_performance_test_300 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllog, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + resultSet->Close(); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("calllog_query_performance_test_300 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CALL_LOG_QUERY); +} + +/* + * @tc.number calllog_delete_performance_test_400 + * @tc.name calllog calllog performance testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, calllog_delete_performance_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_delete_performance_test_400 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int deleteCode = calllogAbility.Delete(uriCalllog, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("calllog_delete_performance_test_400 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_CALL_LOG_DELETED); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number voicemail_insert_performance_test_500 + * @tc.name voicemail performance testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, voicemail_insert_performance_test_500, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicatesOne; + predicatesOne.GreaterThan("id", "0"); + HILOG_INFO("voicemail_insert_performance_test_500 deleted start! "); + voicemailAbility.Delete(uriVoiceMail, predicatesOne); + HILOG_INFO("--- voicemail_insert_performance_test_500 is starting! ---"); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", std::to_string(i + 1)); + values.push_back(voicemailValues); + } + HILOG_INFO("voicemail_insert_performance_test_500 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int batchInsertCode = voicemailAbility.BatchInsert(uriVoiceMail, values); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("voicemail_insert_performance_test_500 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_VOICEMAIL_INSERT); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number voicemail_update_performance_test_600 + * @tc.name voicemail performance testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, voicemail_update_performance_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_update_performance_test_600 is starting! ---"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("origin_type", "origin"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int updateCode = voicemailAbility.Update(uriVoiceMail, updateValues, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("voicemail_update_performance_test_600 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_VOICEMAIL_UPDATE); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number voicemail_query_performance_test_700 + * @tc.name voicemail performance testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, voicemail_query_performance_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_query_performance_test_700 is starting! ---"); + std::string tag("voicemail_query_performance_test_700"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + HILOG_INFO("voicemail_query_performance_test_700 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + std::shared_ptr resultSet = + voicemailAbility.Query(uriVoiceMail, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + resultSet->Close(); + HILOG_INFO("voicemail_query_performance_test_700 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_VOICEMAIL_QUERY); +} + +/* + * @tc.number voicemail_delete_performance_test_800 + * @tc.name voicemail performance testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(PerformanceTest, voicemail_delete_performance_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_delete_performance_test_800 is starting! ---"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + HILOG_INFO("voicemail_delete_performance_test_800 start! "); + long long startTime, endTime; + int elaps; + startTime = GetCurrentTime(); + int deleteCode = voicemailAbility.Delete(uriVoiceMail, predicates); + endTime = GetCurrentTime(); + elaps = CalcTime(startTime, endTime); + HILOG_INFO("voicemail_delete_performance_test_800 : time is %{public}d", elaps); + ASSERT_LE(elaps, TIME_USEC_VOICEMAIL_DELETED); + EXPECT_EQ(deleteCode, 0); +} + +HWTEST_F(PerformanceTest, PerformanceTestDeleted, testing::ext::TestSize.Level1) +{ + DeleteContact(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/recovery_test.cpp b/test/unittest/src/recovery_test.cpp new file mode 100644 index 0000000..542e091 --- /dev/null +++ b/test/unittest/src/recovery_test.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2021 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 "recovery_test.h" + +#include "database_disaster_recovery.h" +#include "test_common.h" + +namespace Contacts { +namespace Test { +void RecoveryTest::ClearData() +{ + OHOS::AppExecFwk::ContactsDataAbility contactsDataAbility; + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + int code1 = contactsDataAbility.Delete(uriRawContact, predicates); + HILOG_INFO("RecoveryTest ClearData code1 is %{public}d", code1); + int time = 3000; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + int code = contactsDataAbility.Delete(uriRawContactComplete, predicates); + HILOG_INFO("RecoveryTest ClearData code is %{public}d", code); +} + +int64_t RecoveryTest::RawContactInsert(std::string displayName) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + rawContactValues.PutString("display_name", displayName); + int64_t code = contactsDataAbility.Insert(uriRawContact, rawContactValues); + rawContactValues.Clear(); + return code; +} + +/* + * @tc.number recovery_test_100 + * @tc.name Backup database + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(RecoveryTest, recovery_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- recovery_test_100 is starting! ---"); + std::shared_ptr instance = + OHOS::Contacts::DataBaseDisasterRecovery::GetInstance(); + std::shared_ptr contactDatabase = OHOS::Contacts::ContactsDataBase::GetInstance(); + int result = instance->SQLliteCheckDb(); + HILOG_INFO("--- recovery_test_100 SQLliteCheckDb ret ! --- %{public}d", result); + if (result == 0) { + instance->BackDatabase(); + } + std::string backupPath = instance->GetBackUpDatabase(contactDatabase->contactStore_); + HILOG_INFO("--- recovery_test_100 is end! --- %{public}s ", backupPath.c_str()); + ClearData(); +} + +/* + * @tc.number recovery_test_200 + * @tc.name Backup database after insert two person, then recover + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(RecoveryTest, recovery_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- recovery_test_200 is starting! ---"); + RawContactInsert("liming"); + RawContactInsert("xiaolilili"); + // backup + OHOS::Uri uriRawContactBackUp(ContactsUri::BACKUP); + OHOS::NativeRdb::ValuesBucket value; + OHOS::NativeRdb::DataAbilityPredicates predicates; + int retCode = contactsDataAbility.Update(uriRawContactBackUp, value, predicates); + EXPECT_EQ(0, retCode); + + RawContactInsert("xiaobaibaibai"); + RawContactInsert("xiaolitiantian"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::vector columns; + predicates.EqualTo("is_deleted", "0"); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + resultSet->Close(); + EXPECT_EQ(4, rowCount); + + OHOS::Uri uriRawContactRecover(ContactsUri::RECOVER); + int retCodeRecover = contactsDataAbility.Update(uriRawContactRecover, value, predicates); + EXPECT_EQ(0, retCodeRecover); + + std::shared_ptr resultSetRecover = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCountRecover = 0; + resultSetRecover->GetRowCount(rowCountRecover); + resultSetRecover->Close(); + EXPECT_EQ(2, rowCountRecover); + ClearData(); +} +} // namespace Test +} // namespace Contacts diff --git a/test/unittest/src/stability_test.cpp b/test/unittest/src/stability_test.cpp new file mode 100644 index 0000000..13d8f40 --- /dev/null +++ b/test/unittest/src/stability_test.cpp @@ -0,0 +1,444 @@ +/* + * Copyright (c) 2021 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 "stability_test.h" + +#include + +#include "test_common.h" + +namespace Contacts { +namespace Test { +StabilityTest::StabilityTest() +{ +} + +StabilityTest::~StabilityTest() +{ +} + +void StabilityTest::DeleteContact() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + predicates.Clear(); + int count = 0; + int deleteCount = 9999; + std::vector columns; + OHOS::Uri uriRawContactComplete(ContactsUri::DELETED_RAW_CONTACT); + while (count < deleteCount) { + int time = Time::SLEEP_TIME_MERGE_DELETE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContactComplete, columns, predicates); + resultSet->GetRowCount(count); + resultSet->Close(); + } + int time = Time::SLEEP_TIME_MERGE_DELETE; + std::chrono::milliseconds dura(time); + std::this_thread::sleep_for(dura); + predicates.Clear(); + predicates.NotEqualTo("id", "0"); + contactsDataAbility.Delete(uriRawContactComplete, predicates); +} + +/* + * @tc.number raw_contact_insert_performance_test_900 + * @tc.name raw_contact stability testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, raw_contact_insert_performance_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_insert_performance_test_900 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::string name("小严"); + name.append(std::to_string(i + 1)); + rawContactValues.PutString("display_name", name); + rawContactValues.PutString("company", "company"); + rawContactValues.PutString("position", "position"); + values.push_back(rawContactValues); + } + int batchInsertCode = contactsDataAbility.BatchInsert(uriRawContact, values); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number raw_contact_update_performance_test_1000 + * @tc.name raw_contact stability testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, raw_contact_update_performance_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_update_performance_test_1000 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("favorite", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + int updateCode = contactsDataAbility.Update(uriRawContact, updateValues, predicates); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number raw_contact_query_performance_test_1100 + * @tc.name raw_contact stability testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, raw_contact_query_performance_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_query_performance_test_1100 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + std::vector columns; + columns.push_back("id"); + columns.push_back("display_name"); + columns.push_back("company"); + columns.push_back("position"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriRawContact, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + resultSet->Close(); +} + +/* + * @tc.number raw_contact_delete_performance_test_1200 + * @tc.name raw_contact stability testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, raw_contact_delete_performance_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- raw_contact_delete_performance_test_1200 is starting! ---"); + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + int deleteCode = contactsDataAbility.Delete(uriRawContact, predicates); + HILOG_INFO("raw_contact_delete_performance_test_1200 : deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number contact_data_insert_performance_test_1300 + * @tc.name contact_data stability testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, contact_data_insert_performance_test_1300, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriRawContact(ContactsUri::RAW_CONTACT); + OHOS::NativeRdb::ValuesBucket rawContactValues; + std::string rawName("xiaoyan"); + rawContactValues.PutString("display_name", rawName); + rawContactValues.PutString("company", "company"); + rawContactValues.PutString("position", "position"); + int rawContactId = contactsDataAbility.Insert(uriRawContact, rawContactValues); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.NotEqualTo("id", "0"); + predicates.And(); + predicates.EqualTo("is_deleted", "0"); + contactsDataAbility.Delete(uriRawContact, predicates); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket contactDataValues; + std::string name("xiaoyan"); + name.append(std::to_string(i + 1)); + contactDataValues.PutInt("raw_contact_id", rawContactId); + contactDataValues.PutString("content_type", "name"); + contactDataValues.PutString("detail_info", name); + values.push_back(contactDataValues); + } + int batchInsertCode = contactsDataAbility.BatchInsert(uriContactData, values); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number contact_data_update_performance_test_1400 + * @tc.name contact_data stability testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, contact_data_update_performance_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_update_performance_test_1400 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("syn_1", "test"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int updateCode = contactsDataAbility.Update(uriContactData, updateValues, predicates); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number contact_data_query_performance_test_1500 + * @tc.name contact_data stability testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, contact_data_query_performance_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_query_performance_test_1500 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + std::vector columns; + columns.push_back("raw_contact_id"); + columns.push_back("detail_info"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + contactsDataAbility.Query(uriContactData, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + resultSet->Close(); +} + +/* + * @tc.number contact_data_delete_performance_test_1600 + * @tc.name contact_data stability testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, contact_data_delete_performance_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- contact_data_delete_performance_test_1600 is starting! ---"); + OHOS::Uri uriContactData(ContactsUri::CONTACT_DATA); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = contactsDataAbility.Delete(uriContactData, predicates); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number calllog_insert_performance_test_100 + * @tc.name calllog calllog stability testing add 10000 + * @tc.desc add 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, calllog_insert_performance_test_100, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicatesOne; + predicatesOne.GreaterThan("id", "0"); + HILOG_INFO("calllog_insert_performance_test_100 deleted start! "); + calllogAbility.Delete(uriCalllog, predicatesOne); + HILOG_INFO("--- calllog_insert_performance_test_100 is starting! ---"); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket calllogValues; + calllogValues.PutString("phone_number", std::to_string(i + 1)); + values.push_back(calllogValues); + } + int batchInsertCode = calllogAbility.BatchInsert(uriCalllog, values); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number calllog_update_performance_test_200 + * @tc.name calllog calllog stability testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, calllog_update_performance_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_update_performance_test_200 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("answer_state", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int updateCode = calllogAbility.Update(uriCalllog, updateValues, predicates); + HILOG_INFO("calllog_update_performance_test_200 : updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number calllog_query_performance_test_300 + * @tc.name calllog calllog stability testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, calllog_query_performance_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_query_performance_test_300 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + calllogAbility.Query(uriCalllog, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + resultSet->Close(); +} + +/* + * @tc.number calllog_delete_performance_test_400 + * @tc.name calllog calllog stability testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, calllog_delete_performance_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- calllog_delete_performance_test_400 is starting! ---"); + OHOS::Uri uriCalllog(CallLogUri::CALL_LOG); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = calllogAbility.Delete(uriCalllog, predicates); + EXPECT_EQ(deleteCode, 0); +} + +/* + * @tc.number voicemail_insert_performance_test_500 + * @tc.name voicemail stability testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, voicemail_insert_performance_test_500, testing::ext::TestSize.Level1) +{ + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicatesOne; + predicatesOne.GreaterThan("id", "0"); + HILOG_INFO("voicemail_insert_performance_test_500 deleted start! "); + voicemailAbility.Delete(uriVoiceMail, predicatesOne); + HILOG_INFO("--- voicemail_insert_performance_test_500 is starting! ---"); + std::vector values; + for (int i = 0; i < 10000; i++) { + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", std::to_string(i + 1)); + values.push_back(voicemailValues); + } + int batchInsertCode = voicemailAbility.BatchInsert(uriVoiceMail, values); + EXPECT_EQ(batchInsertCode, 0); +} + +/* + * @tc.number voicemail_update_performance_test_600 + * @tc.name voicemail stability testing update 10000 + * @tc.desc update 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, voicemail_update_performance_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_update_performance_test_600 is starting! ---"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("origin_type", "origin"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int updateCode = voicemailAbility.Update(uriVoiceMail, updateValues, predicates); + EXPECT_EQ(updateCode, 0); +} + +/* + * @tc.number voicemail_query_performance_test_700 + * @tc.name voicemail stability testing query 10000 + * @tc.desc query 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, voicemail_query_performance_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_query_performance_test_700 is starting! ---"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + voicemailAbility.Query(uriVoiceMail, columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_GT(rowCount, 9999); + resultSet->Close(); +} + +/* + * @tc.number voicemail_delete_performance_test_800 + * @tc.name voicemail stability testing delete 10000 + * @tc.desc delete 10000 + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(StabilityTest, voicemail_delete_performance_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_delete_performance_test_800 is starting! ---"); + OHOS::Uri uriVoiceMail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = voicemailAbility.Delete(uriVoiceMail, predicates); + EXPECT_EQ(deleteCode, 0); +} + +HWTEST_F(StabilityTest, PerformanceTestDeleted, testing::ext::TestSize.Level1) +{ + DeleteContact(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file diff --git a/test/unittest/src/voicemailability_test.cpp b/test/unittest/src/voicemailability_test.cpp new file mode 100644 index 0000000..42304a5 --- /dev/null +++ b/test/unittest/src/voicemailability_test.cpp @@ -0,0 +1,1671 @@ +/* + * Copyright (c) 2021 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 "voicemailability_test.h" + +#include "data_ability_operation_builder.h" + +namespace Contacts { +namespace Test { +VoicemailAbilityTest::VoicemailAbilityTest() +{ +} + +VoicemailAbilityTest::~VoicemailAbilityTest() +{ +} + +int64_t VoicemailAbilityTest::VoicemailStatusInsert(std::string phoneNumber, int status) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", phoneNumber); + voicemailValues.PutInt("voice_status", status); + int64_t code = voicemailAbility.Insert(uriVoicemail, voicemailValues); + return code; +} + +int VoicemailAbilityTest::VoicemailUpdate( + OHOS::NativeRdb::ValuesBucket updateValues, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + int code = voicemailAbility.Update(uriVoicemail, updateValues, predicates); + return code; +} + +int VoicemailAbilityTest::VoicemailDelete(OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + int code = voicemailAbility.Delete(uriVoicemail, predicates); + return code; +} + +std::shared_ptr VoicemailAbilityTest::VoicemailQuery( + std::vector columns, OHOS::NativeRdb::DataAbilityPredicates predicates) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + std::shared_ptr resultSet = + voicemailAbility.Query(uriVoicemail, columns, predicates); + return resultSet; +} + +void VoicemailAbilityTest::CheckResultSetBatch(OHOS::NativeRdb::DataAbilityPredicates predicates, + std::vector &columns, OHOS::NativeRdb::ValuesBucket values, std::string testName) +{ + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, resultSet, testName); +} + +int VoicemailAbilityTest::VoicemailInsertValues(OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + int64_t code = voicemailAbility.Insert(uriVoicemail, values); + int result = code; + return result; +} + +int64_t VoicemailAbilityTest::VoicemailInsertValue(std::string displayName, OHOS::NativeRdb::ValuesBucket &values) +{ + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + values.PutString("display_name", displayName); + int64_t code = voicemailAbility.Insert(uriVoicemail, values); + return code; +} + +OHOS::NativeRdb::ValuesBucket VoicemailAbilityTest::GetVoiceMailValues( + int columnsStart, int columnsEnd, std::vector &columns) +{ + std::string voiceMailTestStringValue = std::to_string(ContactsRand()); + OHOS::NativeRdb::ValuesBucket valuesBucket; + valuesBucket.PutString("phone_number", "15412121" + voiceMailTestStringValue); + valuesBucket.PutString("quicksearch_key", "dfquicksearch_key" + voiceMailTestStringValue); + valuesBucket.PutString("display_name", "dfName" + voiceMailTestStringValue); + valuesBucket.PutString("voicemail_uri", "dfUri::voicemail_uri" + voiceMailTestStringValue); + valuesBucket.PutInt("voicemail_type", ContactsRand()); + valuesBucket.PutInt("voice_file_size", ContactsRand()); + valuesBucket.PutInt("voice_duration", ContactsRand()); + valuesBucket.PutInt("voice_status", ContactsRand()); + valuesBucket.PutString("origin_type", "origin_type" + voiceMailTestStringValue); + valuesBucket.PutInt("create_time", ContactsRand()); + std::vector columnsTemp; + GetVoiceMailValuesColumn(columnsTemp); + int allSize = columnsTemp.size(); + for (int i = 0; i < allSize; i++) { + if (i >= columnsStart && i < columnsEnd) { + columns.push_back(columnsTemp[i]); + } else { + valuesBucket.Delete(columnsTemp[i]); + } + } + return valuesBucket; +} + +void VoicemailAbilityTest::GetVoiceMailValuesColumn(std::vector &columns) +{ + columns.push_back("phone_number"); + columns.push_back("quicksearch_key"); + columns.push_back("display_name"); + columns.push_back("voicemail_uri"); + columns.push_back("voicemail_type"); + columns.push_back("voice_file_size"); + columns.push_back("voice_duration"); + columns.push_back("voice_status"); + columns.push_back("origin_type"); + columns.push_back("create_time"); +} + +void VoicemailAbilityTest::ClearVoicemail() +{ + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = VoicemailDelete(predicates); + EXPECT_EQ(0, deleteCode); +} + +/* + * @tc.number voicemail_Insert_test_100 + * @tc.name Add a voice mailbox with status 1 and verify that the insertion was successful + * @tc.desc Added ability to voice mailbox status + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Insert_test_100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Insert_test_100 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "166320"); + values.PutInt("voice_status", 1); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Insert_test_100 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Insert_test_100"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Insert_test_200 + * @tc.name Add a single piece of voicemail data and verify whether the insertion is successful + * @tc.desc New capabilities for voicemail data + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Insert_test_200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Insert_test_200 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "154236"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Insert_test_200 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("id"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Insert_test_200"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Insert_test_300 + * @tc.name Add a full field data to voicemail and verify that the insertion was successful + * @tc.desc Added ability to call record + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Insert_test_300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----voicemail_Insert_test_300 is starting!-----"); + std::vector columns; + GetVoiceMailValuesColumn(columns); + int columnsSize = 10; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetVoiceMailValues(0, columnsSize, columns); + int rawId = VoicemailInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + + CheckResultSet(valuesBucket, resultSet, "voicemail_Insert_test_300"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawId)); + // test end delete data + int deleteCode = VoicemailDelete(predicates); + EXPECT_EQ(deleteCode, 0); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_400 + * @tc.name Delete the voicemail status and verify that the deletion was successful + * @tc.desc Voicemail status deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "4396"); + values.PutInt("voice_status", 1); + int voicemailId = VoicemailInsertValues(values); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("voice_status", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("voice_status", "0"); + predicates.And(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(updateValues, result, "voicemail_Update_test_400"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Delete_test_500 + * @tc.name Delete a single voice mailbox data and verify whether the deletion is successful + * @tc.desc Voicemail data deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Delete_test_500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Delete_test_500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "154236"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Delete_test_500 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int deleteCode = VoicemailDelete(predicates); + HILOG_INFO("voicemail_Delete_test_500: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("id"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Delete_test_600 + * @tc.name Insert 3 pieces of voicemail data first, then delete 2 of them, and verify whether the deletion is + * successful + * @tc.desc Voicemail data deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Delete_test_600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Delete_test_600 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesOne; + valuesOne.PutString("phone_number", "1000111"); + int voicemailIdOne = VoicemailInsertValues(valuesOne); + HILOG_INFO("voicemail_Delete_test_600 : voicemailIdOne = %{public}d", voicemailIdOne); + EXPECT_GT(voicemailIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesTwo; + valuesTwo.PutString("phone_number", "1000111"); + int voicemailIdTwo = VoicemailInsertValues(valuesTwo); + HILOG_INFO("voicemail_Delete_test_600 : voicemailIdTwo = %{public}d", voicemailIdTwo); + EXPECT_GT(voicemailIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesThree; + valuesThree.PutString("phone_number", "1000111"); + int voicemailIdThree = VoicemailInsertValues(valuesThree); + HILOG_INFO("voicemail_Delete_test_600 : voicemailIdThree = %{public}d", voicemailIdThree); + EXPECT_GT(voicemailIdThree, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdThree)); + int deleteCode = VoicemailDelete(predicates); + HILOG_INFO("voicemail_Delete_test_600: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, 0); + + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("id"); + valuesTwo.PutInt("id", voicemailIdTwo); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdTwo)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdThree)); + predicates.OrderByAsc("id"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(valuesTwo, result, "voicemail_Delete_test_600"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Delete_test_700 + * @tc.name Delete all fields of single voice mailbox data, and verify whether the deletion is successful + * @tc.desc Call log deletion capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Delete_test_700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----voicemail_Delete_test_700 is starting!-----"); + // insert + std::vector columns; + GetVoiceMailValuesColumn(columns); + int columnsSize = 10; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetVoiceMailValues(0, columnsSize, columns); + int rawId = VoicemailInsertValues(valuesBucket); + EXPECT_GT(rawId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + // test end delete data + int deleteCode = VoicemailDelete(predicates); + EXPECT_EQ(deleteCode, 0); + + std::shared_ptr resultSetDeleteQuery = VoicemailQuery(columns, predicates); + // resultSet count 0 + int rowCount = 0; + resultSetDeleteQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSetDeleteQuery->Close(); + HILOG_INFO("-----voicemail_Delete_test_700 is edn!-----"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Delete_test_800 + * @tc.name Delete voice mailbox data in batch and verify whether the deletion is successful + * @tc.desc delete ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Delete_test_800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Delete_test_800 is starting!---"); + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", "154236"); + int voicemailIdOne = VoicemailInsertValues(voicemailValues); + EXPECT_GT(voicemailIdOne, 0); + voicemailValues.PutString("phone_number", "154236"); + int voicemailIdTwo = VoicemailInsertValues(voicemailValues); + EXPECT_GT(voicemailIdTwo, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(VoicemailUri::VOICEMAIL); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewDeleteBuilder(uri) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + voicemailAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::vector columns; + std::shared_ptr resultSetInsertQuery = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_900 + * @tc.name Update the voice mailbox status and verify whether the update is successful (voice_status changes from 0 + * to 1) + * @tc.desc Voicemail status update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_900 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "166323340"); + values.PutInt("voice_status", 0); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Update_test_900 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("voice_status", 1); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + updateValues.PutString("phone_number", "166323340"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(updateValues, result, "voicemail_Update_test_900"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_1000 + * @tc.name FUpdate single voicemail data and verify whether the update is successful + * @tc.desc Voicemail data update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_1000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_1000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "10086"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Update_test_1000 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", std::string("18522547896")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + HILOG_INFO("voicemail_Update_test_1000: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, 0); + + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(updateValues, result, "voicemail_Update_test_1000"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_1100 + * @tc.name Insert 3 pieces of voicemail data, modify 2 of them, and verify whether the modification is successful + * @tc.desc Voicemail data update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_1100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_1100 is staring! ---"); + OHOS::NativeRdb::ValuesBucket valuesOne; + valuesOne.PutString("phone_number", "177888855"); + int voicemailIdOne = VoicemailInsertValues(valuesOne); + EXPECT_GT(voicemailIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesTwo; + valuesTwo.PutString("phone_number", "177888856"); + int voicemailIdTwo = VoicemailInsertValues(valuesTwo); + EXPECT_GT(voicemailIdTwo, 0); + + OHOS::NativeRdb::ValuesBucket valuesThree; + valuesThree.PutString("phone_number", "177888856"); + int voicemailIdThree = VoicemailInsertValues(valuesThree); + EXPECT_GT(voicemailIdThree, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", std::string("20014455")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + int updateCode = VoicemailUpdate(updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + OHOS::NativeRdb::ValuesBucket updateValuesTwo; + updateValuesTwo.PutString("phone_number", std::string("1993025")); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailIdTwo)); + updateCode = VoicemailUpdate(updateValuesTwo, predicates); + EXPECT_EQ(updateCode, 0); + + std::vector columns; + columns.push_back("phone_number"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdTwo)); + predicates.OrderByAsc("id"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector valuesVector; + valuesVector.push_back(updateValues); + valuesVector.push_back(updateValuesTwo); + CheckResultSetList(valuesVector, result, "voicemail_Update_test_1100"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_1200 + * @tc.name Update the full field data of voice mailbox and verify whether the update is successful + * @tc.desc Support all call log update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_1200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----voicemail_Update_test_1200 is starting!-----"); + std::vector columns; + GetVoiceMailValuesColumn(columns); + int columnsSize = 10; + OHOS::NativeRdb::ValuesBucket valuesBucket = GetVoiceMailValues(0, columnsSize, columns); + int rawId = VoicemailInsertValues(valuesBucket); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(rawId)); + OHOS::NativeRdb::ValuesBucket upDateValuesBucket = GetVoiceMailValues(0, columnsSize, columns); + int upDateCode = VoicemailUpdate(upDateValuesBucket, predicates); + EXPECT_EQ(upDateCode, 0); + + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + // resultSet count 1 + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + + CheckResultSet(upDateValuesBucket, resultSet, "voicemail_Update_test_1200"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(rawId)); + // test end delete data + int deleteCode = VoicemailDelete(predicates); + EXPECT_EQ(deleteCode, 0); + HILOG_INFO("-----voicemail_Update_test_1200 is edn!-----"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_1300 + * @tc.name Batch update voice mailbox data and verify whether the update is successful + * @tc.desc update ability to call records in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_1300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_1300 is starting!---"); + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", "154236"); + int voicemailIdOne = VoicemailInsertValues(voicemailValues); + EXPECT_GT(voicemailIdOne, 0); + voicemailValues.PutString("phone_number", "154236"); + int voicemailIdTwo = VoicemailInsertValues(voicemailValues); + EXPECT_GT(voicemailIdTwo, 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdTwo)); + std::shared_ptr values = + std::make_shared(voicemailValues); + std::shared_ptr executePredicates = + std::make_shared(predicates); + std::shared_ptr uri = std::make_shared(VoicemailUri::VOICEMAIL); + std::shared_ptr operation = + OHOS::AppExecFwk::DataAbilityOperation::NewUpdateBuilder(uri) + ->WithValuesBucket(values) + ->WithPredicatesBackReference(0, 0) + ->WithPredicates(executePredicates) + ->WithInterruptionAllowed(true) + ->Build(); + std::vector> executeBatchOperations; + executeBatchOperations.push_back(operation); + InitAbility(); + std::vector> dataAbilityResult = + voicemailAbility.ExecuteBatch(executeBatchOperations); + EXPECT_EQ(0, dataAbilityResult[0]->GetCount()); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr resultSetInsertQuery = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSetInsertQuery->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(voicemailValues); + listValue.push_back(voicemailValues); + CheckResultSetList(listValue, resultSetInsertQuery, "voicemail_Update_test_1300"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Query_test_1400 + * @tc.name Query the voice mailbox in status 1 and return the query results + * @tc.desc Voicemail status query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Query_test_1400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Query_test_1400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "882203110"); + values.PutInt("voice_status", 1); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Query_test_1400 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + values.PutInt("id", voicemailId); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + columns.push_back("voice_status"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("voice_status", "1"); + predicates.And(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Query_test_1400"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Query_test_1500 + * @tc.name Insert a single voice mailbox and query the inserted voice mailbox data according to the returned ID + * @tc.desc Voicemail data query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Query_test_1500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Query_test_1500 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "10001"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Query_test_1500 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Query_test_1500"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Query_test_1600 + * @tc.name Insert multiple voice mailboxes, and query the inserted voice mailbox data according to the returned ID + * @tc.desc Voicemail data query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Query_test_1600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Query_test_1600 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "10001"); + int voicemailIdOne = VoicemailInsertValues(values); + HILOG_INFO("voicemail_Query_test_1600 : voicemailIdOne = %{public}d", voicemailIdOne); + EXPECT_GT(voicemailIdOne, 0); + + OHOS::NativeRdb::ValuesBucket valuesTwo; + valuesTwo.PutString("phone_number", "891320"); + int voicemailIdTwo = VoicemailInsertValues(valuesTwo); + HILOG_INFO("voicemail_Query_test_1600 : voicemailIdTwo = %{public}d", voicemailIdTwo); + EXPECT_GT(voicemailIdTwo, 0); + + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailIdOne)); + predicates.Or(); + predicates.EqualTo("id", std::to_string(voicemailIdTwo)); + predicates.OrderByAsc("id"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector valuesVector; + valuesVector.push_back(values); + valuesVector.push_back(valuesTwo); + CheckResultSetList(valuesVector, result, "voicemail_Query_test_1600"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Query_test_1700 + * @tc.name Query all voice mail data and return query results + * @tc.desc Voicemail data query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Query_test_1700, testing::ext::TestSize.Level1) +{ + // query database count There are two test cases above ,the number is 4 + HILOG_INFO("--- voicemail_Query_test_1700 is staring! ---"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_BatchInsert_test_1800 + * @tc.name Add 3 voice mail messages with status and verify whether the insertion is successful + * @tc.desc Added ability to batch voicemail status + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_BatchInsert_test_1800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_BatchInsert_test_1800 is starting! ---"); + + OHOS::Uri uriData(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValuesOne; + voicemailValuesOne.PutString("phone_number", std::string("1470023")); + voicemailValuesOne.PutInt("voice_status", 1); + OHOS::NativeRdb::ValuesBucket voicemailValuesTwo; + voicemailValuesTwo.PutString("phone_number", std::string("1470056")); + voicemailValuesTwo.PutInt("voice_status", 0); + OHOS::NativeRdb::ValuesBucket voicemailValuesThree; + voicemailValuesThree.PutString("phone_number", std::string("1470089")); + voicemailValuesThree.PutInt("voice_status", 0); + + std::vector listAddBluk; + listAddBluk.push_back(voicemailValuesOne); + listAddBluk.push_back(voicemailValuesTwo); + listAddBluk.push_back(voicemailValuesThree); + int batchInsertCode = voicemailAbility.BatchInsert(uriData, listAddBluk); + EXPECT_EQ(batchInsertCode, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", "1470023"); + predicates.Or(); + predicates.EqualTo("phone_number", "1470089"); + predicates.OrderByAsc("id"); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(2, rowCount); + std::vector listValue; + listValue.push_back(voicemailValuesOne); + listValue.push_back(voicemailValuesThree); + CheckResultSetList(listValue, result, "voicemail_BatchInsert_test_1800"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_BatchInsert_test_1900 + * @tc.name Add 5 voice mail data and verify whether the insertion is successful + * @tc.desc New capabilities for voice mail data in batches + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_BatchInsert_test_1900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_BatchInsert_test_1900 is staring! ---"); + OHOS::Uri uriData(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValuesOne; + voicemailValuesOne.PutString("phone_number", std::string("123478")); + voicemailValuesOne.PutString("display_name", std::string("xiaoming")); + OHOS::NativeRdb::ValuesBucket voicemailValuesTwo; + voicemailValuesTwo.PutString("phone_number", std::string("10002")); + voicemailValuesTwo.PutString("display_name", std::string("xiaozi")); + OHOS::NativeRdb::ValuesBucket voicemailValuesThree; + voicemailValuesThree.PutString("phone_number", std::string("10003")); + voicemailValuesThree.PutString("display_name", std::string("xiaozhi")); + OHOS::NativeRdb::ValuesBucket voicemailValuesFour; + voicemailValuesFour.PutString("phone_number", std::string("10004")); + voicemailValuesFour.PutString("display_name", std::string("xiaohei")); + OHOS::NativeRdb::ValuesBucket voicemailValuesFive; + voicemailValuesFive.PutString("phone_number", std::string("10005")); + voicemailValuesFive.PutString("display_name", std::string("xiaohong")); + std::vector listAddBluk; + listAddBluk.push_back(voicemailValuesOne); + listAddBluk.push_back(voicemailValuesTwo); + listAddBluk.push_back(voicemailValuesThree); + listAddBluk.push_back(voicemailValuesFour); + listAddBluk.push_back(voicemailValuesFive); + int batchInsertCode = voicemailAbility.BatchInsert(uriData, listAddBluk); + EXPECT_EQ(0, batchInsertCode); + + int size = listAddBluk.size(); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("display_name"); + for (int i = 0; i < size; i++) { + OHOS::NativeRdb::DataAbilityPredicates predicates; + std::string name; + OHOS::NativeRdb::ValueObject value; + listAddBluk[i].GetObject("display_name", value); + value.GetString(name); + predicates.EqualTo("display_name", name); + predicates.And(); + std::string phoneNumber; + OHOS::NativeRdb::ValueObject phoneNumberValue; + listAddBluk[i].GetObject("phone_number", phoneNumberValue); + phoneNumberValue.GetString(phoneNumber); + predicates.EqualTo("phone_number", phoneNumber); + CheckResultSetBatch(predicates, columns, listAddBluk[i], "voicemail_BatchInsert_test_1900"); + } + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Insert_test_2000 + * @tc.name When voice mail status is added, a non-existent field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Insert_test_2000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Insert_test_2000 is starting! ---"); + + OHOS::Uri uriVoicemail(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_numbers", "89633"); + int64_t voicemailId = voicemailAbility.Insert(uriVoicemail, voicemailValues); + HILOG_INFO("abnormal_voicemail_Insert_test_2000: voicemailId = %{public}lld", voicemailId); + EXPECT_EQ(voicemailId, -1); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", "89633"); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Insert_test_2100 + * @tc.name When adding voice mail data, a nonexistent table name is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Insert_test_2100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Insert_test_2100 is starting! ---"); + + OHOS::Uri errorUriVoicemails(VoicemailUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket voicemailValues; + voicemailValues.PutString("phone_number", "230000"); + int64_t voicemailId = voicemailAbility.Insert(errorUriVoicemails, voicemailValues); + HILOG_INFO("abnormal_voicemail_Insert_test_2100: voicemailId = %{public}lld", voicemailId); + EXPECT_EQ(voicemailId, -1); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", "230000"); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Update_test_2200 + * @tc.name When deleting voicemail status, a non-existent field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Update_test_2200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Update_test_2200 is starting! ---"); + int64_t voicemailId = VoicemailStatusInsert("123456", 1); + HILOG_INFO("abnormal_voicemail_Update_test_2200: voicemailId = %{public}lld", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("voice_status", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + HILOG_INFO("abnormal_voicemail_Update_test_2200 : updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + + predicates.Clear(); + predicates.EqualTo("phone_number", "123456"); + predicates.And(); + predicates.EqualTo("voice_status", "0"); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Delete_test_2300 + * @tc.name When deleting voicemail data, a non-existent field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Delete_test_2300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Delete_test_2300 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "10086123"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("abnormal_voicemail_Delete_test_2300 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(voicemailId)); + int deleteCode = VoicemailDelete(predicates); + HILOG_INFO("abnormal_voicemail_Delete_test_2300: deleteCode = %{public}d", deleteCode); + EXPECT_EQ(deleteCode, -1); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "abnormal_voicemail_Delete_test_2300"); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Delete_test_2400 + * @tc.name When deleting voicemail data, a nonexistent table name is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Delete_test_2400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Delete_test_2400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "166320"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("abnormal_voicemail_Delete_test_2400 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::Uri uriVoicemails(VoicemailUri::ERROR_URI); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int deleteCode = voicemailAbility.Delete(uriVoicemails, predicates); + HILOG_INFO("abnormal_voicemail_Delete_test_2400: deleteCode = %{public}d", deleteCode); + EXPECT_NE(deleteCode, 0); + + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "abnormal_voicemail_Delete_test_2400"); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Update_test_2500 + * @tc.name When updating voicemail status, a non-existent field was passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Update_test_2500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Update_test_2500 is starting! ---"); + int64_t voicemailId = VoicemailStatusInsert("123456", 1); + HILOG_INFO("abnormal_voicemail_Update_test_2500: voicemailId = %{public}lld", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("voice_status", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + HILOG_INFO("abnormal_voicemail_Update_test_2500 : updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + + predicates.Clear(); + predicates.EqualTo("phone_number", "123456"); + predicates.And(); + predicates.EqualTo("voice_status", "0"); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + result->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Update_test_2600 + * @tc.name When updating voicemail data, a non-existent field was passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Update_test_2600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Update_test_2600 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "11100886622"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("abnormal_voicemail_Update_test_2600 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", std::string("18522547896")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("ids", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + HILOG_INFO("abnormal_voicemail_Update_test_2600: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Update_test_2700 + * @tc.name When updating voicemail data, a nonexistent table name is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Update_test_2700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Update_test_2700 is staring! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "188520"); + int voicemailId = VoicemailInsertValues(values); + HILOG_INFO("abnormal_voicemail_Update_test_2700 : voicemailId = %{public}d", voicemailId); + EXPECT_GT(voicemailId, 0); + + OHOS::Uri uriVoicemails(VoicemailUri::ERROR_URI); + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutString("phone_number", std::string("18522547896")); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int updateCode = voicemailAbility.Update(uriVoicemails, updateValues, predicates); + HILOG_INFO("abnormal_voicemail_Update_test_2700: updateCode = %{public}d", updateCode); + EXPECT_EQ(updateCode, -1); + std::vector columns; + columns.push_back("phone_number"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "abnormal_voicemail_Update_test_2700"); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Query_test_2800 + * @tc.name When querying voicemail status, a non-existent field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Query_test_2800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_Query_test_2800 is starting! ---"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_numbers"); + columns.push_back("voice_status"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("voice_status", "1"); + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + resultSet->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Query_test_2900 + * @tc.name An incorrect field was passed in when querying voicemail data + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Query_test_2900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_voicemail_Query_test_2900 is starting!-----"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_numbers"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + int rowCount = -1; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + resultSet->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Query_test_3000 + * @tc.name When querying voicemail data, a non-existent field value is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Query_test_3000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_voicemail_Query_test_3000 is starting!-----"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", "10000000"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + result->Close(); + EXPECT_EQ(0, rowCount); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_Query_test_3100 + * @tc.name When querying voicemail data, a nonexistent table name was passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_Query_test_3100, testing::ext::TestSize.Level1) +{ + HILOG_INFO("-----abnormal_voicemail_Query_test_3100 is starting!-----"); + OHOS::Uri errorUri(VoicemailUri::ERROR_URI); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + std::shared_ptr resultSet = + voicemailAbility.Query(errorUri, columns, predicates); + EXPECT_EQ(resultSet, nullptr); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_BatchInsert_test_3200 + * @tc.name When adding voice mail status in batch, an error field is passed in + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_BatchInsert_test_3200, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_BatchInsert_test_3200 is starting! ---"); + OHOS::Uri uriData(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValuesOne; + voicemailValuesOne.PutString("phone_number", std::string("147002366666666")); + voicemailValuesOne.PutInt("voice_status", 1); + OHOS::NativeRdb::ValuesBucket voicemailValuesTwo; + voicemailValuesTwo.PutString("phone_numbers", std::string("1470056")); + voicemailValuesTwo.PutInt("voice_statuss", 0); + OHOS::NativeRdb::ValuesBucket voicemailValuesThree; + voicemailValuesThree.PutString("phone_number", std::string("1470089")); + voicemailValuesThree.PutInt("voice_status", 0); + + std::vector listAddBluk; + listAddBluk.push_back(voicemailValuesOne); + listAddBluk.push_back(voicemailValuesTwo); + listAddBluk.push_back(voicemailValuesThree); + int batchInsertCode = voicemailAbility.BatchInsert(uriData, listAddBluk); + EXPECT_EQ(batchInsertCode, -1); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("phone_number", "147002366666666"); + predicates.Or(); + predicates.EqualTo("phone_numbers", "1470056"); + predicates.Or(); + predicates.EqualTo("phone_number", "1470089"); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + columns.push_back("phone_numbers"); + columns.push_back("voice_status"); + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(-1, rowCount); + resultSet->Close(); + ClearVoicemail(); +} + +/* + * @tc.number abnormal_voicemail_BatchInsert_test_3300 + * @tc.name When adding voice mail data in batch, several of them fail. Check the processing logic + * @tc.desc Exception use case + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, abnormal_voicemail_BatchInsert_test_3300, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- abnormal_voicemail_BatchInsert_test_3300 is starting! ---"); + OHOS::Uri uriData(VoicemailUri::VOICEMAIL); + OHOS::NativeRdb::ValuesBucket voicemailValues; + std::vector listAddBluk; + int batchInserCode = 0; + for (int i = 0; i < 10; i++) { + listAddBluk.clear(); + for (int j = 10 * i + 1; j <= 10 * (i + 1); j++) { + voicemailValues.Clear(); + voicemailValues.PutString("phone_number", std::to_string(j)); + std::string name("zhangsan"); + name.append(std::to_string(j)); + if (j == 14 || j == 27 || j == 57) { + voicemailValues.PutString("display_names", name); + } else { + voicemailValues.PutString("display_name", name); + } + listAddBluk.push_back(voicemailValues); + } + batchInserCode = voicemailAbility.BatchInsert(uriData, listAddBluk); + HILOG_INFO("abnormal_voicemail_BatchInsert_test_3300 : batchInserCode = %{public}d", batchInserCode); + if (batchInserCode == 0) { + HILOG_INFO("abnormal_voicemail_BatchInsert_test_3300 batch insert success!"); + } else { + HILOG_INFO("abnormal_voicemail_BatchInsert_test_3300 batch insert fail!"); + EXPECT_EQ(batchInserCode, -1); + } + } + // clear data + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.GreaterThan("id", "0"); + int deleteCode = VoicemailDelete(predicates); + EXPECT_EQ(0, deleteCode); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Insert_test_3400 + * @tc.name Add a voice mailbox with status 0 and verify that the insertion was successful + * @tc.desc Added ability to voice mailbox status + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Insert_test_3400, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Insert_test_3400 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "166320"); + values.PutInt("voice_status", 0); + int voicemailId = VoicemailInsertValues(values); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Insert_test_3400"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Update_test_3500 + * @tc.name Update the voice mailbox status and verify whether the update is successful (voice_status changes from 1 + * to 0) + * @tc.desc Voicemail status update capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Update_test_3500, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Update_test_3500 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "166323340"); + values.PutInt("voice_status", 1); + int voicemailId = VoicemailInsertValues(values); + EXPECT_GT(voicemailId, 0); + + OHOS::NativeRdb::ValuesBucket updateValues; + updateValues.PutInt("voice_status", 0); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(voicemailId)); + int updateCode = VoicemailUpdate(updateValues, predicates); + EXPECT_EQ(updateCode, 0); + + updateValues.PutString("phone_number", "166323340"); + predicates.Clear(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::vector columns; + columns.push_back("phone_number"); + columns.push_back("voice_status"); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(updateValues, result, "voicemail_Update_test_3500"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_Query_test_3600 + * @tc.name Query the voice mailbox with status 0 and return the query results + * @tc.desc Voicemail status query capability + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_Query_test_3600, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_Query_test_3600 is starting! ---"); + OHOS::NativeRdb::ValuesBucket values; + values.PutString("phone_number", "882203110"); + values.PutInt("voice_status", 0); + int voicemailId = VoicemailInsertValues(values); + EXPECT_GT(voicemailId, 0); + + values.PutInt("id", voicemailId); + std::vector columns; + columns.push_back("id"); + columns.push_back("phone_number"); + columns.push_back("voice_status"); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("voice_status", "0"); + predicates.And(); + predicates.EqualTo("id", std::to_string(voicemailId)); + std::shared_ptr result = VoicemailQuery(columns, predicates); + int rowCount = 0; + result->GetRowCount(rowCount); + EXPECT_EQ(1, rowCount); + CheckResultSet(values, result, "voicemail_Query_test_3600"); + ClearVoicemail(); +} + +/* + * @tc.number voicemail_async_insert_test_3800 + * @tc.name Add voicemail async + * @tc.desc Ability to join or add voicemail + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_async_insert_test_3700, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_async_insert_test_3700 is staring! ---"); + std::map result; + std::vector voicemailAsyncVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + name.append(std::to_string(i)); + values.PutString("display_name", name); + VoicemailAsync *contactAsync = new VoicemailAsync(values, result); + std::thread asyncThread(&VoicemailAsync::Insert, contactAsync); + voicemailAsyncVector.push_back(contactAsync); + asyncThread.detach(); + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::map::iterator it; + for (it = result.begin(); it != result.end(); it++) { + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.EqualTo("id", std::to_string(it->first)); + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + CheckResultSet(it->second, resultSet, "voicemail_async_insert_test_3700"); + } + for (int i = 0; i < threadNum; ++i) { + delete voicemailAsyncVector[i]; + } + ClearVoicemail(); +} + +/* + * @tc.number voicemail_async_update_test_3900 + * @tc.name update voicemail async + * @tc.desc Ability to join or update voicemail + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_async_update_test_3800, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_async_update_test_3800 is staring! ---"); + OHOS::NativeRdb::ValuesBucket voicemailValues; + std::vector voicemailId; + voicemailId.push_back(VoicemailInsertValue("async_update1", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update2", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update3", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update4", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update5", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update6", voicemailValues)); + voicemailValues.Clear(); + std::vector upDateValues; + OHOS::NativeRdb::DataAbilityPredicates queryPredicates; + std::vector voicemailAsyncVector; + int size = voicemailId.size(); + for (int i = 0; i < size; ++i) { + OHOS::NativeRdb::ValuesBucket values; + std::string name; + name.append("asyncTest"); + values.PutString("display_name", name); + upDateValues.push_back(values); + int id = voicemailId[i]; + VoicemailAsync *contactAsync = new VoicemailAsync(values, id); + voicemailAsyncVector.push_back(contactAsync); + std::thread asyncThread(&VoicemailAsync::Update, contactAsync); + asyncThread.detach(); + queryPredicates.EqualTo("id", std::to_string(voicemailId[i])); + if (i < size - 1) { + queryPredicates.Or(); + } + } + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + columns.push_back("display_name"); + std::shared_ptr resultSet = VoicemailQuery(columns, queryPredicates); + CheckResultSetList(upDateValues, resultSet, "voicemail_async_update_test_3800"); + for (int i = 0; i < size; ++i) { + delete voicemailAsyncVector[i]; + } + ClearVoicemail(); +} + +/* + * @tc.number voicemail_async_query_test_3900 + * @tc.name query voicemail async + * @tc.desc Ability to join or query + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_async_query_test_3900, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_async_query_test_4000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket voicemailValues; + std::vector voicemailId; + voicemailId.push_back(VoicemailInsertValue("async_query1", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_query2", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_query3", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_query4", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_query5", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_query6", voicemailValues)); + voicemailValues.Clear(); + std::vector voicemailAsyncVector; + std::vector> resultSetVector; + int threadNum = 6; + for (int i = 0; i < threadNum; ++i) { + VoicemailAsync *contactAsync = new VoicemailAsync(resultSetVector, voicemailId); + voicemailAsyncVector.push_back(contactAsync); + std::thread asyncThread(&VoicemailAsync::Query, contactAsync); + asyncThread.detach(); + } + int queryCount = 6; + int size = resultSetVector.size(); + for (int i = 0; i < size; ++i) { + int rowCount = 0; + resultSetVector[i]->GetRowCount(rowCount); + EXPECT_EQ(queryCount, rowCount); + resultSetVector[i]->Close(); + } + for (int i = 0; i < size; ++i) { + delete voicemailAsyncVector[i]; + } + ClearVoicemail(); +} + +/* + * @tc.number voicemail_async_delete_test_4100 + * @tc.name delete voicemail async + * @tc.desc Ability to join or delete voicemail + * @tc.level Level1 + * @tc.size MediumTest + * @tc.type Function + */ +HWTEST_F(VoicemailAbilityTest, voicemail_async_delete_test_4000, testing::ext::TestSize.Level1) +{ + HILOG_INFO("--- voicemail_async_delete_test_4000 is staring! ---"); + OHOS::NativeRdb::ValuesBucket voicemailValues; + std::vector voicemailId; + voicemailId.push_back(VoicemailInsertValue("async_update1", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update2", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update3", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update4", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update5", voicemailValues)); + voicemailValues.Clear(); + voicemailId.push_back(VoicemailInsertValue("async_update6", voicemailValues)); + voicemailValues.Clear(); + int size = voicemailId.size(); + OHOS::NativeRdb::DataAbilityPredicates predicates; + predicates.BeginWrap(); + std::vector voicemailAsyncVector; + for (int i = 0; i < size; ++i) { + int id = voicemailId[i]; + VoicemailAsync *contactAsync = new VoicemailAsync(id); + voicemailAsyncVector.push_back(contactAsync); + std::thread asyncThread(&VoicemailAsync::Delete, contactAsync); + asyncThread.detach(); + predicates.EqualTo("id", std::to_string(id)); + if (i < size - 1) { + predicates.Or(); + } + } + predicates.EndWrap(); + std::chrono::milliseconds dura(Time::ASYNC_SLEEP_TIME); + std::this_thread::sleep_for(dura); + std::vector columns; + std::shared_ptr resultSet = VoicemailQuery(columns, predicates); + int rowCount = 0; + resultSet->GetRowCount(rowCount); + EXPECT_EQ(0, rowCount); + resultSet->Close(); + for (int i = 0; i < size; ++i) { + delete voicemailAsyncVector[i]; + } + ClearVoicemail(); +} +} // namespace Test +} // namespace Contacts \ No newline at end of file