1/*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import dataShare from '@ohos.data.dataShare';
17import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from 'deccjsunit/index';
18
19const URI_CONTACTS = 'datashare:///com.ohos.contactsdataability';
20const rawContactUri = 'datashare:///com.ohos.contactsdataability/contacts/raw_contact';
21const backup = 'datashare:///com.ohos.contactsdataability/contacts/backup';
22const recover = 'datashare:///com.ohos.contactsdataability/contacts/recover';
23const deletedUri = 'datashare:///com.ohos.contactsdataability/contacts/deleted_raw_contact';
24const SLEEP_ONE_SECOND = 1000;
25const SLEEP_TWO_SECOND = 2000;
26const SLEEP_THREE_SECOND = 3000;
27const SLEEP_FIVE_SECOND = 5000;
28
29describe('RecoveryTest', function () {
30  function sleep(numberMillis) {
31    let now = new Date();
32    let exitTime = now.getTime() + numberMillis;
33    while (true) {
34      now = new Date();
35      if (now.getTime() > exitTime) {
36        return;
37      }
38    }
39  }
40
41  async function contactsQuery(tag, uri, size) {
42    let dataShareHelper = dataShare.createDataShareHelper(URI_CONTACTS);
43    console.info(tag + ': contactsQuery start ! dataShareHelper = ' + dataShareHelper);
44    let resultColumns = [];
45    let condition = new dataShare.DataSharePredicates();
46    condition.greaterThan('id', '0');
47    try {
48      let resultSet = await dataShareHelper.query(uri, resultColumns, condition);
49      console.info(tag + ' contactsQuery resultSet.rowCount is = ' + resultSet.rowCount);
50      console.info(tag + ' contactsQuery size is = ' + size);
51      expect(resultSet.rowCount === size).assertEqual(true);
52      if (resultSet.rowCount > 0) {
53        if (resultSet.goToFirstRow()) {
54          do {
55            let id = resultSet.getString(resultSet.getColumnIndex('id'));
56            console.info(tag + ':logMessage contactsQuery id = ' + id);
57            let name = resultSet.getString(resultSet.getColumnIndex('display_name'));
58            console.info(tag + ':logMessage contactsQuery name = ' + name);
59          } while (resultSet.goToNextRow());
60        }
61      }
62      resultSet.close();
63    } catch (error) {
64      console.info(tag + 'logMessage contactsQuery: error = ' + error);
65    }
66  }
67
68  async function rawContactInsert(name) {
69    console.info('------logMessage rawContactInsert is starting!-----');
70    let dataShareHelper = dataShare.createDataShareHelper(URI_CONTACTS);
71    console.info('logMessage get dataShareHelper success! dataShareHelper = ' + dataShareHelper);
72    let insertValue = {
73      'display_name': name
74    };
75    try {
76      let rawContactId = await dataShareHelper.insert(rawContactUri, insertValue);
77      console.info('logMessage rawContactInsert: rawContactId = ' + rawContactId);
78      expect(rawContactId > 0).assertTrue();
79    } catch (error) {
80      console.info('logMessage rawContactInsert: insert error = ' + error);
81    }
82    return rawContactId;
83  }
84
85  async function deleteRawContact(tag) {
86    try {
87      let dataShareHelper = dataShare.createDataShareHelper(URI_CONTACTS);
88      let condition = new dataShare.DataSharePredicates();
89      condition.greaterThan('id', '0');
90      condition.and();
91      condition.equalTo('is_deleted', '0');
92      await dataShareHelper.delete(rawContactUri, condition);
93      sleep(SLEEP_FIVE_SECOND);
94      let conditionAll = new dataShare.DataSharePredicates();
95      conditionAll.greaterThan('id', '0');
96      await dataShareHelper.delete(deletedUri, conditionAll);
97    } catch (error) {
98      console.info(tag + ': deleteRawContact error = ' + error);
99    }
100  }
101
102  /**
103   * @tc.number  recovery_test_100
104   * @tc.name    backup database
105   * @tc.desc    Function test
106   */
107  it('recovery_test_100', 0, async function (done) {
108    await deleteRawContact('recovery_test_100');
109    let dataShareHelper = dataShare.createDataShareHelper(URI_CONTACTS);
110    let updateValues = {};
111    let condition = new dataShare.DataSharePredicates();
112    try {
113      let updateCode = await dataShareHelper.update(backup, updateValues, condition);
114      sleep(SLEEP_TWO_SECOND);
115      console.info('logMessage recovery_test_100: updateCode = ' + updateCode);
116      expect(updateCode === 0).assertTrue();
117      sleep(SLEEP_TWO_SECOND);
118      await contactsQuery('recovery_test_100', rawContactUri, 0);
119      done();
120    } catch (error) {
121      console.info('logMessage recovery_test_100: raw_contact update error = ' + error);
122      done();
123    }
124  });
125
126  /**
127   * @tc.number  recovery_test_200
128   * @tc.n    ame    recovery database
129   * @tc.desc    Function test
130   */
131  it('recovery_test_200', 0, async function (done) {
132    await deleteRawContact('recovery_test_200');
133    let dataShareHelper = dataShare.createDataShareHelper(URI_CONTACTS);
134    let updateValues = {};
135    let condition = new dataShare.DataSharePredicates();
136    rawContactInsert('liming');
137    rawContactInsert('xiaolilili');
138    sleep(SLEEP_TWO_SECOND);
139    let updateCode = await dataShareHelper.update(backup, updateValues, condition);
140    sleep(SLEEP_TWO_SECOND);
141    console.info(' recovery_test_200: backup = ' + updateCode);
142    expect(updateCode === 0).assertTrue();
143    sleep(SLEEP_ONE_SECOND);
144    try {
145      let updateCode = await dataShareHelper.update(recover, updateValues, condition);
146      let size = 2;
147      sleep(SLEEP_THREE_SECOND);
148      console.info('logMessage recovery_test_200: recover = ' + updateCode);
149      expect(updateCode === 0).assertTrue();
150      await contactsQuery('recovery_test_200', rawContactUri, size);
151      await deleteRawContact('recovery_test_200');
152      done();
153    } catch (error) {
154      console.info('logMessage recovery_test_200: raw_contact update error = ' + error);
155      done();
156    }
157  });
158});
159