1/*
2 * Copyright (C) 2022 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 resourceManager from '@ohos.resourceManager';
17import photoAccessHelper from '@ohos.file.photoAccessHelper';
18import {expect} from 'deccjsunit/index'
19import router from '@system.router'
20import fs from '@ohos.file.fs';
21import fileio from '@ohos.fileio'
22import featureAbility from '@ohos.ability.featureAbility'
23import { UiDriver, BY, PointerMatrix } from '@ohos.UiTest';
24import abilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry';
25const CODECMIMEVALUE = ['video/avc', 'audio/mp4a-latm', 'audio/mpeg']
26const delegator = abilityDelegatorRegistry.getAbilityDelegator();
27export async function getPermission(permissionNames) {
28    featureAbility.getContext().requestPermissionsFromUser(permissionNames, 0, async (data) => {
29        console.info("case request success" + JSON.stringify(data));
30    })
31}
32
33export async function driveFn(num) {
34    console.info(`case come in driveFn 111`)
35    let driver = await UiDriver.create()
36    console.info(`case come in driveFn 222`)
37    console.info(`driver is ${JSON.stringify(driver)}`)
38    await msleepAsync(2000)
39    console.info(`UiDriver start`)
40    for (let i = 0; i < num; i++) {
41        let button = await driver.findComponent(BY.text('允许'))
42        if(button == null){
43            let cmd = "hidumper -s WindowManagerService -a'-a'"
44            await delegator.executeShellCommand(cmd);
45            continue;
46        }
47        console.info(`button is ${JSON.stringify(button)}`)
48        await msleepAsync(2000)
49        if(await driver.findComponent(BY.text('允许')) != null){
50            await button.click()
51        }
52        await msleepAsync(2000)
53    }
54    await msleepAsync(2000)
55}
56
57// File operation
58export async function getFileDescriptor(fileName) {
59    let fileDescriptor = undefined;
60    await resourceManager.getResourceManager().then(async (mgr) => {
61        await mgr.getRawFileDescriptor(fileName).then(value => {
62            fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length};
63            console.log('case getRawFileDescriptor success fileName: ' + fileName);
64        }).catch(error => {
65            console.log('case getRawFileDescriptor err: ' + error);
66        });
67    });
68    return fileDescriptor;
69}
70export async function getStageFileDescriptor(fileName) {
71    let fileDescriptor = undefined;
72    let mgr = globalThis.abilityContext.resourceManager
73    await mgr.getRawFileDescriptor(fileName).then(value => {
74        fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length};
75        console.log('case getRawFileDescriptor success fileName: ' + fileName);
76    }).catch(error => {
77        console.log('case getRawFileDescriptor err: ' + error);
78    });
79    return fileDescriptor;
80}
81export async function closeFileDescriptor(fileName) {
82    await resourceManager.getResourceManager().then(async (mgr) => {
83        await mgr.closeRawFileDescriptor(fileName).then(()=> {
84            console.log('case closeRawFileDescriptor ' + fileName);
85        }).catch(error => {
86            console.log('case closeRawFileDescriptor err: ' + error);
87        });
88    });
89}
90
91export async function getStageFd(fileName) {
92    let fileDescriptor = undefined;
93    let mgr = globalThis.abilityContext.resourceManager;
94    await mgr.getRawFd(fileName).then(value => {
95        fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length};
96        console.log('case getRawFd success fileName: ' + fileName);
97    }).catch(error => {
98        console.log('case getRawFd err: ' + fileName);
99        console.log('case getRawFd err: ' + error);
100    });
101    return fileDescriptor;
102}
103
104export async function closeStageFd(fileName) {
105    await resourceManager.getResourceManager().then(async (mgr) => {
106        await mgr.closeRawFd(fileName).then(()=> {
107            console.log('case closeRawFd ' + fileName);
108        }).catch(error => {
109            console.log('case closeRawFd err: ' + error);
110        });
111    });
112}
113
114export function isFileOpen(fileDescriptor, done) {
115    if (fileDescriptor == undefined) {
116        expect().assertFail();
117        console.info('case error fileDescriptor undefined, open file fail');
118        done();
119    }
120}
121
122export async function getFdRead(pathName, done) {
123    let fdReturn;
124    await featureAbility.getContext().getFilesDir().then((fileDir) => {
125        console.info("case file dir is" + JSON.stringify(fileDir));
126        pathName = fileDir + '/' + pathName;
127        console.info("case pathName is" + pathName);
128    });
129    await fileio.open(pathName).then((fdNumber) => {
130        isFileOpen(fdNumber, done)
131        fdReturn = fdNumber;
132        console.info('[fileio]case open fd success, fd is ' + fdReturn);
133    })
134    return fdReturn;
135}
136
137export async function closeFdNumber(fdNumber) {
138    await fileio.close(fdNumber);
139}
140
141// wait synchronously
142export function msleep(time) {
143    for(let t = Date.now();Date.now() - t <= time;);
144}
145
146// wait asynchronously
147export async function msleepAsync(ms) {
148    return new Promise((resolve) => setTimeout(resolve, ms));
149}
150
151export function printError(error, done) {
152    expect().assertFail();
153    console.info(`case error called,errMessage is ${error.message}`);
154    done();
155}
156
157export function assertErr(opera, err, done) {
158    console.info(`case ${opera} error,errMessage is ${err.message}`);
159    expect().assertFail();
160    done();
161}
162
163// callback function for promise call back error
164export function failureCallback(error) {
165    expect().assertFail();
166    console.info(`case error called,errMessage is ${error.message}`);
167}
168
169// callback function for promise catch error
170export function catchCallback(error) {
171    expect().assertFail();
172    console.info(`case error called,errMessage is ${error.message}`);
173}
174
175export function checkDescription(actualDescription, descriptionKey, descriptionValue) {
176    for (let i = 0; i < descriptionKey.length; i++) {
177        let property = actualDescription[descriptionKey[i]];
178        console.info('case key is  '+ descriptionKey[i]);
179        console.info('case actual value is  '+ property);
180        console.info('case hope value is  '+ descriptionValue[i]);
181        if (descriptionKey[i] == 'codec_mime') {
182            console.info('CODECMIMEVALUE[descriptionValue[i]] value is  '+ CODECMIMEVALUE[descriptionValue[i]]);
183            if(property == "video/x-h264"){
184                console.info('property attribute is:'+ property);
185            }else{
186                expect(property).assertEqual(CODECMIMEVALUE[descriptionValue[i]]);
187            }
188        } else if (descriptionKey[i] == 'bitrate') {
189            expect(Math.abs(property - descriptionValue[i])).assertLess(500);
190        } else {
191            expect(property).assertEqual(descriptionValue[i]);
192        }
193
194    }
195}
196
197export function checkPlaybackInfo(actualDescription, descriptionKey, descriptionValue) {
198    for (let i = 0; i < descriptionKey.length; i++) {
199        let property = actualDescription[descriptionKey[i]];
200        console.info('case key is  ' + descriptionKey[i]);
201        console.info('case actual value is  ' + property);
202        console.info('case hope value is  ' + descriptionValue[i]);
203        expect(property).assertEqual(descriptionValue[i]);
204    }
205}
206
207export function checkOldDescription(actualDescription, descriptionKey, descriptionValue) {
208    for (let i = 0; i < descriptionKey.length; i++) {
209        let property = actualDescription[descriptionKey[i]];
210        console.info('case key is  '+ descriptionKey[i]);
211        console.info('case actual value is  '+ property);
212        console.info('case hope value is  '+ descriptionValue[i]);
213        if (descriptionKey[i] === 'bitrate'){
214            expect(Math.abs(property - descriptionValue[i])).assertLess(500);
215            return;
216        }
217        expect(property).assertEqual(descriptionValue[i]);
218    }
219}
220
221export function printDescription(obj) {
222    let description = "";
223    for(let i in obj) {
224        let property = obj[i];
225        console.info('case key is  '+ i);
226        console.info('case value is  '+ property);
227        description += i + " = " + property + "\n";
228    }
229}
230
231export async function toNewPage(pagePath1, pagePath2, page) {
232    let path = '';
233    if (page == 0) {
234        path = pagePath1;
235    } else {
236        path = pagePath2;
237    }
238    let options = {
239        uri: path,
240    }
241    try {
242        await router.push(options);
243    } catch {
244        console.info('case route failed');
245    }
246}
247
248export async function clearRouter() {
249    await router.clear();
250}
251
252export async function saveVideo(asset) {
253    console.info('case saveVideo start');
254    try {
255        let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(featureAbility.getContext());
256        let assetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(asset);
257        assetChangeRequest.saveCameraPhoto();
258        await phAccessHelper.applyChanges(assetChangeRequest);
259        console.info('case saveVideo successfully');
260    } catch (error) {
261        console.info(`case error called,errMessage is ${error.message}`);
262    }
263    console.info('case saveVideo end');
264}
265
266export async function getFd(pathName) {
267    console.info('case come in getFd')
268    let fdObject = {
269        fileAsset : null,
270        fdNumber : null
271    }
272
273    await featureAbility.getContext().getFilesDir().then((fileDir) => {
274        console.info("case file dir is" + JSON.stringify(fileDir));
275        pathName = fileDir + '/' + pathName;
276        console.info("case pathName is" + pathName);
277    });
278
279    let file = fs.openSync(pathName, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
280    fdObject.fileAsset = file;
281    fdObject.fdNumber = file.fd;
282    console.info('case getFd number is: ' + fdObject.fdNumber);
283
284    return fdObject;
285}
286
287export async function closeFd(fdNumber) {
288    console.info('case come in closeFd')
289    if (fdNumber != null) {
290        fs.closeSync(fdNumber);
291    } else {
292        console.info('[fs.closeSync] case fdNumber is null');
293    }
294}
295