From 0d31d85580fd9fd31503dd4b71ca046ed7eaa5c4 Mon Sep 17 00:00:00 2001 From: XTStarry Date: Tue, 10 Aug 2021 15:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0File=E5=92=8CFileIO=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: XTStarry --- storage/BUILD.gn | 20 + storage/storagefileiojstest/BUILD.gn | 18 + storage/storagefileiojstest/Test.json | 19 + .../hap/entry-debug-rich-signed.hap | Bin 0 -> 910575 bytes .../project/entry/package.json | 6 + .../project/entry/src/main/config.json | 62 + .../project/entry/src/main/js/default/app.js | 23 + .../entry/src/main/js/default/i18n/en-US.json | 6 + .../entry/src/main/js/default/i18n/zh-CN.json | 6 + .../src/main/js/default/pages/index/index.css | 9 + .../src/main/js/default/pages/index/index.hml | 5 + .../src/main/js/default/pages/index/index.js | 54 + .../project/entry/src/main/js/test/Common.js | 161 + .../entry/src/main/js/test/File.test.js | 3748 +++++++++++++++++ .../entry/src/main/js/test/FileIO.test.js | 2006 +++++++++ .../entry/src/main/js/test/FileIODir.test.js | 334 ++ .../src/main/js/test/FileIODirent.test.js | 403 ++ .../entry/src/main/js/test/FileIOStat.test.js | 743 ++++ .../src/main/js/test/FileIOStream.test.js | 1821 ++++++++ .../entry/src/main/js/test/List.test.js | 21 + .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes test_packages.gni | 1 + 23 files changed, 9478 insertions(+) create mode 100644 storage/BUILD.gn create mode 100644 storage/storagefileiojstest/BUILD.gn create mode 100644 storage/storagefileiojstest/Test.json create mode 100644 storage/storagefileiojstest/hap/entry-debug-rich-signed.hap create mode 100644 storage/storagefileiojstest/project/entry/package.json create mode 100644 storage/storagefileiojstest/project/entry/src/main/config.json create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/app.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/i18n/en-US.json create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/i18n/zh-CN.json create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.css create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.hml create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/Common.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/File.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/FileIO.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/FileIODir.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/FileIODirent.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStat.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStream.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/js/test/List.test.js create mode 100644 storage/storagefileiojstest/project/entry/src/main/resources/base/element/string.json create mode 100644 storage/storagefileiojstest/project/entry/src/main/resources/base/media/icon.png diff --git a/storage/BUILD.gn b/storage/BUILD.gn new file mode 100644 index 000000000..ea773fd18 --- /dev/null +++ b/storage/BUILD.gn @@ -0,0 +1,20 @@ +# 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("//test/xts/tools/build/suite.gni") + +group("storage") { + testonly = true + if (is_standard_system) { + deps = [ "storagefileiojstest:storagefileio_js_test" ] + } +} diff --git a/storage/storagefileiojstest/BUILD.gn b/storage/storagefileiojstest/BUILD.gn new file mode 100644 index 000000000..cdf2e8c38 --- /dev/null +++ b/storage/storagefileiojstest/BUILD.gn @@ -0,0 +1,18 @@ +# 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("//test/xts/tools/build/suite.gni") + +ohos_js_hap_suite("storagefileio_js_test") { + test_hap_name = "StoragefileioJSTest" + hap_source_path = "hap/entry-debug-rich-signed.hap" +} diff --git a/storage/storagefileiojstest/Test.json b/storage/storagefileiojstest/Test.json new file mode 100644 index 000000000..05a9b24da --- /dev/null +++ b/storage/storagefileiojstest/Test.json @@ -0,0 +1,19 @@ + +{ + "description": "Configuration for storage file and fileio Tests", + "driver": { + "type": "JSUnitTest", + "test-timeout": "21600000", + "package": "ohos.acts.stroage.fileio", + "shell-timeout": "21600000" + }, + "kits": [ + { + "test-file-name": [ + "StoragefileioJSTest.hap" + ], + "type": "AppInstallKit", + "cleanup-apps": true + } + ] +} \ No newline at end of file diff --git a/storage/storagefileiojstest/hap/entry-debug-rich-signed.hap b/storage/storagefileiojstest/hap/entry-debug-rich-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..9cc98c7fd8494d9f98037fcf7c9ce2337f062dc9 GIT binary patch literal 910575 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¡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�vly!xrfGgmygr%U`)0;XLgzI?#V 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

(0?IUS+xDd!|Ka845wI+%2JLd~Ig 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 x{B6hkm>j9w7moQ$kCS7k+VSQIBeaB1VMdG + + {{ $t('strings.hello') }} {{ title }} + + diff --git a/storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.js b/storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.js new file mode 100644 index 000000000..aa194c7ca --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/default/pages/index/index.js @@ -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. + */ + +import file from '@system.file' +import app from '@system.app' + +import {Core, ExpectExtend, ReportExtend} from 'deccjsunit/index' + +export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + console.info('onShow finish') + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + const reportExtend = new ReportExtend(file) +// const instrumentLog = new InstrumentLog({ +// 'id': 'report' +// }) + core.addService('expect', expectExtend) + core.addService('report', reportExtend) +// core.addService('report', instrumentLog) + core.init() +// core.subscribeEvent('spec', instrumentLog) +// core.subscribeEvent('suite', instrumentLog) +// core.subscribeEvent('task', instrumentLog) + + const configService = core.getDefaultService('config') + configService.setConfig(this) + + require('../../../test/List.test') + core.execute() + }, + onReady() { + }, +} \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/Common.js b/storage/storagefileiojstest/project/entry/src/main/js/test/Common.js new file mode 100644 index 000000000..b441690bd --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/Common.js @@ -0,0 +1,161 @@ +/* + * 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 fileio from '@system.fileio' + +export const FILE_CONTENT = "仙女星系 (英语: Andromeda Galaxy; M31; NGC 224 ;曾被称为 仙女座大星云 ),位于仙女座方位的拥有巨大盘状结构的 \ +旋涡星系 , 梅西耶星表 编号为M31, 星云星团新总表 编号位 NGC 224 ,直径22万光年,距离地球有254万光年,是距银河系最近的大星系。" + +//创建一个可读写文件 +export function prepareFile(fpath, content) { + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + fileio.ftruncateSync(fd) + fileio.writeSync(fd, content) + fileio.fsyncSync(fd) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to prepareFile for " + e) + return false + } +} +export function prepareFile1(fpath, content) { + try { + let fd = fileio.openSync(fpath, 0o102, 0o777) + fileio.ftruncateSync(fd) + fileio.writeSync(fd, content) + fileio.fsyncSync(fd) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to prepareFile for " + e) + return false + } +} +//创建一个可读的空文件 +export function prepareEmptyFile(fpath) { + try { + let fd = fileio.openSync(fpath, 0o102, 0o777) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to prepareFile for " + e) + return false + } +} +//将已存在的文件访问权限改为只读 +export function fileToReadOnly(fpath) { + try { + let fd = fileio.openSync(fpath, 0o1) + fileio.fchmodSync(fd, 0o444) + fileio.fsyncSync(fd) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to fileToReadOnly for " + e) + return false + } +} +//将已存在的文件访问权限改为只写 +export function fileToWriteOnly(fpath) { + try { + let fd = fileio.openSync(fpath, 0o2) + fileio.fchmodSync(fd, 0o222) + fileio.fsyncSync(fd) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to fileToWriteOnly " + e) + return false + } +} +//将已存在的文件访问权限改为读写 +export function fileToReadAndWrite(fpath) { + try { + let fd = fileio.openSync(fpath, 0o1) + fileio.fchmodSync(fd, 0o777) + fileio.fsyncSync(fd) + fileio.closeSync(fd) + return true + } catch (e) { + console.log("Failed to fileToReadAndWrite " + e) + return false + } +} +var fileSeed = 0 +export function nextFileName(testName) { + const BASE_PATH = "/data/accounts/account_0/appdata/ohos.acts.stroage.fileio/cache/" + return BASE_PATH + testName +} +export function fileName(testName) { + const BASE_PATH = "/data/accounts/account_0/appdata/ohos.acts.stroage.fileio/files/" + return BASE_PATH + testName +} +export function differentFileName(testName) { + const BASE_PATH = "/data/accounts/account_0/ohos.acts.distributeddatamgr.distributedfile/" + return BASE_PATH + testName +} +export function cacheFileName(testName) { + const BASE_PATH = "/data/accounts/account_0/appdata/ohos.acts.stroage.fileio/files/cache/" + return BASE_PATH + testName +} + +export function getFileTextLen(fpath) { + let ss + try{ + ss = fileio.Stream.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096)) + console.log("文件:" + fpath) + console.log("文本长度:" + len) + expect(ss.closeSync() !== null).assertTrue() + return len + } catch (e) { + console.log("Failed to getFileTextLen " + e) + expect(ss.closeSync() !== null).assertTrue() + return null + } +} +export function isFileExist(fpath) { + try{ + expect(fileio.accessSync(fpath) !== null).assertTrue() + console.log("文件:" + fpath) + console.log("状态:存在") + return true + } catch (e) { + console.log("文件:" + fpath) + console.log("状态:不存在") + return false + } +} +export function sleep(n) { + var start = new Date().getTime(); + while (true) { + if (new Date().getTime() - start > n) { + break; + } + } +} +export function randomString(len) { + len = len; + var $chars = 'aaaabbbbcccc'; + var maxPos = $chars.length; + var pwd = ''; + for (var i = 0; i < len; i++) { + pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); + } + return pwd; +} \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/File.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/File.test.js new file mode 100644 index 000000000..39d759fec --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/File.test.js @@ -0,0 +1,3748 @@ +/* + * 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 fileio from '@system.fileio'; +import file from '@system.file'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { + FILE_CONTENT, prepareFile, fileName, randomString, sleep, + cacheFileName, prepareEmptyFile, nextFileName +} from './Common' + + +describe('fileTest', function () { + + /** + * @tc.number SUB_STORAGE_File_Delete_0100 + * @tc.name File_Delete_001 + * @tc.desc Function of API, delete file.The test file is exist. + */ + it('File_Delete_001', 0, async function (done) { + let fpath = fileName("File_Delete_001") + prepareFile(fpath, "hello") + file.delete({ + uri: 'internal://app/File_Delete_001', + success: function () { + console.log('File_Delete_001 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_001 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0200 + * @tc.name File_Delete_002 + * @tc.desc Function of API, delete dir.The dir is empty. + */ + it('File_Delete_002', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/File_Delete_002', + success: function () { + console.log('File_Delete_002 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_002 call mkdir fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_Delete_002', + success: function () { + console.log('File_Delete_002 call delete success.'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_002 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0300 + * @tc.name File_Delete_003 + * @tc.desc Function of API, error code: 202 The test file or dir are exist. + */ + it('File_Delete_003', 0, async function (done) { + file.delete({ + uri: 'internal://ohos/workspace/text.txt', + success: function () { + console.log('File_Delete_003 call delete success.'); + expect(null).assertFail() + }, + fail: function (data, code) { + console.log('File_Delete_003 call delete fail, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0400 + * @tc.name File_Delete_004 + * @tc.desc Function of API, error code: 300 The dir is exist with files. + */ + it('File_Delete_004', 0, async function (done) { + let dpath = fileName('File_Delete_004'); + let fpath = dpath + '/File_Delete_004'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.delete({ + uri: 'internal://app/File_Delete_004', + success: function () { + console.log('File_Delete_004 call delete success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Delete_004 call delete fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0500 + * @tc.name File_Delete_005 + * @tc.desc Function of API, error code: 301 The file and dir are not exist. + */ + it('File_Delete_005', 0, async function (done) { + file.delete({ + uri: 'internal://app/File_Delete_005', + success: function () { + console.log('File_Delete_005 call delete success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Delete_005 call delete fail, code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0600 + * @tc.name File_Delete_006 + * @tc.desc uri address length more than 4096 The test file is exist. + */ + it('File_Delete_006', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://cache/' + firstPath; + fileio.mkdirSync(dpath); + for (let i = 0; i < 16; i++) { + console.log('frequency' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.delete({ + uri: uri, + success: function () { + console.log('File_Delete_006 call delete success'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Delete_006 call delete fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0700 + * @tc.name File_Delete_007 + * @tc.desc Function of API, delete file from cache.The test file on cache. + */ + it('File_Delete_007', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_Delete_007', + text: 'test', + success: function () { + console.log('File_Delete_007 call writeText success'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_007 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.delete({ + uri: 'internal://cache/File_Delete_007', + success: function () { + console.log('File_Delete_007 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_007 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Delete_0800 + * @tc.name File_Delete_008. + * @tc.desc Function of API, delete file from Virtual path.The test file is exist. + */ + it('File_Delete_008', 0, async function (done) { + file.writeText({ + uri: 'internal://app/../files/File_Delete_008', + text: 'Text that just for test.', + success: function () { + console.log('File_Delete_008 call writeText success'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_008 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/../files/File_Delete_008', + success: function () { + console.log('File_Delete_008 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Delete_008 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0100 + * @tc.name File_writeText_001 + * @tc.desc Function of API, write to file(app path).The test file is not exist. + */ + it('File_writeText_001', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_001', + text: 'sawyerwang.', + success: function () { + console.log('File_writeText_001 call writeText success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_001 call writeText fail , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_001', + success: function (data) { + console.log('File_writeText_001 call read success. Content: ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_001 call read fail , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.delete({ + uri: 'internal://app/File_writeText_001', + success: function () { + console.log('File_writeText_001 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_001 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0200 + * @tc.name File_writeText_002 + * @tc.desc Function of API, write to file.The test file is exist, it can be edited. + */ + it('File_writeText_002', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_002', + text: 'Text1.', + success: function () { + console.log('File_writeText_002 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_002 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeText({ + uri: 'internal://app/File_writeText_002', + text: 'Text2.', + append: true, + success: function () { + console.log('File_writeText_002 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_002 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_002', + success: function (data) { + console.log('File_writeText_002 call read success. Content: ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_002 call read fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeText_002', + success: function () { + console.log('File_writeText_002 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_002 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0300 + * @tc.name File_writeText_003 + * @tc.desc Different types of strings for text. + */ + it('File_writeText_003', 0, async function (done) { + let txt = 'hello 你好 مرحبا こんにちは 안녕하세요.' + file.writeText({ + uri: 'internal://app/File_writeText_003', + text: txt, + success: function () { + console.log('File_writeText_003 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_003 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_003', + success: function (data) { + console.log('File_writeText_003 call read success. Content: ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_003 call read fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeText_003', + success: function () { + console.log('File_writeText_003 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_003 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0400 + * @tc.name File_writeText_004 + * @tc.desc Defferent encoding(UTF-8). + */ + it('File_writeText_004', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_004', + text: 'hello', + encoding: 'UTF-8', + success: function () { + console.log('File_writeText_004 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_004 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_004', + encoding: 'UTF-8', + success: function (data) { + console.log('File_writeText_004 call readText success. Content: ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_004 call readText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeText_004', + success: function () { + console.log('File_writeText_004 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_004 delete , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0500 + * @tc.name File_writeText_005 + * @tc.desc Function of API, append mode.The test file is exist and it can be edited. + */ + it('File_writeText_005', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_005', + text: 'hello,world', + success: function () { + console.log('File_writeText_005 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_005 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeText({ + uri: 'internal://app/File_writeText_005', + text: 'hello', + append: true, + success: function () { + console.log('File_writeText_005 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_005 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_005', + success: function (data) { + console.log('File_writeText_005 call read success ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_005 call readText fail , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeText_005', + success: function () { + console.log('File_writeText_005 call delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_005 call delete fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0600 + * @tc.name File_writeText_006 + * @tc.desc Function of API, non-append mode.The test file is exist and it can be edited. + */ + it('File_writeText_006', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_006', + text: 'hello', + success: function () { + console.log('File_writeText_006 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_006 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_writeText_006', + success: function (data) { + console.log('File_writeText_006 call read success ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_006 call readText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeText_006', + success: function () { + console.log('File_writeText_006 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_006 delete , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0700 + * @tc.name File_writeText_007 + * @tc.desc Function of API, error code: 202 The test file and dir are exist. + */ + it('File_writeText_007', 0, async function (done) { + file.writeText({ + uri: '/data/accounts/account_0/appdata', + text: 'hello', + success: function () { + console.log('File_writeText_007 call writeText success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeText_007, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0800 + * @tc.name File_writeText_008 + * @tc.desc Function of API, error code: 300 The uri path is dir path. + */ + it('File_writeText_008', 0, async function (done) { + let dpath = fileName("File_writeText_008d"); + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + file.writeText({ + uri: 'internal://app/File_writeText_008d/', + text: 'hello', + success: function () { + console.log('File_writeText_008 call writeText success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeText_008 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_0900 + * @tc.name File_writeText_009 + * @tc.desc Function of API, error code: 300.The file path is not exist. + */ + it('File_writeText_009', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_writeText_009d/File_writeText_009', + text: 'test', + success: function () { + console.log('File_writeText_009 call writeText success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeText_009 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_1000 + * @tc.name File_writeText_010 + * @tc.desc Function of API, write to file(cache path).The test file is not exist. + */ + it('File_writeText_010', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_writeText_010', + text: 'test', + success: function () { + console.log('File_writeText_010 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_010 fail'); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_writeText_010', + success: function () { + console.log('File_writeText_010 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_010 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_1100 + * @tc.name File_writeText_011 + * @tc.desc Function of API, Virtual path.The test file is exist. + */ + it('File_writeText_011', 0, async function (done) { + file.writeText({ + uri: 'internal://app/../files/File_writeText_011', + text: 'sawyerwang', + success: function () { + console.log('File_writeText_011 mkdif success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_011 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/../files/File_writeText_011', + success: function (data) { + console.log('File_writeText_011 read success ' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_011 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.delete({ + uri: 'internal://app/../files/File_writeText_011', + success: function () { + console.log('File_writeText_011 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeText_011 delete , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeText_1300 + * @tc.name File_writeText_013 + * @tc.desc Function of API, write file out of package, Virtual path, save the dir authority.The test file is exist. + */ + it('File_writeText_013', 0, async function (done) { + file.writeText({ + uri: 'internal://app/../../File_writeText_013', + text: 'sawyerwang', + success: function () { + console.log('File_writeText_013 mkdir success') + expect(null).assertFail(); + }, + fail: function (data, code) { + expect(code == 300).assertTrue(); + console.log('File_writeText_013 , code: ' + code + ', data: ' + data); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0100 + * @tc.name File_writeArrayBuffer_001 + * @tc.desc Write the buffer content to file.(cache path, append mode) The file path is not exist. + */ + it('File_writeArrayBuffer_001', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_001', + buffer: buf, + append: true, + success: function () { + console.log('File_writeArrayBuffer_001 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_001', + success: function (data) { + console.log('File_writeArrayBuffer_001 call readArrayBuffer success.' + data.buffer); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_001 readArrayBuffer , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_writeArrayBuffer_001' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0200 + * @tc.name File_writeArrayBuffer_002 + * @tc.desc Write the buffer content to file.(cache path, non-append mode) The file path is not exist. + */ + it('File_writeArrayBuffer_002', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_002', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_002 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_002', + success: function (data) { + console.log('File_writeArrayBuffer_002 call readArrayBuffer success.' + data.buffer); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.delete({ + uri: 'internal://cache/File_writeArrayBuffer_002' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0300 + * @tc.name File_writeArrayBuffer_003 + * @tc.desc Write the buffer content to file.(cache path, append mode) The file path is not exist. + */ + it('File_writeArrayBuffer_003', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33, 48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_003', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_003 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_003', + buffer: buf, + append: true, + success: function () { + console.log('File_writeArrayBuffer_003 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_003', + success: function (data) { + console.log('File_writeArrayBuffer_003 readArrayBuffer success:' + data.buffer) + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0400 + * @tc.name File_writeArrayBuffer_004 + * @tc.desc Write the buffer content to file.(cache path, non-append mode) The file path is exist. + */ + it('File_writeArrayBuffer_004', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_004', + buffer: buf, + append: false, + success: function () { + console.log('File_writeArrayBuffer_004 success call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_004 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_004', + buffer: buf, + append: false, + success: function () { + console.log('File_writeArrayBuffer_004 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_004 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_004', + success: function (data) { + console.log('File_writeArrayBuffer_004: readArrayBuffer success ' + data.buffer) + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_004 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_writeArrayBuffer_004' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0500 + * @tc.name File_writeArrayBuffer_005 + * @tc.desc Function of API, set value for position.The file path is exist. + */ + it('File_writeArrayBuffer_005', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33, 44, 55, 66, 77]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_005', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_005 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_005 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_005', + buffer: buf, + position: 10, + success: function () { + console.log('File_writeArrayBuffer_005 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_005 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_005', + success: function (data) { + console.log('File_writeArrayBuffer_005 read success:' + data.buffer); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_005 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_writeArrayBuffer_005' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0600 + * @tc.name File_writeArrayBuffer_006 + * @tc.desc Function of API, not set value for position & append.The file path is exist. + */ + it('File_writeArrayBuffer_006', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_006', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_006 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_006 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.writeArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_006', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_006 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_006 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_writeArrayBuffer_006', + success: function (data) { + console.log('File_writeArrayBuffer_006 pass'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_006 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0700 + * @tc.name File_writeArrayBuffer_007 + * @tc.desc Function of API, error code: 202 + */ + it('File_writeArrayBuffer_007', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: '', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_007 call writeArrayBuffer success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_007 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0800 + * @tc.name File_writeArrayBuffer_008 + * @tc.desc Function of API, error code: 300 + */ + it('File_writeArrayBuffer_008', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.mkdir({ + uri: 'internal://app/File_writeArrayBuffer_008', + success: function () { + console.log('call mkdir success.'); + done() + }, + fail: function (data, code) { + console.error('call fail callback fail, code: ' + code + ', data: ' + data); + }, + }); + file.writeArrayBuffer({ + uri: 'internal://app/File_writeArrayBuffer_008', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_008 call writeArrayBuffer success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_008 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_0900 + * @tc.name File_writeArrayBuffer_009 + * @tc.desc Function of API, error code: 300 + */ + it('File_writeArrayBuffer_009', 0, async function (done) { + let buf = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]) + file.writeArrayBuffer({ + uri: 'internal://app/File_writeArrayBuffer_009', + buffer: buf, + success: function () { + console.log('File_writeArrayBuffer_009 call success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_009 fail'); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://app/File_writeArrayBuffer_009', + success: function (data) { + console.log('File_writeArrayBuffer_009 pass'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_009 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_writeArrayBuffer_009', + success: function () { + console.log('File_writeArrayBuffer_009 call success'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_009 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_1000 + * @tc.name File_writeArrayBuffer_010 + * @tc.desc Function of API, path = cache, virtual path The test file is exist. + */ + it('File_writeArrayBuffer_010', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/../cache/File_writeArrayBuffer_010', + buffer: buf, + append: true, + success: function () { + console.log('File_writeArrayBuffer_010 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_010 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/../cache/File_writeArrayBuffer_010', + success: function (data) { + console.log('File_writeArrayBuffer_010 pass'); + done(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_010 readArrayBuffer , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_writeArrayBuffer_1200 + * @tc.name File_writeArrayBuffer_012 + * @tc.desc Function of API, out of package, Virtual path, save the dir authority.The test file is exist. + */ + it('File_writeArrayBuffer_012', 0, async function (done) { + let buf = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://app/../../File_writeArrayBuffer_012', + buffer: buf, + append: true, + success: function () { + console.log('File_writeArrayBuffer_012 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_writeArrayBuffer_012 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0100 + * @tc.name File_readText_001 + * @tc.desc Function of API, readText, app path. + */ + it('File_readText_001', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_readText_001', + text: 'Text that just for test.', + success: function () { + console.log('File_readText_001 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_readText_001', + success: function (data) { + console.log('File_readText_001 call readText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0200 + * @tc.name File_readText_002 + * @tc.desc Function of API, encoding = UTF-8.The test file is exist. + */ + it('File_readText_002', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_readText_002', + text: 'Text that just for test.', + encoding: 'utf-8', + success: function () { + console.log('File_readText_002 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/File_readText_002', + encoding: 'utf-8', + success: function (data) { + console.log('File_readText_002 call readText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0300 + * @tc.name File_readText_003 + * @tc.desc Function of API, error code: 202.The test file and dir is exist. + */ + it('File_readText_003', 0, async function (done) { + file.readText({ + uri: '', + success: function (data) { + console.log(data.text); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_readText_003 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0400 + * @tc.name File_readText_004 + * @tc.desc Function of API, error code: 300.The test dir is exist. + */ + it('File_readText_004', 0, async function (done) { + file.readText({ + uri: 'internal://cache/', + success: function (data) { + console.log(data.text); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_readText_004 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0500 + * @tc.name File_readText_005 + * @tc.desc Function of API, error code: 301.The test file and dir is exist. + */ + it('File_readText_005', 0, async function (done) { + file.readText({ + uri: 'internal://cache/workspace/text.txt', + success: function (data) { + console.log(data.text); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_readText_005 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0600 + * @tc.name File_readText_006 + * @tc.desc Function of API, readText, cache path. + */ + it('File_readText_006', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_readText_006', + text: 'test', + success: function () { + console.log('File_readText_006 call success'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_006 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://cache/File_readText_006', + success: function (data) { + console.log('File_readText_006 call success' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_readText_006 fail'); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_readText_006', + success: function () { + console.log('File_readText_006 call success'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_006 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_readText_0700 + * @tc.name File_readText_007 + * @tc.desc Function of API, virtual path.The test file is exist. + */ + it('File_readText_007', 0, async function (done) { + file.writeText({ + uri: 'internal://app/../files/../files/File_readText_007', + text: 'Text that just for test.', + success: function () { + console.log('File_readText_007 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.log('File_readText_007 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/../files/../files/File_readText_007', + success: function (data) { + console.log('File_readText_007 call readText success. data.text:' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_readText_007 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/../files/../files/File_readText_007' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0100 + * @tc.name File_read_array_buffer_001 + * @tc.desc Function of API, readArrayBuffer, cache path.position = 0, length = 10. + */ + it('File_read_array_buffer_001', 0, async function (done) { + var buffer = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_read_array_buffer_001', + buffer: buffer, + success: function () { + console.log('File_read_array_buffer_001 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_read_array_buffer_001', + position: 0, + length: 10, + success: function (data) { + console.log('File_read_array_buffer_001 pass'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_read_array_buffer_001' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0200 + * @tc.name File_read_array_buffer_002 + * @tc.desc Function of API, readArrayBuffer, + */ + it('File_read_array_buffer_002', 0, async function (done) { + var buffer = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/File_read_array_buffer_002', + buffer: buffer, + success: function () { + console.log('File_read_array_buffer_002 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/File_read_array_buffer_002', + success: function (data) { + console.log('File_read_array_buffer_002 pass'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0300 + * @tc.name File_read_array_buffer_003 + * @tc.desc Function of API, readArrayBuffer, wrong uri. + */ + it('File_read_array_buffer_003', 0, async function (done) { + file.readArrayBuffer({ + uri: '', + success: function (data) { + console.log('File_read_array_buffer_003 call readArrayBuffer success: ' + data.buffer); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_003 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0400 + * @tc.name File_read_array_buffer_004 + * @tc.desc Function of API, readArrayBuffer, wrong position. + */ + it('File_read_array_buffer_004', 0, async function (done) { + let fpath = fileName('File_read_array_buffer_004') + prepareFile(fpath, FILE_CONTENT) + file.readArrayBuffer({ + uri: fpath, + position: 100, + success: function (data) { + console.log('File_read_array_buffer_004 call readArrayBuffer success: ' + data.buffer); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_004 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0500 + * @tc.name File_read_array_buffer_005 + * @tc.desc Function of API, readArrayBuffer, wrong length. + */ + it('File_read_array_buffer_005', 0, async function (done) { + let fpath = fileName('File_read_array_buffer_005') + prepareFile(fpath, FILE_CONTENT) + file.readArrayBuffer({ + uri: fpath, + length: -1, + success: function (data) { + console.log('File_read_array_buffer_005 call readArrayBuffer success: ' + data.buffer); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_005 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0600 + * @tc.name File_read_array_buffer_006 + * @tc.desc Function of API, error code: 202 Set uri is dir path. + */ + it('File_read_array_buffer_006', 0, async function (done) { + file.readArrayBuffer({ + uri: 'internal://app', + success: function (data) { + console.log('File_read_array_buffer_006 call readArrayBuffer success: ' + data.buffer); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_006 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0700 + * @tc.name File_read_array_buffer_007 + * @tc.desc Function of API, error code: 301 + */ + it('File_read_array_buffer_007', 0, async function (done) { + file.readArrayBuffer({ + uri: 'internal://cache/File_read_array_buffer_007', + success: function (data) { + resolve('File_read_array_buffer_007 call readArrayBuffer success: ' + data.buffer); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_007 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0800 + * @tc.name File_read_array_buffer_008 + * @tc.desc Function of API, cache path.The test file is exist. + */ + it('File_read_array_buffer_008', 0, async function (done) { + let buf = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]) + file.writeArrayBuffer({ + uri: 'internal://app/File_read_array_buffer_008', + buffer: buf, + success: function () { + console.log('File_read_array_buffer_008 call success'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.readArrayBuffer({ + uri: 'internal://app/File_read_array_buffer_008', + success: function (data) { + console.log('File_read_array_buffer_008 call success ' + data.buffer); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_008 fail'); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_read_array_buffer_008', + success: function () { + console.log('File_read_array_buffer_008:call success'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_read_array_buffer_0900 + * @tc.name File_read_array_buffer_009 + * @tc.desc Function of API, virtual path.The test file is exist. + */ + it('File_read_array_buffer_009', 0, async function (done) { + var buffer = new Uint8Array([48, 49, 50, 51, 65, 66, 67, 68, 32, 33]); + file.writeArrayBuffer({ + uri: 'internal://cache/../cache/File_read_array_buffer_009', + buffer: buffer, + success: function () { + console.log('File_read_array_buffer_009 call writeArrayBuffer success.'); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_009 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readArrayBuffer({ + uri: 'internal://cache/../cache/File_read_array_buffer_009', + position: 0, + length: 10, + success: function (data) { + console.log('File_read_array_buffer_009 call readArrayBuffer success. data.buffer:' + data.buffer); + done(); + }, + fail: function (data, code) { + console.log('File_read_array_buffer_009 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/../cache/File_read_array_buffer_009' + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0100 + * @tc.name File_access_001 + * @tc.desc Function of API, access, cache path.The test file is exist. + */ + it('File_access_001', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_access_001', + text: 'Text that just for test.', + success: function () { + console.log('File_access_001 call success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_001 fail,code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.access({ + uri: 'internal://cache/File_access_001', + success: function () { + console.log('File_access_001 call access success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_access_001', + success: function () { + console.log('File_access_001 call delete success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0200 + * @tc.name File_access_002 + * @tc.desc Function of API, access, app path.The test file is exist. + */ + it('File_access_002', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/File_access_002', + success: function () { + console.log('File_access_002 call success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_002 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.access({ + uri: 'internal://app/File_access_002', + success: function () { + console.log('File_access_002 call access success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/File_access_002', + success: function () { + console.log('File_access_002 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0300 + * @tc.name File_access_003 + * @tc.desc Function of API, error code: 202 The test file and dir are exist. + */ + it('File_access_003', 0, async function (done) { + let fpath = fileName('File_access_003') + file.access({ + uri: fpath, + success: function () { + console.log('File_access_003 call access success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_access_003 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0400 + * @tc.name File_access_004 + * @tc.desc Function of API, error code: 301 + */ + it('File_access_004', 0, async function (done) { + file.access({ + uri: 'internal://app/File_access_004.txt', + success: function () { + console.log('File_access_004 call access success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_access_004 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0500 + * @tc.name File_access_005 + * @tc.desc Function of API, error code: 301 + */ + it('File_access_005', 0, async function (done) { + file.access({ + uri: 'internal://app/File_access_005', + success: function () { + console.log('File_access_005 call access success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_access_005 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0600 + * @tc.name File_access_006 + * @tc.desc Function of API, parameter more than 4096.The test file and dir are exist. + */ + it('File_access_006', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://cache/' + firstPath; + fileio.mkdirSync(dpath); + for (let i = 0; i < 16; i++) { + console.log('time' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.access({ + uri: uri, + success: function () { + console.log('File_access_006 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_access_006 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + fileio.rmdirSync(dpath); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0700 + * @tc.name File_access_007 + * @tc.desc Function of API, app path.The test file is exist. + */ + it('File_access_007', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_access_007', + text: 'hello', + success: function () { + console.log('File_access_007 mkdir success ') + done(); + }, + fail: function (data, code) { + console.log('File_access_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.access({ + uri: 'internal://app/File_access_007', + success: function () { + console.log('File_access_007 access success'); + done(); + }, + fail: function (data, code) { + console.log('File_access_007 fail'); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_access_007', + success: function () { + console.log('File_access_007 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_access_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_access_0800 + * @tc.name File_access_008 + * @tc.desc Function of API, virtual path.The test file is exist. + */ + it('File_access_008', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/../cache/File_access_008', + text: 'Text that just for test.', + success: function () { + console.log('File_access_008 mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_008 fail,code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.access({ + uri: 'internal://cache/../cache/File_access_008', + success: function () { + console.log('File_access_008 call access success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/../cache/File_access_008', + success: function () { + console.log('File_access_008 call delete success.'); + done(); + }, + fail: function (data, code) { + console.log('File_access_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0100 + * @tc.name File_mkdir_001 + * @tc.desc Function of API, mkdir, app path. + */ + it('File_mkdir_001', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/File_mkdir_001', + success: function () { + console.log('File_mkdir_001 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/File_mkdir_001', + success: function () { + console.log('File_mkdir_001 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0200 + * @tc.name File_mkdir_002 + * @tc.desc Function of API, mkdir, recursive not set value. + */ + it('File_mkdir_002', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/test/File_mkdir_002', + success: function () { + console.log('File_mkdir_002 call mkdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_mkdir_002 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0300 + * @tc.name File_mkdir_003 + * @tc.desc Function of API, mkdir, recursive. + */ + it('File_mkdir_003', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/test/File_mkdir_003d', + recursive: true, + success: function () { + console.log('File_mkdir_003 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0400 + * @tc.name File_mkdir_004 + * @tc.desc Function of API, error code: 202 + */ + it('File_mkdir_004', 0, async function (done) { + file.mkdir({ + uri: 'internal://files/test/File_mkdir_002d', + success: function () { + console.log('File_mkdir_004 call mkdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_mkdir_004, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0500 + * @tc.name File_mkdir_005 + * @tc.desc Function of API, special characters. + */ + it('File_mkdir_005', 0, async function (done) { + file.mkdir({ + uri: 'internal://cache/!@/<>', + success: function () { + console.log('File_mkdir_005 mkdir success'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_mkdir_005 fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0600 + * @tc.name File_mkdir_006 + * @tc.desc Function of API, parameter too long. + */ + it('File_mkdir_006', 0, async function (done) { + let fileName = randomString(257); + file.mkdir({ + uri: 'internal://cache/' + fileName, + success: function () { + console.log('File_mkdir_006 mkdir success'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_mkdir_006 =>fail ,code:' + code + ',data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0700 + * @tc.name File_mkdir_007 + * @tc.desc Function of API, cache path. + */ + it('File_mkdir_007', 0, async function (done) { + file.mkdir({ + uri: 'internal://cache/File_mkdir_007d', + success: function () { + console.log('File_mkdir_007 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://cache/File_mkdir_007d', + success: function () { + console.log('File_mkdir_007 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_0800 + * @tc.name File_mkdir_008 + * @tc.desc Function of API, virtual path. + */ + it('File_mkdir_008', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/../files/File_mkdir_008', + success: function () { + console.log('File_mkdir_008 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/../files/File_mkdir_008', + success: function () { + console.log('File_mkdir_008 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_mkdir_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_mkdir_1000 + * @tc.name File_mkdir_010 + * @tc.desc Function of API, out of package, out of package, Virtual path, save the dir authority. + */ + it('File_mkdir_010', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/../../File_mkdir_010', + success: function () { + console.log('File_mkdir_010 call mkdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_mkdir_010 call mkdir callback fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0100 + * @tc.name File_rmdir_001 + * @tc.desc Function of API, rmdir, app path.The test dir is exist, and it can be delete, the dir is empty. + */ + it('File_rmdir_001', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/File_rmdir_001', + success: function () { + console.log('File_rmdir_001 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_001 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/File_rmdir_001', + success: function () { + console.log('File_rmdir_001 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_001 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0200 + * @tc.name File_rmdir_002 + * @tc.desc Function of API, recursive not set value.The test dir is exist, and it not empty. + */ + it('File_rmdir_002', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/test/File_rmdir_002', + recursive: true, + success: function () { + console.log('File_rmdir_002 mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_002 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/test', + recursive: false, + success: function () { + console.log('File_rmdir_002 call rmdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_rmdir_002 fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0300 + * @tc.name File_rmdir_003 + * @tc.desc Function of API, recursive = ture.The test dir is exist, and it not empty. + */ + it('File_rmdir_003', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/test/File_rmdir_003', + recursive: true, + success: function () { + console.log('File_rmdir_003 mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_003 fail'); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/test', + recursive: true, + success: function () { + console.log('File_rmdir_003 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0400 + * @tc.name File_rmdir_004 + * @tc.desc Function of API, error code: 202 + */ + it('File_rmdir_004', 0, async function (done) { + file.rmdir({ + uri: '/data/accounts/account_0/appdata/ohos.acts.distributeddatamgr.distributedfile/cache/', + success: function () { + console.log('File_rmdir_004 call rmdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_rmdir_004 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0500 + * @tc.name File_rmdir_005 + * @tc.desc Function of API, error code: 301 + */ + it('File_rmdir_005', 0, async function (done) { + file.rmdir({ + uri: 'internal://app/test/123', + success: function () { + console.log('File_rmdir_005 call rmdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_rmdir_005 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0600 + * @tc.name File_rmdir_006 + * @tc.desc Function of API, too long path. + */ + it('File_rmdir_006', 0, async function (done) { + let firstPath = randomString(255); + let uri = 'internal://app/' + firstPath; + file.mkdir({ + uri: uri, + success: function () { + console.log('File_rmdir_006 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_006 fail'); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: uri, + success: function () { + console.log('File_rmdir_006 => rmdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_006 => fail'); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0700 + * @tc.name File_rmdir_007 + * @tc.desc Function of API, cache path.The test dir is exist, and it can be delete, it is empty. + */ + it('File_rmdir_007', 0, async function (done) { + file.mkdir({ + uri: 'internal://cache/File_rmdir_007d', + success: function () { + console.log('File_rmdir_007 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://cache/File_rmdir_007d', + success: function () { + console.log('File_rmdir_007 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_007 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_0800 + * @tc.name File_rmdir_008 + * @tc.desc Function of API, virtual path.The test dir is exist. + */ + it('File_rmdir_008', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/../files/File_rmdir_008', + success: function () { + console.log('File_rmdir_008 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.rmdir({ + uri: 'internal://app/../files/File_rmdir_008', + success: function () { + console.log('File_rmdir_008 call rmdir success.'); + done(); + }, + fail: function (data, code) { + console.log('File_rmdir_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_rmdir_1000 + * @tc.name File_rmdir_010 + * @tc.desc Function of API, out of package, Virtual path, save the dir authority.The test dir is exist. + */ + it('File_rmdir_010', 0, async function (done) { + file.rmdir({ + uri: 'internal://app/../../com.ohos.systemui', + success: function () { + console.log('File_rmdir_010 call rmdir success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_rmdir_010 call rmdir callback fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0100 + * @tc.name File_Move_001 + * @tc.desc Function of API, move.The test file is exist. + */ + it('File_Move_001', 0, async function (done) { + file.writeText({ + uri: 'internal://app/File_Move_001', + text: 'Text that just for test.', + success: function () { + console.log('File_Move_001 call writeText success.'); + done(); + }, + fail: function (data, code) { + console.error('File_Move_001 call writeText fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.move({ + srcUri: 'internal://app/File_Move_001', + dstUri: 'internal://app/File_Move_001_1', + success: function (data) { + console.log('File_Move_001 call writeText success. data:' + data); + done(); + }, + fail: function (data, code) { + console.log('File_Move_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0200 + * @tc.name File_Move_002 + * @tc.desc Function of API, document integrity.The test file is exist. + */ + it('File_Move_002', 0, async function (done) { + let typeArray = new Array('.txt', '.ppt', '.flac', '.mp4', '.so', '.zip'); + let dpath = fileName('cache'); + fileio.mkdirSync(dpath); + for (let i = 0; i < typeArray.length; i++) { + let srcFpath = fileName('File_Move_002') + typeArray[i]; + let dstFpath = cacheFileName('File_Move_002') + typeArray[i]; + expect(prepareEmptyFile(srcFpath) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/File_Move_002' + typeArray[i], + dstUri: 'internal://app/cache/File_Move_002' + typeArray[i], + success: function (uri) { + console.log('File_Move_002 call move success. uri: ' + uri); + done(); + }, + fail: function (data, code) { + console.log('File_Move_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + } + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0300 + * @tc.name File_Move_003 + * @tc.desc Function of API, different size file.The test file is exist. + */ + it('File_Move_003', 0, async function (done) { + let srcFpath = fileName('File_Move_003'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + let dstFpath = cacheFileName('File_Move_003'); + let srcUri = 'internal://app/File_Move_003' + let dstUri = 'internal://app/cache/File_Move_003' + file.move({ + srcUri: srcUri, + dstUri: dstUri, + success: function () { + console.log('File_Move_003 call move success.'); + done(); + }, + fail: function (data, code) { + console.log('File_Move_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0400 + * @tc.name File_Move_004 + * @tc.desc Function of API, error code: 202.The test file is exist. + */ + it('File_Move_004', 0, async function (done) { + let srcFpath = fileName('File_Move_004'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/File_Move_004', + dstUri: null, + success: function () { + console.log('File_Move_004 call move success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_004 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0500 + * @tc.name File_Move_005 + * @tc.desc Function of API, error code: 300.The test file is exist. + */ + it('File_Move_005', 0, async function (done) { + let srcDpath = fileName('File_Move_005d') + expect(fileio.mkdirSync(srcDpath) !== null).assertTrue() + file.move({ + srcUri: 'internal://app/File_Move_005d', + dstUri: 'internal://app/cache/File_Move_005d', + success: function () { + console.log('File_Move_005 call move success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_005 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0600 + * @tc.name File_Move_006 + * @tc.desc Function of API, error code: 301.The test file is not exist. + */ + it('File_Move_006', 0, async function (done) { + let dstUri = fileName('File_Move_006'); + expect(prepareFile(dstUri, FILE_CONTENT) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/File_Move', + dstUri: 'internal://app/File_Move_006', + success: function () { + console.log('File_Move_006 call move success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_006 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0700 + * @tc.name File_Move_007 + * @tc.desc Function of API, uri more too long. + */ + it('File_Move_007', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://app/' + firstPath; + fileio.mkdirSync(dpath); + for (let i = 0; i < 16; i++) { + console.log('time' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.move({ + srcUri: uri, + dstUri: 'internal://cache/File_Move_007', + success: function () { + console.log('File_Move_007 => move success'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_007 => move fail'); + expect(code == 300).assertTrue(); + done(); + }, + }); + fileio.rmdirSync(dpath); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0800 + * @tc.name File_Move_008 + * @tc.desc Function of API, cache path.The test file is exist. + */ + it('File_Move_008', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_Move_008', + text: 'sss', + success: function () { + console.log('File_Move_008 mkdir success '); + done(); + }, + fail: function (data, code) { + console.log('File_Move_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.move({ + srcUri: 'internal://cache/File_Move_008', + dstUri: 'internal://app/File_Move_008', + success: function (uri) { + console.log('File_Move_008 => pass, uri:' + uri); + done(); + }, + fail: function (data, code) { + console.log('File_Move_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_Move_008', + success: function () { + console.log('File_Move_008 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Move_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_0900 + * @tc.name File_Move_009 + * @tc.desc Function of API, same path. + */ + it('File_Move_009', 0, async function (done) { + let srcFpath = fileName('File_Move_009'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/File_Move_009', + dstUri: 'internal://app/File_Move_009', + success: function (data) { + console.log('File_Move_009 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_009 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_1000 + * @tc.name File_Move_010 + * @tc.desc Function of API, dstFpath has same file. + */ + it('File_Move_010', 0, async function (done) { + let srcFpath = fileName('File_Move_010'); + let dstFpath = cacheFileName('File_Move_010'); + expect(prepareFile(srcFpath, 'aaa') !== null).assertTrue(); + expect(prepareFile(dstFpath, 'bbb') !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/File_Move_010', + dstUri: 'internal://app/cache/File_Move_010', + success: function (data) { + console.log('File_Move_010 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_010 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_1100 + * @tc.name File_Move_011 + * @tc.desc Function of API, move app path file to cache path. + */ + it('File_Move_011', 0, async function (done) { + let srcFpath = fileName('File_Move_011'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/../files/File_Move_011', + dstUri: 'internal://app/cache/../../cache/File_Move_011', + success: function (uri) { + console.log('File_Move_011 => pass, uri' + uri); + done() + }, + fail: function (data, code) { + console.log('File_Move_011 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_1200 + * @tc.name File_Move_012 + * @tc.desc Function of API, out of package, Virtual path(create and give 777 authority). + */ + it('File_Move_012', 0, async function (done) { + let srcFpath = fileName('File_Move_012'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.move({ + srcUri: 'internal://app/../files/File_Move_012', + dstUri: 'internal://app/../../File_Move_012', + success: function (uri) { + console.log('File_Move_012 => pass, uri' + uri); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Move_012 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Move_1400 + * @tc.name File_Move_014 + * @tc.desc Function of API, check back value. + */ + it('File_Move_014', 0, async function (done) { + let srcFpath = fileName('File_Move_014'); + let dstFpath = cacheFileName('File_Move_014'); + expect(prepareFile(srcFpath, 'test') !== null).assertTrue(); + let dstUri = 'internal://app/cache/../../cache/File_Move_014'; + file.move({ + srcUri: 'internal://app/../files/File_Move_014', + dstUri: dstUri, + success: function (uri) { + console.log('File_Move_014 move pass'); + done(); + }, + fail: function (data, code) { + console.log('File_Move_014 => fail , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0100 + * @tc.name File_Copy_001 + * @tc.desc Function of API, copy, app path.The test file is exist. + */ + it('File_Copy_001', 0, async function (done) { + let srcFpath = fileName('File_Copy_001'); + let dstFpath = cacheFileName('File_Copy_001'); + expect(prepareFile(srcFpath, 'test.') !== null).assertTrue(); + sleep(10); + file.copy({ + srcUri: 'internal://app/File_Copy_001', + dstUri: 'internal://app/cache/File_Copy_001', + success: function () { + console.log('File_Copy_001 call copy success.'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/cache/File_Copy_001', + success: function (data) { + console.log('File_Copy_001 read success:' + data.text); + expect(fileio.unlinkSync(srcFpath) !== null).assertTrue(); + expect(fileio.unlinkSync(dstFpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_001 call readText callback fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0200 + * @tc.name File_Copy_002 + * @tc.desc Function of API, document integrity.The test file is exist. + */ + it('File_Copy_002', 0, async function (done) { + let typeArray = new Array('.txt', '.ppt', '.flac', '.mp4', '.so', '.zip'); + for (let i = 0; i < typeArray.length; i++) { + let srcFpath = fileName('File_Copy_002') + typeArray[i]; + let dstFpath = cacheFileName('File_Copy_002') + typeArray[i]; + expect(prepareEmptyFile(srcFpath) !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/File_Copy_002' + typeArray[i], + dstUri: 'internal://app/cache/File_Copy_002' + typeArray[i], + success: function () { + console.log('File_Copy_002 call copy success.'); + expect(fileio.unlinkSync(srcFpath) !== null).assertTrue(); + expect(fileio.unlinkSync(dstFpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + } + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0300 + * @tc.name File_Copy_003 + * @tc.desc Function of API, different size of files. The test file is exist. + */ + it('File_Copy_003', 0, async function (done) { + let srcFpath = fileName('File_Copy_003'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + let dstFpath = cacheFileName('File_Copy_003'); + file.copy({ + srcUri: 'internal://app/File_Copy_003', + dstUri: 'internal://app/cache/File_Copy_003', + success: function () { + console.log('File_Copy_003 call copy success.'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/cache/File_Copy_003', + success: function (data) { + console.log('File_Copy_003 readText success, data.text:' + data.text); + expect(fileio.unlinkSync(srcFpath) !== null).assertTrue(); + expect(fileio.unlinkSync(dstFpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_003 call readText callback fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0400 + * @tc.name File_Copy_004 + * @tc.desc Function of API, error code: 202 The test file is exist. + */ + it('File_Copy_004', 0, async function (done) { + let srcFpath = fileName('File_Copy_004'); + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/File_Copy_004', + dstUri: null, + success: function () { + console.log('File_Copy_004 call copy success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_004 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + expect(fileio.unlinkSync(srcFpath) !== null).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0500 + * @tc.name File_Copy_005 + * @tc.desc Function of API, error code: 300 + */ + + it('File_Copy_005', 0, async function (done) { + file.mkdir({ + uri: 'internal://app/File_Copy_005d', + success: function () { + console.log('File_Copy_005 call mkdir success.'); + done(); + }, + fail: function (data, code) { + console.error('File_Copy_005 call mkdir fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.copy({ + srcUri: 'internal://app/File_Copy_005d', + dstUri: 'internal://app/File_Copy_005d_1', + success: function () { + console.log('File_Copy_005 call copy success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_005 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0600 + * @tc.name File_Copy_006 + * @tc.desc Function of API, error code: 301 + */ + it('File_Copy_006', 0, async function (done) { + file.copy({ + srcUri: 'internal://app/fakepath', + dstUri: 'internal://app/fakepath1', + success: function () { + console.log('File_Copy_006 call copy success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_006 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0700 + * @tc.name File_Copy_007 + * @tc.desc Function of API, uri too long. + */ + it('File_Copy_007', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://cache/' + firstPath; + fileio.mkdirSync(dpath); + for (let i = 0; i < 16; i++) { + console.log('time' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.copy({ + srcUri: uri, + dstUri: uri, + success: function () { + console.log('File_Copy_007 => copy success'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_007 => fail, code: ' + code + ', data: ' + data); + fileio.rmdirSync(dpath); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0800 + * @tc.name File_Copy_008 + * @tc.desc Function of API, cache path. + */ + it('File_Copy_008', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_Copy_008', + text: 'test', + success: function () { + console.log('File_Copy_008 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.copy({ + srcUri: 'internal://cache/File_Copy_008', + dstUri: 'internal://app/File_Copy_008', + success: function () { + console.log('File_Copy_008 move success'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_008 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://app/File_Copy_008', + success: function () { + console.log('File_Copy_008 delete success '); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.delete({ + uri: 'internal://cache/File_Copy_008', + success: function () { + console.log('File_Copy_008 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_008 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_0900 + * @tc.name File_Copy_009 + * @tc.desc Function of API, same path. + */ + it('File_Copy_009', 0, async function (done) { + let srcFpath = fileName('File_Copy_009') + expect(prepareFile(srcFpath, FILE_CONTENT) !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/File_Copy_009', + dstUri: 'internal://app/File_Copy_009', + success: function (data) { + console.log('File_Copy_009 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_009 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + fileio.unlinkSync(srcFpath); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_1000 + * @tc.name File_Copy_010 + * @tc.desc Function of API, dstFpath path has same file. + */ + it('File_Copy_010', 0, async function (done) { + let srcFpath = fileName('File_Copy_010'); + let dstFpath = cacheFileName('File_Copy_010'); + expect(prepareFile(srcFpath, 'aaa') !== null).assertTrue(); + expect(prepareFile(dstFpath, 'bbb') !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/File_Copy_010', + dstUri: 'internal://app/cache/File_Copy_010', + success: function (data) { + console.log('File_Copy_010 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_010 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + fileio.unlinkSync(srcFpath); + fileio.unlinkSync(dstFpath); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_1100 + * @tc.name File_Copy_011 + * @tc.desc Function of API, copy file to cache path.The test file is exist. + */ + it('File_Copy_011', 0, async function (done) { + let srcFpath = fileName('File_Copy_011'); + expect(prepareFile(srcFpath, 'test.') !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/../files/File_Copy_011', + dstUri: 'internal://app/cache/../../cache/File_Copy_011', + success: function () { + console.log('File_Copy_011 copy pass'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_011 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.readText({ + uri: 'internal://app/cache/../../cache/File_Copy_011', + success: function (data) { + console.log('File_Copy_011 read success:' + data.text); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_011 call readText callback fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_1200 + * @tc.name File_Copy_012 + * @tc.desc Function of API, out of package, Virtual path(create and give 777 authority).The test file is exist. + */ + it('File_Copy_012', 0, async function (done) { + let srcFpath = fileName('File_Copy_012'); + expect(prepareFile(srcFpath, 'test') !== null).assertTrue(); + file.copy({ + srcUri: 'internal://app/../files/File_Copy_012', + dstUri: 'internal://app/../../File_Move_012', + success: function () { + console.log('File_Copy_012 copy pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Copy_012 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + expect(fileio.unlinkSync(srcFpath) !== null).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Copy_1400 + * @tc.name File_Copy_014 + * @tc.desc Function of API, check back value.The test file is exist. + */ + + it('File_Copy_014', 0, async function (done) { + let srcFpath = fileName('File_Copy_014'); + let dstFpath = cacheFileName('File_Copy_014'); + expect(prepareFile(srcFpath, 'test') !== null).assertTrue(); + let dstUri = 'internal://app/cache/../../cache/File_Copy_014'; + file.copy({ + srcUri: 'internal://app/../files/File_Copy_014', + dstUri: dstUri, + success: function (uri) { + console.log('File_Copy_014 copy pass'); + done(); + }, + fail: function (data, code) { + console.log('File_Copy_014 => fail , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0100 + * @tc.name File_List_001 + * @tc.desc Function of API, list.The test file and dir are exist. + */ + it('File_List_001', 0, async function (done) { + let dpath = fileName('File_List_001') + 'd'; + let fpath = dpath + '/File_List_001'; + let ddpath = dpath + '/File_List_001_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_001d', + success: function (data) { + console.log('File_List_001 call list success.' + JSON.stringify(data.fileList)) + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_001 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0200 + * @tc.name File_List_002 + * @tc.desc Function of API, set value of uri.The test file and dir are exist. + */ + it('File_List_002', 0, async function (done) { + let dpath = fileName('File_List_002') + 'd'; + let fpath = dpath + '/File_List_002'; + let ddpath = dpath + '/File_List_002_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_002d', + success: function (data) { + console.log('File_List_002 call list success.' + JSON.stringify(data.fileList)); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_002 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0300 + * @tc.name File_List_003 + * @tc.desc Function of API, check lastModifiedTime.The test file and dir are exist. + */ + it('File_List_003', 0, async function (done) { + let dpath = fileName('File_List_003') + 'd'; + let fpath = dpath + '/File_List_003'; + let ddpath = dpath + '/File_List_003_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_003d', + success: function (data) { + console.log('File_List_003 call list success.' + JSON.stringify(data.fileList)); + done(); + }, + fail: function (data, code) { + console.log('File_List_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + + file.writeText({ + uri: 'internal://app/File_List_003d/File_List_003', + text: '1', + success: function (data) { + console.log('File_List_003 call write success.'); + done(); + } + }); + file.list({ + uri: 'internal://app/File_List_003d', + success: function (data) { + console.log('File_List_003 call list success.' + JSON.stringify(data.fileList)); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_003 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0400 + * @tc.name File_List_004 + * @tc.desc Function of API, check length.The test file and dir are exist. + */ + it('File_List_004', 0, async function (done) { + let dpath = fileName('File_List_004') + 'd'; + let fpath = dpath + '/File_List_004'; + let ddpath = dpath + '/File_List_004_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_004d', + success: function (data) { + console.log('File_List_004 call list success.'); + done(); + }, + fail: function (data, code) { + console.log('File_List_004 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0500 + * @tc.name File_List_005 + * @tc.desc Function of API, check type.The test file and dir are exist. + */ + it('File_List_005', 0, async function (done) { + let dpath = fileName('File_List_005') + 'd'; + let fpath = dpath + '/File_List_005'; + let ddpath = dpath + '/File_List_005_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_005d', + success: function (data) { + console.log('File_List_005 call list success.'); + done(); + }, + fail: function (data, code) { + console.log('File_List_005 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0600 + * @tc.name File_List_006 + * @tc.desc Function of API, error code:202 + */ + it('File_List_006', 0, async function (done) { + let dpath = fileName('File_List_006') + 'd' + file.list({ + uri: dpath, + success: function (data) { + console.log('File_List_006 call list success.' + data.fileList); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_List_006 , code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0700 + * @tc.name File_List_007 + * @tc.desc Function of API, uri set value of file. + */ + it('File_List_007', 0, async function (done) { + let fpath = fileName('File_List_007'); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/File_List_007', + success: function (data) { + console.log('File_List_007 pass, data.fileList:' + JSON.stringify(data.fileList)); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_007 , code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0800 + * @tc.name File_List_008 + * @tc.desc Function of API, error code: 301 + */ + it('File_List_008', 0, async function (done) { + file.list({ + uri: 'internal://app/fakepath', + success: function (data) { + console.log('File_List_008 call list success.' + JSON.stringify(data.fileList)); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_List_008 , code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_0900 + * @tc.name File_List_009 + * @tc.desc Function of API, uri too long. + */ + it('File_List_009', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://app/' + firstPath; + fileio.mkdirSync(dpath); + for (let i = 0; i < 16; i++) { + console.log('time' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.list({ + uri: uri, + success: function (data) { + console.log('File_List_009 => pass' + data); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_List_009 , code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + fileio.rmdirSync(dpath); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_1000 + * @tc.name File_List_010 + * @tc.desc Function of API, cache path.The test file and dir are exist. + */ + it('File_List_010', 0, async function (done) { + let dpath = nextFileName('File_List_010d'); + let fpath = dpath + '/File_List_010'; + let ffpath = dpath + '/File_List_010_1'; + let ddpath = dpath + '/File_List_010_1d'; + let fffpath = ddpath + '/File_List_010_2'; + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(ffpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(fffpath, FILE_CONTENT) !== null).assertTrue(); + } catch (e) { + console.log("File_List_010 has failed for " + e) + expect(null).assertFail(); + } + file.list({ + uri: 'internal://cache/File_List_010d', + success: function (data) { + console.log('File_List_010 => pass' + JSON.stringify(data.fileList)); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.unlinkSync(ffpath) !== null).assertTrue(); + expect(fileio.unlinkSync(fffpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_010 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_1100 + * @tc.name File_List_011 + * @tc.desc Function of API, virtual path.The test dir are exist. + */ + it('File_List_011', 0, async function (done) { + let dpath = fileName('File_List_011') + 'd'; + let fpath = dpath + '/File_List_011'; + let ddpath = dpath + '/File_List_011_1d'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.list({ + uri: 'internal://app/../files/File_List_011d', + success: function (data) { + console.log('File_List_011 call list success.' + JSON.stringify(data.fileList)); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_List_011 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_List_1200 + * @tc.name Function of API, out of package, Virtual path(create and give 777 authority). + * @tc.desc The test dir are exist. + */ + it('File_List_012', 0, async function (done) { + file.list({ + uri: 'internal://app/../files/../../', + success: function (data) { + console.log('File_List_012 call list success.' + JSON.stringify(data.fileList)); + done(); + }, + fail: function (data, code) { + console.log('File_List_012 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0100 + * @tc.name File_Get_001 + * @tc.desc Function of API, Get.The test file is exist. + */ + it('File_Get_001', 0, async function (done) { + let fpath = fileName('File_Get_001'); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_001', + recursive: true, + success: function (data) { + console.log('File_Get_001 pass,data.uri:' + data.uri); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_001 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0200 + * @tc.name File_Get_002 + * @tc.desc Function of API, recursive = false.The test file is exist. + */ + it('File_Get_002', 0, async function (done) { + let fpath = fileName('File_Get_002'); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_002', + recursive: false, + success: function (data) { + console.log('File_Get_002 => file list:'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_002 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0300 + * @tc.name File_Get_003 + * @tc.desc Function of API, not input recursive.The test file is exist. + */ + it('File_Get_003', 0, async function (done) { + let fpath = fileName('File_Get_003'); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_003', + success: function (data) { + console.log('File_Get_003 => file list:'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_003 => pass'); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_003 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0400 + * @tc.name File_Get_004 + * @tc.desc Function of API, recursive = ture.The test file is exist. + */ + it('File_Get_004', 0, async function (done) { + let dpath = fileName('File_Get_004d') + let ddpath = dpath + '/File_Get_004dd' + let fpath = dpath + '/File_Get_004f' + let ffpath = ddpath + '/File_Get_004ff' + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(ffpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_004d', + recursive: true, + success: function (data) { + console.log('File_Get_004 => file list:'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_004 => pass'); + expect(fileio.unlinkSync(ffpath) !== null).assertTrue(); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_004 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0500 + * @tc.name File_Get_005 + * @tc.desc Function of API, recursive = false.The test file is exist. + */ + it('File_Get_005', 0, async function (done) { + let dpath = fileName('File_Get_005d'); + let ddpath = dpath + '/File_Get_005dd'; + let fpath = dpath + '/File_Get_005f'; + let ffpath = ddpath + '/File_Get_005ff'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(ffpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_005d', + recursive: false, + success: function (data) { + console.log('File_Get_005 => file list :'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_005 => pass'); + expect(fileio.unlinkSync(ffpath) !== null).assertTrue(); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_005 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0600 + * @tc.name File_Get_006 + * @tc.desc Function of API, not input recursive.The test file is exist. + */ + it('File_Get_006', 0, async function (done) { + let dpath = fileName('File_Get_006d'); + let ddpath = dpath + '/File_Get_006dd'; + let fpath = dpath + '/File_Get_006f'; + let ffpath = ddpath + '/File_Get_006ff'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(ffpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/File_Get_006d', + success: function (data) { + console.log('File_Get_006 file list:'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_006 => pass'); + expect(fileio.unlinkSync(ffpath) !== null).assertTrue(); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_006 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0700 + * @tc.name File_Get_007 + * @tc.desc Function of API, not input uri.The test file is exist. + */ + it('File_Get_007', 0, async function (done) { + file.get({ + recursive: true, + success: function (data) { + console.log('File_Get_007 call Copy success.') + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Get_007 fail, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0800 + * @tc.name File_Get_008 + * @tc.desc Function of API, not input parameter.The test file is exist. + */ + it('File_Get_008', 0, async function (done) { + file.get({ + success: function (data) { + console.log(data); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Get_008 fail, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_0900 + * @tc.name File_Get_009 + * @tc.desc Function of API, error parameter.The test file and dir are not exist. + */ + it('File_Get_009', 0, async function (done) { + file.get({ + uri: 'internal://app/File_Get_009', + success: function (data) { + console.log('File_Get_009 call Copy success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Get_009 fail, code: ' + code + ', data: ' + data); + expect(code == 301).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_1000 + * @tc.name File_Get_010 + * @tc.desc Function of API, uri = -1. + */ + it('File_Get_010', 0, async function (done) { + file.get({ + uri: -1, + success: function (data) { + console.log('File_Get_010 call Copy success.'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Get_010 fail, code: ' + code + ', data: ' + data); + expect(code == 202).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_1100 + * @tc.name File_Get_011 + * @tc.desc Function of API, cacahe path. + */ + it('File_Get_011', 0, async function (done) { + file.writeText({ + uri: 'internal://cache/File_Get_011', + text: 'test', + success: function () { + console.log('File_Get_011 mkdir success'); + done(); + }, + fail: function (data, code) { + console.log('File_Get_011 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + file.get({ + uri: 'internal://cache/File_Get_011', + recursive: true, + success: function (data) { + console.log('file list'); + console.log('uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles); + done(); + }, + fail: function (data, code) { + console.log('File_Get_011 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + file.delete({ + uri: 'internal://cache/File_Get_011', + success: function () { + console.log('File_Get_011 delete success'); + done(); + }, + fail: function (data, code) { + console.log('File_Get_011 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }) + }) + + /** + * @tc.number SUB_STORAGE_File_Get_1200 + * @tc.name File_Get_012 + * @tc.desc Function of API, uri too long. + */ + it('File_Get_012', 0, async function (done) { + let firstPath = randomString(32); + let dpath = fileName(firstPath); + let uri = 'internal://cache/' + firstPath; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + for (let i = 0; i < 16; i++) { + console.log('time' + i); + let sonPath = randomString(251); + uri = uri + '/f' + sonPath; + } + file.get({ + uri: uri, + recursive: true, + success: function (data) { + console.log('file list'); + console.log('uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles); + console.log('File_Get_012 => pass'); + expect(null).assertFail(); + }, + fail: function (data, code) { + console.log('File_Get_012 fail, code: ' + code + ', data: ' + data); + expect(code == 300).assertTrue(); + done(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_1300 + * @tc.name File_Get_013 + * @tc.desc Function of API, virtual path. + */ + it('File_Get_013', 0, async function (done) { + let dpath = fileName('File_Get_013d'); + let ddpath = dpath + '/File_Get_013dd'; + let fpath = dpath + '/File_Get_013f'; + let ffpath = ddpath + '/File_Get_013ff'; + expect(fileio.mkdirSync(dpath) !== null).assertTrue(); + expect(fileio.mkdirSync(ddpath) !== null).assertTrue(); + expect(prepareFile(fpath, FILE_CONTENT) !== null).assertTrue(); + expect(prepareFile(ffpath, FILE_CONTENT) !== null).assertTrue(); + file.get({ + uri: 'internal://app/../files/File_Get_013d', + recursive: true, + success: function (data) { + console.log('File_Get_013 => file list:'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_013 => pass'); + expect(fileio.unlinkSync(ffpath) !== null).assertTrue(); + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + expect(fileio.rmdirSync(ddpath) !== null).assertTrue(); + expect(fileio.rmdirSync(dpath) !== null).assertTrue(); + done(); + }, + fail: function (data, code) { + console.log('File_Get_013 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) + + /** + * @tc.number SUB_STORAGE_File_Get_1400 + * @tc.name File_Get_014 + * @tc.desc Function of API, out of package, Virtual path, save the dir authority. + */ + it('File_Get_014', 0, async function (done) { + file.get({ + uri: 'internal://app/../files/../../', + success: function (data) { + console.log('File_Get_014 => file list :'); + console.log('{uri:' + data.uri); + console.log('length:' + data.length); + console.log('lastModifiedTime:' + data.lastModifiedTime); + console.log('type:' + data.type); + console.log('subFiles:' + data.subFiles + '}'); + console.log('File_Get_014 => pass'); + done(); + }, + fail: function (data, code) { + console.log('File_Get_014 fail, code: ' + code + ', data: ' + data); + expect(null).assertFail(); + }, + }); + }) +}) \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/FileIO.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIO.test.js new file mode 100644 index 000000000..3e0d8164e --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIO.test.js @@ -0,0 +1,2006 @@ +/* + * 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 fileio from '@ohos.fileio'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { + FILE_CONTENT, prepareFile, nextFileName, prepareEmptyFile, differentFileName, randomString, fileName +} from './Common' + +describe('fileIOTest', function () { + + /** + * @tc.number SUB_STORAGE_FileIO_open&closesync_0000 + * @tc.name fileio_test_open_close_sync_000 + * @tc.desc Function of API, openSync. The test file is exist. + */ + it('fileio_test_open_close_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_open_close_sync_000') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_close_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0000 + * @tc.name fileio_test_open_000 + * @tc.desc Function of API, openSync(mode not for value). The test file is exist. + */ + it('fileio_test_open_000', 0, function () { + let fpath = nextFileName('fileio_test_open_000') + prepareFile(fpath, FILE_CONTENT) + try { + let fd = fileio.openSync(fpath, 0o202) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0100 + * @tc.name fileio_test_open_sync_001 + * @tc.desc Function of API, openSync(flags=0o200). The test file is exist. + */ + it('fileio_test_open_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_open_sync_001') + prepareFile(fpath, FILE_CONTENT) + try { + let fd = fileio.openSync(fpath, 0o200) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0200 + * @tc.name fileio_test_open_sync_002 + * @tc.desc Function of API, openSync(flags=0o201). The test file is exist. + */ + it('fileio_test_open_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_open_sync_002') + prepareFile(fpath, FILE_CONTENT) + try { + let fd = fileio.openSync(fpath, 0o201) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0300 + * @tc.name fileio_test_open_sync_003 + * @tc.desc Function of API, openSync(flags=0o202). The test file is exist. + */ + it('fileio_test_open_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_open_sync_003') + prepareFile(fpath, FILE_CONTENT) + try { + let fd = fileio.openSync(fpath, 0o202) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0400 + * @tc.name fileio_test_open_sync_004 + * @tc.desc Function of API, openSync(flags=0o102, mode=0o777). The test file is not exist. + */ + it('fileio_test_open_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_open_sync_004') + try { + let fd = fileio.openSync(fpath, 0o102, 0o777) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0500 + * @tc.name fileio_test_open_sync_005 + * @tc.desc Function of API, openSync(flags not for value, mode not for value). + */ + it('fileio_test_open_sync_005', 0, function () { + let dpath = nextFileName('fileio_test_open_sync_005') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let fd = fileio.openSync(dpath) + expect(fd !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_open_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0600 + * @tc.name fileio_test_open_sync_006 + * @tc.desc Function of API, openSync(flags=0o1, illegal parameter). + */ + it('fileio_test_open_sync_006', 0, function () { + let dpath = nextFileName('fileio_test_open_sync_006') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + fileio.openSync(dpath, 0o1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_open_sync_006 has failed for " + e) + fileio.rmdirSync(dpath) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0700 + * @tc.name fileio_test_open_sync_007 + * @tc.desc Function of API, openSync(fpath too long). + */ + it('fileio_test_open_sync_007', 0, function () { + let dpath = nextFileName("fileio_open1") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 16; i++) { + if (i == 15) { + let fpath = dpath + "/f" + randomString(248) + fileio.openSync(fpath, 0o102, 0o777) + } else { + dpath = dpath + "/d" + randomString(248) + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_open_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0800 + * @tc.name fileio_test_open_sync_008 + * @tc.desc Function of API, openSync(filename too long). + */ + it('fileio_test_open_sync_008', 0, function () { + let fpath = nextFileName(randomString(256)) + try { + fileio.openSync(fpath, 0o102, 0o777) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_open_sync_008 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_0900 + * @tc.name fileio_test_open_sync_009 + * @tc.desc Function of API, openSync(dir layers too long). + */ + it('fileio_test_open_sync_009', 0, function () { + let dpath = nextFileName("prop1") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 113; i++) { + if (i == 112) { + let fpath = dpath + "/f" + i + fileio.openSync(fpath, 0o102, 0o777) + } else { + dpath = dpath + "/" + i + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_open_sync_009 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_1000 + * @tc.name fileio_test_open_sync_010 + * @tc.desc Function of API, openSync(filename has special characters). + */ + it('fileio_test_open_sync_010', 0, function () { + let fpath = nextFileName("?*:<>/|") + try { + fileio.openSync(fpath, 0o102, 0o777) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_open_sync_010 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_CloseSync_0000 + * @tc.name fileio_test_close_sync_000 + * @tc.desc Function of API, close. The test file is not exist. + */ + it('fileio_test_close_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_chmod_sync_000') + try { + fileio.closeSync(fpath) + expect(null).assertFail() + + } catch (e) { + console.log("fileio_test_close_sync_000 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_CloseSync_0100 + * @tc.name fileio_test_close_sync_001 + * @tc.desc Function of API, close(fpath=vaild value). The test file is not exist. + */ + it('fileio_test_close_sync_001', 0, function () { + try { + fileio.closeSync(-1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_close_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0000 + * @tc.name fileio_test_access_sync_000 + * @tc.desc Function of API,access. The test file is exist. + */ + it('fileio_test_access_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_access_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.accessSync(fpath) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_access_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0100 + * @tc.name fileio_test_access_sync_001 + * @tc.desc Function of API, launch via fileio. The test file is not exist. + */ + it('fileio_test_access_sync_001', 0, function () { + try { + fileio.accessSync(1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_access_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0200 + * @tc.name fileio_test_access_sync_002 + * @tc.desc Function of API, access. The test file is not exist. + */ + it('fileio_test_access_sync_002', 0, function () { + let fpath = nextFileName('fileIOTest') + try { + fileio.accessSync(fpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_access_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0300 + * @tc.name fileio_test_access_sync_003 + * @tc.desc Function of API, access(mode=1). The test file is exist and have the authority. + */ + it('fileio_test_access_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_access_sync_004') + expect(prepareEmptyFile(fpath)).assertTrue() + try { + let fd = fileio.accessSync(fpath) + console.log(fd) + expect(fileio.accessSync(fpath, 1) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_access_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0400 + * @tc.name fileio_test_access_sync_004 + * @tc.desc Function of API, access(mode=2). The test file is exist and have the authority. + */ + it('fileio_test_access_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_access_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.accessSync(fpath) + expect(fd !== null).assertTrue() + expect(fileio.accessSync(fpath, 2) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_access_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0500 + * @tc.name fileio_test_access_sync_005 + * @tc.desc Function of API, access(fpath=dir address). The test dir is exist. + */ + it('fileio_test_access_sync_005', 0, function () { + let dpath = nextFileName('fileio_test_access_sync_005') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let fd = fileio.accessSync(dpath) + expect(fd == undefined).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_access_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_AccessSync_0600 + * @tc.name fileio_test_access_sync_006 + * @tc.desc Function of API, access(fpath=dir address). The test dir is not exist. + */ + it('fileio_test_access_sync_006', 0, function () { + let dpath = nextFileName('fileio_test_access_sync_006') + 'd' + try { + fileio.accessSync(dpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_access_sync_006 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_UnlinkSync_0000 + * @tc.name fileio_test_unlink_sync_000 + * @tc.desc Function of API,unlinkSync. The test file is exist. + */ + it('fileio_test_unlink_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_unlink_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.unlinkSync(fpath) !== null) + } catch (e) { + console.log("fileio_test_unlink_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_UnlinkSync_0100 + * @tc.name fileio_test_unlink_sync_001 + * @tc.desc Function of API, no parameter. + */ + it('fileio_test_unlink_sync_001', 0, function () { + try { + fileio.unlinkSync(1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_unlink_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_UnlinkSync_0200 + * @tc.name fileio_test_unlink_sync_002 + * @tc.desc Function of API, invaild parameter + */ + it('fileio_test_unlink_sync_002', 0, function () { + let fpath = nextFileName('fileIOTest') + try { + fileio.unlinkSync(fpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_unlink_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0000 + * @tc.name fileio_test_write_sync_000 + * @tc.desc Function of API, writeSync. + */ + it('fileio_test_write_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_000') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fileio.writeSync(fd, FILE_CONTENT) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_write_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0100 + * @tc.name fileio_test_write_sync_001 + * @tc.desc Function of API, encoding=UTF-8. + */ + it('fileio_test_write_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_001') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fileio.writeSync(fd, FILE_CONTENT, { + encoding: "utf-8", + }) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_write_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0200 + * @tc.name fileio_test_write_sync_002 + * @tc.desc Function of API, offset=1. + */ + it('fileio_test_write_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_002') + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fileio.writeSync(fd, text, { + offset: 1, + }) == text.length - 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_write_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0300 + * @tc.name fileio_test_write_sync_003 + * @tc.desc Function of API, length = - 1. + */ + it('fileio_test_write_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_003') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fileio.writeSync(fd, FILE_CONTENT, { + length: FILE_CONTENT.length - 1, + }) == (FILE_CONTENT.length - 1)).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_write_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0400 + * @tc.name fileio_test_write_sync_004 + * @tc.desc Function of API, length = 1, offset = 1. + */ + it('fileio_test_write_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_004') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fileio.writeSync(fd, FILE_CONTENT, { + offset: 1, + length: 1, + }) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_write_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0500 + * @tc.name fileio_test_write_sync_005 + * @tc.desc Function of API, invaild offset. + */ + it('fileio_test_write_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_005') + const invalidOffset = 999 + let fd + try { + fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fd).assertInstanceOf('Number') + expect(fileio.writeSync(fd, FILE_CONTENT, { + offset: invalidOffset, + }) == 1).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0600 + * @tc.name fileio_test_write_sync_006 + * @tc.desc Function of API, invaild length. + */ + it('fileio_test_write_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_write_sync_006') + const invalidLength = 999 + let fd + try { + fd = fileio.openSync(fpath, 0o102, 0o666) + expect(fd).assertInstanceOf('Number') + expect(fileio.writeSync(fd, FILE_CONTENT, { + length: invalidLength, + }) == 1) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0700 + * @tc.name fileio_test_write_sync_007 + * @tc.desc Function of API, no parameter. + */ + it('fileio_test_write_sync_007', 0, function () { + try { + fileio.writeSync(1, 1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_write_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_WriteSync_0800 + * @tc.name fileio_test_write_sync_008 + * @tc.desc Function of API, invaild parameter. + */ + it('fileio_test_write_sync_008', 0, function () { + try { + console.log(fileio.writeSync(-1, FILE_CONTENT)) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_write_sync_008 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0000 + * @tc.name fileio_test_read_sync_000 + * @tc.desc Function of API, readSync. + */ + it('fileio_test_read_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_read_sync_000') + let text = "0123456789abcdefg"; + expect(prepareFile(fpath, text)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let len = fileio.readSync(fd, new ArrayBuffer(4096)) + expect(len == text.length).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_read_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0100 + * @tc.name fileio_test_read_sync_001 + * @tc.desc Function of API, offset = 1. + */ + it('fileio_test_read_sync_001', 0, function () { + let bufLen = 5 + expect(FILE_CONTENT.length > bufLen).assertTrue() + let fpath = nextFileName('fileio_test_read_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let len = fileio.readSync(fd, new ArrayBuffer(bufLen), { + offset: 1, + }) + expect(len == bufLen - 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_read_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0200 + * @tc.name fileio_test_read_sync_002 + * @tc.desc Function of API, length = 1. + */ + it('fileio_test_read_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_read_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let len = fileio.readSync(fd, new ArrayBuffer(4096), { + length: 1, + }) + expect(len == 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_read_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0300 + * @tc.name fileio_test_read_sync_003 + * @tc.desc Function of API, invaild offset + */ + it('fileio_test_read_sync_003', 0, function () { + let fd + const invalidOffset = 99999 + let fpath = nextFileName('fileio_test_read_sync_003') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + fd = fileio.openSync(fpath, 0o2) + fileio.readSync(fd, new ArrayBuffer(4096), { + offset: invalidOffset, + }) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_read_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0300 + * @tc.name fileio_test_read_sync_004 + * @tc.desc Function of API, invaild length. + */ + it('fileio_test_read_sync_004', 0, function () { + let fd + const invalidLength = 9999 + let fpath = nextFileName('fileio_test_read_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + + try { + fd = fileio.openSync(fpath, 0o2) + fileio.readSync(fd, new ArrayBuffer(4096), { + length: invalidLength, + }) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_read_sync_004 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0500 + * @tc.name fileio_test_read_sync_005 + * @tc.desc Function of API, fpatch = -1. + */ + it('fileio_test_read_sync_005', 0, function () { + try { + fileio.readSync(-1, new ArrayBuffer(4096)) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_read_sync_005 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0600 + * @tc.name fileio_test_read_sync_006 + * @tc.desc Function of API, offset & length & position = 1. + */ + it('fileio_test_read_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_read_sync_006') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let len = fileio.readSync(fd, new ArrayBuffer(4096), { + position: 1, + }) + expect(len == FILE_CONTENT.length - 1) + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_read_sync_006 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ReadSync_0700 + * @tc.name fileio_test_read_sync_007 + * @tc.desc Function of API, invaild position. + */ + it('fileio_test_read_sync_007', 0, function () { + let fpath = nextFileName('fileio_test_read_sync_007') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let invalidPos = FILE_CONTENT.length + let len = fileio.readSync(fd, new ArrayBuffer(4096), { + position: invalidPos, + }) + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_read_sync_007 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0000 + * @tc.name fileio_test_chmod_sync_000 + * @tc.desc Function of API, mode=0o660 + */ + it('fileio_test_chmod_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_chmod_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.chmodSync(fpath, 0o660) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o660).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_chmod_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0100 + * @tc.name fileio_test_chmod_sync_001 + * @tc.desc Function of API, mode=0o460 + */ + it('fileio_test_chmod_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_chmod_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.chmodSync(fpath, 0o460) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o460).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_chmod_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0200 + * @tc.name fileio_test_chmod_sync_002 + * @tc.desc Function of API, mode=0o260. The test file is exist. + */ + it('fileio_test_chmod_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_chmod_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.chmodSync(fpath, 0o260) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o260).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_chmod_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0300 + * @tc.name fileio_test_chmod_sync_003 + * @tc.desc Function of API, chmodSync. The test file is not exist. + */ + it('fileio_test_chmod_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_chmod_sync_003') + try { + fileio.chmodSync(fpath, 0o260) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_chmod_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0400 + * @tc.name fileio_test_chmod_sync_004 + * @tc.desc Function of API, fpatch=dir address. The test dir is exist. + */ + it('fileio_test_chmod_sync_004', 0, function () { + let dpath = nextFileName('fileio_test_chmod_sync_004') + try { + expect(fileio.mkdirSync(dpath, 0o777) !== null).assertTrue() + expect(fileio.chmodSync(dpath, 0o660) !== null).assertTrue() + expect((fileio.statSync(dpath).mode & 0o777) == 0o660).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_chmod_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChmodSync_0500 + * @tc.name fileio_test_chmod_sync_005 + * @tc.desc Function of API, fpatch=dir address. The test dir is not exist. + */ + it('fileio_test_chmod_sync_005', 0, function () { + let dpath; + try { + fileio.chmodSync(dpath, 0o660) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_chmod_sync_005 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0000 + * @tc.name fileio_test_copy_file_sync_000 + * @tc.desc Function of API, copy. fpatch is vaild, fpathTarget is vaild, same path, file not same. + */ + it('fileio_test_copy_file_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_000') + let fpathTarget = fpath + 'tgt' + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.copyFileSync(fpath, fpathTarget) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.unlinkSync(fpathTarget) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_copy_file_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0100 + * @tc.name fileio_test_copy_file_sync_001 + * @tc.desc Function of API, copy. fpatch is invaild, fpathTarget is vaild, same path, file not same. + */ + it('fileio_test_copy_file_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_001') + 'd' + let fpathTarget = fpath + 'tgt' + try { + fileio.copyFileSync(fpath, fpathTarget) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_copy_file_sync_001 has failed for " + e); + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0200 + * @tc.name fileio_test_copy_file_sync_002 + * @tc.desc Function of API, copy. fpatch is vaild, fpathTarget is invaild. + */ + it('fileio_test_copy_file_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_002') + try { + fileio.copyFileSync(fpath, 0) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_copy_file_sync_002 has failed for " + e); + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0300 + * @tc.name fileio_test_copy_file_sync_003 + * @tc.desc Function of API, copy. fpatch is vaild, fpathTarget is vaild, path not same, file not same. + */ + it('fileio_test_copy_file_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_003') + let fpathTarget = fpath + 'f1' + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.copyFileSync(fpath, fpathTarget) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.unlinkSync(fpathTarget) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_copy_file_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0400 + * @tc.name fileio_test_copy_file_sync_004 + * @tc.desc Function of API, copy. fpatch is vaild, fpathTarget is vaild, path not same, file not same. + */ + it('fileio_test_copy_file_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_004') + let fpathTarget = fileName('fileio_test_copy_file_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.copyFileSync(fpath, fpathTarget) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.unlinkSync(fpathTarget) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_copy_file_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0500 + * @tc.name fileio_test_copy_file_sync_005 + * @tc.desc Function of API, copy. fpatch is vaild, fpathTarget is vaild, path not same, file not same. + */ + it('fileio_test_copy_file_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_005') + let fpathTarget = fpath + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.copyFileSync(fpath, fpathTarget) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue(); + } catch (e) { + console.log("fileio_test_copy_file_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0600 + * @tc.name fileio_test_copy_file_sync_006 + * @tc.desc Function of API, copy. fpathTarget is invaild. + */ + it('fileio_test_copy_file_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_copy_file_sync_006') + let fpathTarget = fpath + 'tgt' + try { + fileio.copyFileSync(fpath, fpathTarget) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_copy_file_sync_006 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0700 + * @tc.name fileio_test_copy_file_sync_007 + * @tc.desc Function of API, copy. fpatch is invaild, fpathTarget is invaild. + */ + it('fileio_test_copy_file_sync_007', 0, function () { + try { + fileio.copyFileSync(1, 1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_copy_file_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0800 + * @tc.name fileio_test_copy_file_sync_008 + * @tc.desc Function of API, parameter more than 4096. + */ + it('fileio_test_copy_file_sync_008', 0, function () { + let fpath = nextFileName("fileio_test_copy_file_sync_008") + fileio.openSync(fpath, 0o102, 0o777) + let dpath = nextFileName("fileio_copy1") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 16; i++) { + if (i == 15) { + let fpathTarget = dpath + "/f" + randomString(248) + fileio.copyFileSync(fpath, fpathTarget) + } else { + dpath = dpath + "/d" + randomString(248) + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_copy_file_sync_008 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_copyFileSync_0900 + * @tc.name fileio_test_copy_file_sync_009 + * @tc.desc Function of API, filename is too long. + */ + it('fileio_test_copy_file_sync_009', 0, function () { + let fpath = nextFileName("fileio_test_copy_file_sync_009") + fileio.openSync(fpath, 0o102, 0o777) + let fpathTarget = nextFileName(randomString(256)) + try { + fileio.copyFileSync(fpath, fpathTarget) + expect(null).assertFail() + } catch (e) { + fileio.unlinkSync(fpath) + console.log("fileio_test_open_sync_008 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_1000 + * @tc.name fileio_test_open_sync_010 + * @tc.desc Function of API, dir layers too long + */ + it('fileio_test_open_sync_010', 0, function () { + let fpath = nextFileName("fileio_test_open_sync_010") + fileio.openSync(fpath, 0o102, 0o777) + let dpath = nextFileName("prop") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 113; i++) { + if (i == 112) { + let fpathTarget = dpath + "/f" + i + fileio.copyFileSync(fpath, fpathTarget) + } else { + dpath = dpath + "/" + i + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + fileio.unlinkSync(fpath) + console.log("fileio_test_open_sync_010 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_OpenSync_1100 + * @tc.name fileio_test_open_sync_011 + * @tc.desc Function of API, special parameter. + */ + it('fileio_test_open_sync_011', 0, function () { + let fpath = nextFileName("fileio_test_open_sync_011") + fileio.openSync(fpath, 0o102, 0o777) + let fpathTarget = nextFileName("?*:<>/|") + try { + fileio.copyFileSync(fpath, fpathTarget) + expect(null).assertFail() + } catch (e) { + fileio.unlinkSync(fpath) + console.log("fileio_test_open_sync_011 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_truncateSync_0000 + * @tc.name fileio_test_truncate_sync_000 + * @tc.desc Function of API, truncateSync. + */ + it('fileio_test_truncate_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_truncate_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.truncateSync(fpath) !== null).assertTrue() + expect(fileio.statSync(fpath).size == 0).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_truncate_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_truncateSync_0100 + * @tc.name fileio_test_truncate_sync_001 + * @tc.desc Function of API, no value for parameter. + */ + it('fileio_test_truncate_sync_001', 0, function () { + try { + fileio.truncateSync() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_truncate_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_truncateSync_0200 + * @tc.name fileio_test_truncate_sync_002 + * @tc.desc Function of API, no invaild parameter. + */ + it('fileio_test_truncate_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_truncate_sync_001') + try { + fileio.truncateSync(fpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_truncate_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0000 + * @tc.name fileio_test_rename_sync_000 + * @tc.desc Function of API, renameSync. The test file is exist, fpathTarget is not same with fpatch, file name are same. + */ + it('fileio_test_rename_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_rename_sync_000') + let fpathTarget = fpath + 'tgt' + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.renameSync(fpath, fpathTarget) !== null).assertTrue() + expect(fileio.accessSync(fpathTarget) !== null).assertTrue() + expect(fileio.unlinkSync(fpathTarget) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_rename_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0100 + * @tc.name fileio_test_rename_sync_001 + * @tc.desc Function of API, renameSync. The test file is not exist, fpathTarget is not same with fpatch, file name are same. + */ + it('fileio_test_rename_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_rename_sync_001') + let fpathTarget = fpath + 'tgt' + try { + fileio.renameSync(fpath, fpathTarget) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_rename_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0200 + * @tc.name fileio_test_rename_sync_002 + * @tc.desc Function of API, renameSync. The test file is exist, fpathTarget is invaild. + */ + it('fileio_test_rename_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_rename_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + fileio.renameSync(fpath, "/") + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_rename_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0300 + * @tc.name fileio_test_rename_sync_003 + * @tc.desc Function of API, renameSync. The test file is not exist, fpathTarget is same with fpatch, file name are same. + */ + it('fileio_test_rename_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_rename_sync_003') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + console.log("fileio_test_rename_sync_003 Test start"); + fileio.renameSync(fpath, fpath) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_rename_sync_003 Test finish. " + e); + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0400 + * @tc.name fileio_test_rename_sync_004 + * @tc.desc Function of API, no fpath parameter. + */ + it('fileio_test_rename_sync_004', 0, function () { + try { + fileio.renameSync(1, 1) + expect(null).assertNull() + } catch (e) { + console.log("fileio_test_rename_sync_004 pass. " + e); + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0500 + * @tc.name fileio_test_rename_sync_005 + * @tc.desc Function of API, no fpathTarget parameter. + */ + it('fileio_test_rename_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_rename_sync_005') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + fileio.renameSync(fpath, 1) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_rename_sync_005 pass. " + e); + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0600 + * @tc.name fileio_test_rename_sync_006 + * @tc.desc Function of API, rename dir. + */ + it('fileio_test_rename_sync_006', 0, function () { + let dpath = nextFileName('fileio_test_rename_sync_006') + 'd' + let dpathTarget = nextFileName('fileio_test_rename_sync_006-1') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + expect(fileio.renameSync(dpath, dpathTarget) == undefined).assertTrue() + expect(fileio.accessSync(dpathTarget) !== null).assertTrue() + expect(fileio.rmdirSync(dpathTarget) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_rename_sync_006 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0700 + * @tc.name fileio_test_rename_sync_007 + * @tc.desc Function of API, dir not exist. The test dir is not exist. + */ + it('fileio_test_rename_sync_007', 0, function () { + let dpath = nextFileName('fileio_test_rename_sync_007') + 'd' + let dpathTarget = nextFileName('fileio_test_rename_sync_007-1') + 'd' + try { + fileio.renameSync(dpath, dpathTarget) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_rename_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0800 + * @tc.name fileio_test_rename_sync_008 + * @tc.desc Function of API, fpathTarget not exist. fpathTarget not exist. + */ + it('fileio_test_rename_sync_008', 0, function () { + let dpath = nextFileName('fileio_test_rename_sync_008') + 'd' + let dpathTarget = '/data/accounts/account_0/appdata/aaa/bbb/fileio_test_rename_sync_008-1d' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + fileio.renameSync(dpath, dpathTarget) + expect(null).assertFail() + } catch (e) { + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + console.log("fileio_test_rename_sync_008 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_RenameSync_0900 + * @tc.name fileio_test_rename_sync_009 + * @tc.desc Function of API, fpath is same with fpathTarget. fpath is same with fpathTarget. + */ + it('fileio_test_rename_sync_009', 0, function () { + let dpath = nextFileName('fileio_test_rename_sync_009') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let result = fileio.renameSync(dpath, dpath); + expect(result === undefined).assertTrue() + expect(fileio.accessSync(dpath) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_rename_sync_009 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0000 + * @tc.name fileio_test_fchmod_sync_000 + * @tc.desc Function of API, fchmodSync(mode=0o660). The test file is exist. + */ + it('fileio_test_fchmod_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_fchmod_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath) + expect(fileio.fchmodSync(fd, 0o660) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o660).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchmod_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0100 + * @tc.name fileio_test_fchmod_sync_001 + * @tc.desc Function of API, fchmodSync(mode=0o460). The test file is exist. + */ + it('fileio_test_fchmod_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_fchmod_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath) + expect(fileio.fchmodSync(fd, 0o460) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o460).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchmod_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0200 + * @tc.name fileio_test_fchmod_sync_002 + * @tc.desc Function of API, fchmodSync(mode=0o260). The test file is exist. + */ + it('fileio_test_fchmod_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_fchmod_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath) + expect(fileio.fchmodSync(fd, 0o260) !== null).assertTrue() + expect((fileio.statSync(fpath).mode & 0o777) == 0o260).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchmod_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0300 + * @tc.name fileio_test_fchmod_sync_003 + * @tc.desc Function of API, file not exist. The test file is not exist. + */ + it('fileio_test_fchmod_sync_003', 0, function () { + try { + expect(fileio.fchmodSync(-1, 0o660) !== null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fchmod_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0400 + * @tc.name fileio_test_fchmod_sync_004 + * @tc.desc Function of API, mode is invaild. The test file is exist. + */ + it('fileio_test_fchmod_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_fchmod_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath) + expect(fileio.fchmodSync(fd, 2222222222222) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchmod_sync_004 has failed for A" + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0500 + * @tc.name fileio_test_fchmod_sync_005 + * @tc.desc Function of API, fpath = dir. The test dir is exist. + */ + it('fileio_test_fchmod_sync_005', 0, function () { + let dpath = nextFileName('fileio_test_fchmod_sync_005') + 'd' + try { + expect(fileio.mkdirSync(dpath, 0o777) !== null).assertTrue() + let fd = fileio.openSync(dpath) + console.log(fd); + expect(fileio.fchmodSync(fd, 0o660) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchmod_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchmodSync_0600 + * @tc.name fileio_test_fchmod_sync_006 + * @tc.desc Function of API, fpatch = dir. The test dir is not exist. + */ + it('fileio_test_fchmod_sync_006', 0, function () { + let dpath + try { + fileio.fchmodSync(dpath, 0o660) + expect(null).assertNull() + } catch (e) { + console.log("fileio_test_fchmod_sync_006 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FtruncateSync_0000 + * @tc.name fileio_test_ftruncate_sync_000 + * @tc.desc Function of API, ftruncateSync. The test file is exist. + */ + it('fileio_test_ftruncate_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_ftruncate_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + expect(fileio.ftruncateSync(fd) !== null).assertTrue() + expect(fileio.statSync(fpath).size == 0).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_ftruncate_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FtruncateSync_0100 + * @tc.name fileio_test_ftruncate_sync_001 + * @tc.desc Function of API, len not for value. The test file is exist. + */ + it('fileio_test_ftruncate_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_ftruncate_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + expect(fileio.ftruncateSync(fd) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_ftruncate_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FtruncateSync_0200 + * @tc.name fileio_test_ftruncate_sync_002 + * @tc.desc Function of API, invaild parameter. The test file is not exist. + */ + it('fileio_test_ftruncate_sync_002', 0, function () { + try { + fileio.ftruncateSync(1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_ftruncate_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FtruncateSync_0300 + * @tc.name fileio_test_ftruncate_sync_003 + * @tc.desc Function of API, invaild parameter. The test file is not exist. + */ + it('fileio_test_ftruncate_sync_003', 0, function () { + try { + fileio.ftruncateSync(-1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_ftruncate_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FsyncSync_0000 + * @tc.name fileio_test_fsync_sync_000 + * @tc.desc Function of API, fsyneSync. + */ + it('fileio_test_fsync_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_fsync_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + expect(fileio.fsyncSync(fd) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fsync_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FsyncSync_0100 + * @tc.name fileio_test_fsync_sync_001 + * @tc.desc Function of API, no value of parameter. + */ + it('fileio_test_fsync_sync_001', 0, function () { + try { + fileio.fsyncSync(1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fsync_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FsyncSync_0200 + * @tc.name fileio_test_fsync_sync_002 + * @tc.desc Function of API, invaild parameter. + */ + it('fileio_test_fsync_sync_002', 0, function () { + try { + fileio.fsyncSync(-1) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fsync_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0000 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_000 + * @tc.desc Sync to mkdir and rmdir. + */ + it('fileio_test_mkdir_sync_rmdir_sync_000', 0, function () { + let dpath = nextFileName('fileio_test_fsync_sync_000') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_mkdir_sync_rmdir_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0100 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_001 + * @tc.desc Sync to mkdir and rmdir. mkdirSync(mode=0o660). + */ + it('fileio_test_mkdir_sync_rmdir_sync_001', 0, function () { + let dpath = nextFileName('fileio_test_mkdir_sync_rmdir_sync_001') + 'd' + try { + expect(fileio.mkdirSync(dpath, 0o660) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_mkdir_sync_rmdir_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0200 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_002 + * @tc.desc Sync to mkdir and rmdir. mkdirSync(mode=0o460). + */ + it('fileio_test_mkdir_sync_rmdir_sync_002', 0, function () { + let dpath = nextFileName('fileio_test_mkdir_sync_rmdir_sync_002') + 'd' + try { + expect(fileio.mkdirSync(dpath, 0o460) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_mkdir_sync_rmdir_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0300 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_003 + * @tc.desc Sync to mkdir and rmdir. mkdirSync(mode=0o260). + */ + it('fileio_test_mkdir_sync_rmdir_sync_003', 0, function () { + let dpath = nextFileName('fileio_test_mkdir_sync_rmdir_sync_003') + 'd' + try { + expect(fileio.mkdirSync(dpath, 0o260) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_mkdir_sync_rmdir_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0400 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_004 + * @tc.desc Function of API, invaild parameter. The test file is not exist. + */ + it('fileio_test_mkdir_sync_rmdir_sync_004', 0, function () { + try { + expect(fileio.mkdirSync(1) !== null) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fsync_sync_004 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_MkdirSync_RmdirSync_0500 + * @tc.name fileio_test_mkdir_sync_rmdir_sync_005 + * @tc.desc Function of API, invaild parameter. The test file is not exist. + */ + it('fileio_test_mkdir_sync_rmdir_sync_005', 0, function () { + try { + expect(fileio.mkdirSync("/", 1) !== null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fsync_sync_005 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FstatSync_0000 + * @tc.name fileio_test_fstat_sync_000 + * @tc.desc Function of API, fstatSync. The test file is exist. + */ + it('fileio_test_fstat_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_fstat_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let stat = fileio.fstatSync(fd) + expect(stat !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fstat_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FstatSync_0100 + * @tc.name fileio_test_fstat_sync_001 + * @tc.desc Function of API, fstatSync, fd = -1. The test file is not exist. + */ + it('fileio_test_fstat_sync_001', 0, function () { + try { + expect(fileio.fstatSync(1) !== null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fstat_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FstatSync_0200 + * @tc.name fileio_test_fstat_sync_002 + * @tc.desc Function of API, fstatSync, fd = 1. The test file is not exist. + */ + it('fileio_test_fstat_sync_002', 0, function () { + try { + expect(fileio.fstatSync(1) !== null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_fstat_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FstatSync_0300 + * @tc.name fileio_test_fstat_sync_003 + * @tc.desc Function of API, fstatSync, vaild fd. The test file is exist. + */ + it('fileio_test_fstat_sync_003', 0, function () { + let dpath = nextFileName('fileio_test_fstat_sync_003') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let fd = fileio.openSync(dpath) + expect(fd !== null).assertTrue() + let stat = fileio.fstatSync(fd) + expect(stat !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fstat_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChownSync_0000 + * @tc.name fileio_test_chown_sync_000 + * @tc.desc Function of API, chownSync. The test file is exist. + */ + it('fileio_test_chown_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_chown_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = stat.gid + try { + expect(fileio.chownSync(fpath, UID, GID) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_chown_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChownSync_0100 + * @tc.name fileio_test_chown_sync_001 + * @tc.desc Function of API, chownSync. The test file is not exist. + */ + it('fileio_test_chown_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_chown_sync_001') + let fpath_1 = nextFileName('fileio_test_chown_sync_001_1') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = stat.gid + try { + expect(fileio.chownSync(fpath_1, UID, GID)) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_chown_sync_001 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_ChownSync_0200 + * @tc.name fileio_test_chown_sync_002 + * @tc.desc Function of API, invaild fd. The test file is not exist. + */ + it('fileio_test_chown_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_chown_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + expect(fileio.chownSync(fpath, 0, 0)) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_chown_sync_002 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0000 + * @tc.name fileio_test_fchown_sync_000 + * @tc.desc Function of API, fchownSync. The test file is exist. + */ + it('fileio_test_fchown_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = stat.gid + try { + let fd = fileio.openSync(fpath) + expect(fileio.fchownSync(fd, UID, GID) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_fchown_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0100 + * @tc.name fileio_test_fchown_sync_001 + * @tc.desc Function of API, fchownSync. The test file is not exist. + */ + it('fileio_test_fchown_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = stat.gid + try { + expect(fileio.fchownSync(-1, UID, GID)) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0200 + * @tc.name fileio_test_fchown_sync_002 + * @tc.desc Function of API, fchownSync, wrong owner. The test file is exist. + */ + it('fileio_test_fchown_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let fd; + let GID = stat.gid + try { + let fd = fileio.openSync(fpath) + fileio.fchownSync(fd, cc, GID) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0300 + * @tc.name fileio_test_fchown_sync_003 + * @tc.desc Function of API, fchownSync, wrong group. The test file is exist. + */ + it('fileio_test_fchown_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_003') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid; + let fd; + try { + fd = fileio.openSync(fpath, 0o2) + expect(fileio.fchownSync(fd, UID, 0)) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0400 + * @tc.name fileio_test_fchown_sync_004 + * @tc.desc Function of API, fchownSync, no value of fd. The test file is exist. + */ + it('fileio_test_fchown_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = stat.gid + let fd = null + try { + expect(fileio.fchownSync(fd, UID, GID)) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_004 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0500 + * @tc.name fileio_test_fchown_sync_005 + * @tc.desc Function of API, fchownSync, no value of owner. The test file is exist. + */ + it('fileio_test_fchown_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_005') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = null + let GID = stat.gid + let fd; + try { + fd = fileio.openSync(fpath) + expect(fileio.fchownSync(fd, UID, GID)) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_005 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0600 + * @tc.name fileio_test_fchown_sync_006 + * @tc.desc Function of API, fchownSync, no value of group. The test file is exist. + */ + it('fileio_test_fchown_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_006') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let stat = fileio.statSync(fpath) + let UID = stat.uid + let GID = null + let fd; + try { + fd = fileio.openSync(fpath) + expect(fileio.fchownSync(fd, UID, GID)) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_006 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_FchownSync_0700 + * @tc.name fileio_test_fchown_sync_007 + * @tc.desc Function of API, fchownSync, no value of GID,UID. The test file is exist. + */ + it('fileio_test_fchown_sync_007', 0, function () { + let fpath = nextFileName('fileio_test_fchown_sync_007') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let fd; + let UID = null + let GID = null + try { + fd = fileio.openSync(fpath, 0o2) + expect(fileio.fchownSync(fd, UID, GID)) + expect(null).assertFail() + } catch (e) { + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_fchown_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_prop_write_open_read_4k_sync + * @tc.name fileio_test_prop_write_open_read_4k_sync + * @tc.desc Sync to write & open & read 4K file. + */ + it('fileio_test_prop_write_open_read_4k_sync', 0, function () { + let fpath = nextFileName('fileio_test_prop_write_open_read_4k_sync') + try { + let fd = fileio.openSync(fpath, 0o102, 0o777) + expect(fd !== null).assertTrue() + expect(fileio.writeSync(fd, randomString(4096)) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + let fd1 = fileio.openSync(fpath, 0o2) + let rlen = fileio.readSync(fd1, new ArrayBuffer(4096)) + expect(rlen == 4096).assertTrue() + expect(fileio.closeSync(fd1) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_prop_write_open_read_4k_sync has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_prop_write_open_read_4k_sync + * @tc.name fileio_test_prop_copyFile_4k_sync + * @tc.desc Sync to copy 4K file. + */ + it('fileio_test_prop_copyFile_4k_sync', 0, function () { + let fpath = nextFileName('fileio_test_prop_copyFile_4k_sync') + let fpath1 = fileName('fileio_test_prop_copyFile_4k_1_sync') + try { + let fd = fileio.openSync(fpath, 0o102, 0o777) + expect(fd !== null).assertTrue() + expect(fileio.writeSync(fd, randomString(4096)) !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(fileio.copyFileSync(fpath, fpath1) !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.unlinkSync(fpath1) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_prop_copyFile_4k_sync has failed for " + e) + expect(null).assertFail() + } + }) +}) \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODir.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODir.test.js new file mode 100644 index 000000000..d0e358991 --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODir.test.js @@ -0,0 +1,334 @@ +/* + * 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 fileio from '@ohos.fileio'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { FILE_CONTENT, prepareFile, nextFileName, prepareFile1, randomString } from './Common' + +describe('fileIOTestDir', function () { + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0000 + * @tc.name fileio_test_dir_open_sync_000 + * @tc.desc Function of API, opendirSync. + */ + it('fileio_test_dir_open_sync_000', 0, function () { + let dpath = nextFileName('fileio_test_dir_open_sync_000') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.closeSync() == null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_dir_open_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0100 + * @tc.name fileio_test_dir_open_sync_001 + * @tc.desc Function of API, not set parameter. + */ + it('fileio_test_dir_open_sync_001', 0, function () { + try { + fileio.opendirSync() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0200 + * @tc.name fileio_test_dir_open_sync_002 + * @tc.desc Function of API, dpath value is not exist. + */ + it('fileio_test_dir_open_sync_002', 0, function () { + let dpath = nextFileName('fileio_test_dir_open_sync_003') + 'd' + try { + fileio.opendirSync(dpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0300 + * @tc.name fileio_test_dir_open_sync_003 + * @tc.desc Function of API, dpath too long. + */ + it('fileio_test_dir_open_sync_003', 0, function () { + let dpath = nextFileName("fileio_dir11") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 16; i++) { + console.log("time" + i) + dpath = dpath + "/f" + randomString(248) + fileio.mkdirSync(dpath) + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0400 + * @tc.name fileio_test_dir_open_sync_004 + * @tc.desc Function of API, filename too long. + */ + it('fileio_test_dir_open_sync_004', 0, function () { + let dpath = nextFileName(randomString(256)) + try { + fileio.mkdirSync(dpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_004 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0500 + * @tc.name fileio_test_dir_open_sync_005 + * @tc.desc Function of API, uri dir too many layers. + */ + it('fileio_test_dir_open_sync_005', 0, function () { + let dpath = nextFileName("dir") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 1024; i++) { + console.log("time" + i) + dpath = dpath + "/" + i + fileio.mkdirSync(dpath) + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_005 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_OpenSync_0600 + * @tc.name fileio_test_dir_open_sync_006 + * @tc.desc Function of API, file name contain special character. + */ + it('fileio_test_dir_open_sync_006', 0, function () { + let dpath = nextFileName("?*:<>/|") + try { + fileio.mkdirSync(dpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_open_sync_006 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0000 + * @tc.name fileio_test_dir_read_sync_000 + * @tc.desc Function of API, readSync. The dir contains 1 file. + */ + it('fileio_test_dir_read_sync_000', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_000') + 'd' + let fpath = dpath + '/f0' + try { + expect(typeof (fileio.mkdirSync(dpath)) == "undefined").assertTrue() + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.readSync() !== null).assertTrue() + expect(dd.closeSync() == null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_dir_read_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0100 + * @tc.name fileio_test_dir_read_sync_001 + * @tc.desc Function of API, readSync. The dir contains more than 1 files. + */ + it('fileio_test_dir_read_sync_001', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_001') + 'd' + let fpathArray = new Array(dpath + '/f1', dpath + '/f2', dpath + '/d3') + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + for (let i = 0; i < 3; i++) { + if (i == 2) { + expect(fileio.mkdirSync(fpathArray[i]) !== null).assertTrue() + } else { + expect(prepareFile(fpathArray[i], FILE_CONTENT)).assertTrue() + } + } + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + for (let i = 0; i < 3; i++) { + if (i == 2) { + let bool = typeof (dd.readSync()) + expect(bool == "object").assertTrue() + console.log("---bool=" + bool) + } else { + expect(dd.readSync() !== null).assertTrue() + } + } + expect(dd.closeSync() == null).assertTrue() + for (let i = 0; i < 3; i++) { + if (i == 2) { + expect(fileio.rmdirSync(fpathArray[i]) !== null).assertTrue() + } else { + expect(fileio.unlinkSync(fpathArray[i]) !== null).assertTrue() + } + } + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_dir_read_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0200 + * @tc.name fileio_test_dir_read_sync_002 + * @tc.desc Function of API, repeat read. The dir contains more than 1 files. + */ + it('fileio_test_dir_read_sync_002', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_002') + 'd' + let fpathArray = new Array(dpath + '/f1', dpath + '/f2', dpath + '/d3') + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + for (let i = 0; i < 3; i++) { + if (i == 2) { + expect(fileio.mkdirSync(fpathArray[i]) !== null).assertTrue() + } else { + expect(prepareFile(fpathArray[i], FILE_CONTENT)).assertTrue() + } + } + var dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + for (let i = 0; i < 3; i++) { + expect(dd.readSync() !== null).assertTrue() + } + expect(dd.readSync() == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_dir_read_sync_002 has failed for " + e) + expect(dd.closeSync() == null).assertTrue() + for (let i = 0; i < 3; i++) { + if (i == 2) { + expect(fileio.rmdirSync(fpathArray[i]) !== null).assertTrue() + } else { + expect(fileio.unlinkSync(fpathArray[i]) !== null).assertTrue() + } + } + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0300 + * @tc.name fileio_test_dir_read_sync_003 + * @tc.desc Function of API, readSync. The dir no any files. + */ + it('fileio_test_dir_read_sync_003', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_003') + 'd' + let dd; + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.readSync() == null).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() == null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + console.log("fileio_test_dir_read_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0400 + * @tc.name fileio_test_dir_read_sync_004 + * @tc.desc Function of API, error parameter. + */ + it('fileio_test_dir_read_sync_004', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_004') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.readSync(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() == null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + console.log("fileio_test_dir_read_sync_004 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_ReadSync_0500 + * @tc.name fileio_test_dir_read_sync_005 + * @tc.desc Function of API, excess files. + */ + it('fileio_test_dir_read_sync_005', 0, function () { + let dpath = nextFileName('fileio_test_dir_read_sync_005') + 'd' + let fpath = dpath + '/f' + try { + expect(typeof (fileio.mkdirSync(dpath)) == "undefined").assertTrue() + for (let i = 0; i < 10001; i++) { + expect(prepareFile(fpath + i, "test_text")).assertTrue() + } + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.readSync() !== null).assertTrue() + expect(dd.closeSync() == null).assertTrue() + for (let i = 0; i < 10001; i++) { + fileio.unlinkSync(fpath + i) + } + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_dir_read_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dir_CloseSync_0000 + * @tc.name fileio_test_dir_close_sync_000 + * @tc.desc Function of API, closeSync. + */ + it('fileio_test_dir_close_sync_000', 0, function () { + let dpath = nextFileName('fileio_test_dir_close_sync_000') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + expect(dd.closeSync() == null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_dir_close_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) +}) \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODirent.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODirent.test.js new file mode 100644 index 000000000..05f961891 --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIODirent.test.js @@ -0,0 +1,403 @@ +/* + * 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 fileio from '@system.fileio' +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { FILE_CONTENT, prepareFile, nextFileName } from './Common' + +describe('fileIOTestDirent', function () { + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_name_0000 + * @tc.name fileio_test_dirent_name_000 + * @tc.desc Function of API, Get file name. + */ + it('fileio_test_dirent_name_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_name_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent.name !== null).assertTrue() + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_name_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isBlockDevice_0000 + * @tc.name fileio_test_dirent_is_block_device_000 + * @tc.desc Function of API, isBlockDevice. Determine whether it is a block device. + */ + it('fileio_test_dirent_is_block_device_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_block_device_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isBlockDevice() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + return + } catch (e) { + console.log("fileio_test_dirent_is_block_device_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isBlockDevice_0100 + * @tc.name fileio_test_dirent_is_block_device_001 + * @tc.desc Function of API, isBlockDevice. The parameter is - 1. + */ + it('fileio_test_dirent_is_block_device_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_block_device_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isBlockDevice(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_block_device_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isCharacterDevice_0000 + * @tc.name fileio_test_dirent_is_character_device_000 + * @tc.desc Function of API, isCharacterDevice. Determine whether it is a character device. + */ + it('fileio_test_dirent_is_character_device_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_character_device_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isCharacterDevice() !== null) + expect(dd.closeSync() !== null !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_character_device_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isCharacterDevice_0100 + * @tc.name fileio_test_dirent_is_character_device_001 + * @tc.desc Function of API, isCharacterDevice. The parameter is - 1. + */ + it('fileio_test_dirent_is_character_device_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_character_device_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isCharacterDevice(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_character_device_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isDirectory_0000 + * @tc.name fileio_test_dirent_is_directory_000 + * @tc.desc Function of API, isDirectory. Determine whether it is a directory. + */ + it('fileio_test_dirent_is_directory_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_directory_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isDirectory() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_directory_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isDirectory_0100 + * @tc.name fileio_test_dirent_is_directory_001 + * @tc.desc Function of API, isDirectory. The parameter is - 1 + */ + it('fileio_test_dirent_is_directory_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_directory_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isDirectory(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_directory_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isFifo_0000 + * @tc.name fileio_test_dirent_is_fifo_000 + * @tc.desc Function of API, isFIFO. Determine whether it is a fifo. + */ + it('fileio_test_dirent_is_fifo_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_fifo_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isFIFO() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_fifo_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isFifo_0100 + * @tc.name fileio_test_dirent_is_fifo_001 + * @tc.desc Function of API, isFIFO. The parameter is - 1 + */ + it('fileio_test_dirent_is_fifo_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_fifo_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isFIFO(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_fifo_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isFile_0000 + * @tc.name fileio_test_dirent_is_file_000 + * @tc.desc Function of API, isFile. Determine whether it is a file. + */ + it('fileio_test_dirent_is_file_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_file_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isFile() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_file_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isFile_0100 + * @tc.name fileio_test_dirent_is_file_001 + * @tc.desc Function of API, isFile. The parameter is - 1 + */ + it('fileio_test_dirent_is_file_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_file_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isFile(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_file_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isSocket_0000 + * @tc.name fileio_test_dirent_is_socket_000 + * @tc.desc Function of API, isSocket. Determine whether it is a socket. + */ + it('fileio_test_dirent_is_socket_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_socket_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isSocket() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_socket_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isSocket_0100 + * @tc.name fileio_test_dirent_is_socket_001 + * @tc.desc Function of API, isSocket. The parameter is - 1 + */ + it('fileio_test_dirent_is_socket_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_socket_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isSocket(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_socket_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isSymbolicLlink_0000 + * @tc.name fileio_test_dirent_is_symbolic_link_000 + * @tc.desc Function of API, isSymbolicLink. Determine whether it is a symbolic link. + */ + it('fileio_test_dirent_is_symbolic_link_000', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_symbolic_link_000') + 'd' + let fpath = dpath + '/f1' + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + expect(dirent.isSymbolicLink() !== null) + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + } catch (e) { + console.log("fileio_test_dirent_is_symbolic_link_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_dirent_isSymbolicLlink_0100 + * @tc.name fileio_test_dirent_is_symbolic_link_001 + * @tc.desc Function of API, isSymbolicLink. The parameter is - 1 + */ + it('fileio_test_dirent_is_symbolic_link_001', 0, function () { + let dpath = nextFileName('fileio_test_dirent_is_symbolic_link_001') + 'd' + let fpath = dpath + '/f1' + let dd + try { + expect(fileio.mkdirSync(dpath) !== null) + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + dd = fileio.opendirSync(dpath) + expect(dd !== null).assertTrue() + let dirent = dd.readSync() + expect(dirent !== null).assertTrue() + dirent.isSymbolicLink(-1) + expect(null).assertFail() + } catch (e) { + expect(dd.closeSync() !== null) + expect(fileio.unlinkSync(fpath) !== null) + expect(fileio.rmdirSync(dpath) !== null) + console.log("fileio_test_dirent_is_symbolic_link_001 has failed for " + e) + } + }) +}) diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStat.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStat.test.js new file mode 100644 index 000000000..cc0a8eba8 --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStat.test.js @@ -0,0 +1,743 @@ +/* + * 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 fileio from '@ohos.fileio'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { FILE_CONTENT, prepareFile, nextFileName, randomString } from './Common' + +describe('fileIOTestStat', function () { + + /** + * @tc.number SUB_STORAGE_FileIO_statSync_0000 + * @tc.name fileio_test_stat_stat_sync_000 + * @tc.desc Function of API, statSync. Gets information about the file in the specified path. + */ + it('fileio_test_stat_stat_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_stat_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(stat !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_stat_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_statSync_0100 + * @tc.name fileio_test_stat_stat_sync_001 + * @tc.desc Function of API, statSync. The specified file does not exist. + */ + it('fileio_test_stat_stat_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_stat_sync_001') + try { + fileio.statSync(fpath) + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_stat_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_statSync_0200 + * @tc.name fileio_test_stat_stat_sync_002 + * @tc.desc Function of API, statSync. The parameter is the directory path. + */ + it('fileio_test_stat_stat_sync_002', 0, function () { + let dpath = nextFileName('fileio_test_stat_stat_sync_002') + 'd' + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + try { + let stat = fileio.statSync(dpath) + expect(stat !== null).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_stat_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_statSync_0300 + * @tc.name fileio_test_stat_stat_sync_003 + * @tc.desc Function of API, statSync. The file path is greater than 4096. + */ + it('fileio_test_stat_stat_sync_003', 0, function () { + let dpath = nextFileName("fileio_stat1") + try { + for (let i = 0; i < 16; i++) { + if (i == 15) { + let fpath = dpath + "/f" + randomString(252) + fileio.statSync(fpath) + } else { + dpath = dpath + "/d" + randomString(252) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_stat_sync_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_dev_0000 + * @tc.name fileio_test_stat_dev_000 + * @tc.desc Function of API. Get the device number used by the file. + */ + it('fileio_test_stat_dev_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_dev_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.dev) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_dev_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_ino_0000 + * @tc.name fileio_test_stat_ino_000 + * @tc.desc Function of API. Get inode number. + */ + it('fileio_test_stat_ino_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_ino_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.ino) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_ino_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_mode_0000 + * @tc.name fileio_test_stat_mode_000 + * @tc.desc Function of API. Get file type and access rights. + */ + it('fileio_test_stat_mode_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_mode_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.mode) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_mode_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_nlink_0000 + * @tc.name fileio_test_stat_nlink_000 + * @tc.desc Function of API. Gets the number of hard connections to the file. + */ + it('fileio_test_stat_nlink_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_nlink_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.nlink) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_nlink_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_uid_0000 + * @tc.name fileio_test_stat_uid_000 + * @tc.desc Function of API. Get file owner user ID. + */ + it('fileio_test_stat_uid_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_uid_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.uid) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_uid_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_gid_0000 + * @tc.name fileio_test_stat_gid_000 + * @tc.desc Function of API. Get group ID. + */ + it('fileio_test_stat_gid_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_gid_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.gid) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_gid_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_rdev_0000 + * @tc.name fileio_test_stat_rdev_000 + * @tc.desc Function of API. Get the device number of the device file. + */ + it('fileio_test_stat_rdev_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_rdev_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.rdev) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_rdev_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stat_size_0000 + * @tc.name fileio_test_stat_size_000 + * @tc.desc Function of API. Gets the file capacity in bytes. + */ + it('fileio_test_stat_size_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_size_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.size) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_size_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_blksize_0000 + * @tc.name fileio_test_stat_blksize_000 + * @tc.desc Function of API. Gets the size of the disk block containing the file. + */ + it('fileio_test_stat_blksize_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_blksize_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.blksize) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_blksize_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_blocks_0000 + * @tc.name fileio_test_stat_blocks_000 + * @tc.desc Function of API. Gets the disk block occupied by the file. + */ + it('fileio_test_stat_blocks_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_blocks_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.blocks) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_blocks_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stat_atime_0000 + * @tc.name fileio_test_stat_atime_000 + * @tc.desc Function of API. Gets the time when a file was last accessed. + */ + it('fileio_test_stat_atime_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_atime_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.atime) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_atime_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_mtime_0000 + * @tc.name fileio_test_stat_mtime_000 + * @tc.desc Function of API. Gets the time when a file was last modified + */ + it('fileio_test_stat_mtime_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_mtime_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.mtime) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_mtime_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_ctime_0000 + * @tc.name fileio_test_stat_ctime_000 + * @tc.desc Function of API. Gets the time when a file last changed state + */ + it('fileio_test_stat_ctime_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_ctime_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.ctime) == "number").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_ctime_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isBlockDevice_0000 + * @tc.name fileio_test_stat_is_block_device_000 + * @tc.desc Function of API, isBlockDevice. Determine whether it is a block device. The return value is Boolean. + */ + it('fileio_test_stat_is_block_device_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_block_device_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isBlockDevice()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_block_device_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isBlockDevice_0100 + * @tc.name fileio_test_stat_is_block_device_001 + * @tc.desc Function of API, isBlockDevice. Determine whether it is a block device. The return value is false. + */ + it('fileio_test_stat_is_block_device_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_block_device_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isBlockDevice()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_block_device_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isBlockDevice_0200 + * @tc.name fileio_test_stat_is_block_device_002 + * @tc.desc Function of API, isBlockDevice. The parameter is - 1 + */ + it('fileio_test_stat_is_block_device_002', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_block_device_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isBlockDevice(-1)).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_stat_is_block_device_002 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stat_isCharacterDevice_0000 + * @tc.name fileio_test_stat_is_character_device_000 + * @tc.desc Function of API, isCharacterDevice. Determine whether it is a character device. The return value is Boolean. + */ + it('fileio_test_stat_is_character_device_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_character_device_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isCharacterDevice()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_character_device_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isCharacterDevice_0100 + * @tc.name fileio_test_stat_is_character_device_001 + * @tc.desc Function of API, isCharacterDevice. Determine whether it is a character device. The return value is false. + */ + it('fileio_test_stat_is_character_device_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_character_device_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isCharacterDevice()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_character_device_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isCharacterDevice_0200 + * @tc.name fileio_test_stat_is_character_device_002 + * @tc.desc Function of API, isCharacterDevice. The parameter is - 1 + */ + it('fileio_test_stat_is_character_device_002', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_character_device_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isCharacterDevice(-1)).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_is_character_device_002 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isDirectory_0000 + * @tc.name fileio_test_stat_is_directory_000 + * @tc.desc Function of API, isDirectory. Determine whether it is a directory. The return value is Boolean. + */ + it('fileio_test_stat_is_directory_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_directory_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isDirectory()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_directory_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isDirectory_0100 + * @tc.name fileio_test_stat_is_directory_001 + * @tc.desc Function of API, isDirectory. Determine whether it is a directory. The return value is false. + */ + it('fileio_test_stat_is_directory_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_directory_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isDirectory()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_directory_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isDirectory_0200 + * @tc.name fileio_test_stat_is_directory_002 + * @tc.desc Function of API, isDirectory. Determine whether it is a directory. The return value is true. + */ + it('fileio_test_stat_is_directory_002', 0, function () { + let dpath = nextFileName('fileio_test_stat_is_directory_002') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let stat = fileio.statSync(dpath) + expect(stat.isDirectory()).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_directory_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isDirectory_0300 + * @tc.name fileio_test_stat_is_directory_003 + * @tc.desc Function of API, isDirectory. The parameter is - 1 + */ + it('fileio_test_stat_is_directory_003', 0, function () { + let dpath = nextFileName('fileio_test_stat_is_directory_003') + 'd' + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let stat = fileio.statSync(dpath) + expect(stat.isDirectory(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_is_directory_003 has failed for " + e) + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stat_isFifo_0000 + * @tc.name fileio_test_stat_is_fifo_000 + * @tc.desc Function of API, isFIFO. Determine whether it is a fifo. The return value is Boolean. + */ + it('fileio_test_stat_is_fifo_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_fifo_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isFIFO()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_fifo_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFifo_0100 + * @tc.name fileio_test_stat_is_fifo_001 + * @tc.desc Function of API, isFIFO. Determine whether it is a fifo. The return value is false. + */ + it('fileio_test_stat_is_fifo_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_fifo_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isFIFO()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_fifo_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFifo_0200 + * @tc.name fileio_test_stat_is_fifo_002 + * @tc.desc Function of API, isFIFO. The parameter is - 1 + */ + it('fileio_test_stat_is_fifo_002', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_fifo_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(stat.isFIFO(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_is_fifo_002 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFile_0000 + * @tc.name fileio_test_stat_is_file_000 + * @tc.desc Function of API, isFile. Determine whether it is a file. The return value is Boolean. + */ + it('fileio_test_stat_is_file_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_file_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isFile()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_file_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFile_0100 + * @tc.name fileio_test_stat_is_file_001 + * @tc.desc Function of API, isFile. Determine whether it is a file. The return value is true. + */ + it('fileio_test_stat_is_file_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_file_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(stat.isFile()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("---fileio_test_stat_is_file_001 is passed!") + } catch (e) { + console.log("fileio_test_stat_is_file_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFile_0200 + * @tc.name fileio_test_stat_is_file_002 + * @tc.desc Function of API, isFile. Determine whether it is a file. The return value is false. + */ + it('fileio_test_stat_is_file_002', 0, function () { + let dpath = nextFileName('fileio_test_stat_is_file_002') + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let stat = fileio.statSync(dpath) + expect(!stat.isFile()).assertTrue() + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_file_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isFile_0300 + * @tc.name fileio_test_stat_is_file_003 + * @tc.desc Function of API, isFile. The parameter is - 1 + */ + it('fileio_test_stat_is_file_003', 0, function () { + let dpath = nextFileName('fileio_test_stat_is_file_003') + try { + expect(fileio.mkdirSync(dpath) !== null).assertTrue() + let stat = fileio.statSync(dpath) + expect(stat.isFile(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(fileio.rmdirSync(dpath) !== null).assertTrue() + console.log("fileio_test_stat_is_file_003 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSocket_0000 + * @tc.name fileio_test_stat_is_socket_000 + * @tc.desc Function of API, isSocket. Determine whether it is a socket. The return value is Boolean. + */ + it('fileio_test_stat_is_socket_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_socket_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isSocket()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_socket_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSocket_0100 + * @tc.name fileio_test_stat_is_socket_001 + * @tc.desc Function of API, isSocket. Determine whether it is a socket. The return value is false. + */ + it('fileio_test_stat_is_socket_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_socket_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isSocket()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_socket_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSocket_0200 + * @tc.name fileio_test_stat_is_socket_002 + * @tc.desc Function of API, isSocket. The parameter is - 1 + */ + it('fileio_test_stat_is_socket_002', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_socket_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(stat.isSocket(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_is_socket_002 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSymbolicLink_0000 + * @tc.name fileio_test_stat_is_symbolic_link_000 + * @tc.desc Function of API, isSymbolicLink. Determine whether it is a symbolic link. The return value is Boolean. + */ + it('fileio_test_stat_is_symbolic_link_000', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_symbolic_link_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(typeof (stat.isSymbolicLink()) == "boolean").assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_symbolic_link_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSymbolicLink_0100 + * @tc.name fileio_test_stat_is_symbolic_link_001 + * @tc.desc Function of API, isSymbolicLink. Determine whether it is a symbolic link. The return value is false. + */ + it('fileio_test_stat_is_symbolic_link_001', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_symbolic_link_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(!stat.isSymbolicLink()).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stat_is_symbolic_link_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_Stat_isSymbolicLink_0200 + * @tc.name fileio_test_stat_is_symbolic_link_002 + * @tc.desc Function of API, isSymbolicLink. The parameter is - 1 + */ + it('fileio_test_stat_is_symbolic_link_002', 0, function () { + let fpath = nextFileName('fileio_test_stat_is_symbolic_link_002') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let stat = fileio.statSync(fpath) + expect(stat.isSymbolicLink(-1) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stat_is_symbolic_link_002 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) +}) \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStream.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStream.test.js new file mode 100644 index 000000000..ca8b6624e --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/FileIOStream.test.js @@ -0,0 +1,1821 @@ +/* + * 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 fileio from '@ohos.fileio'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index' +import { + FILE_CONTENT, prepareFile, fileToReadOnly, fileToWriteOnly, sleep, fileToReadAndWrite, nextFileName, randomString +} from './Common' + +describe('fileIOTestStream', function () { + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0000 + * @tc.name fileio_test_stream_create_stream_sync_000 + * @tc.desc Function of API, mode = r. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_000') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_stream_create_stream_sync_000 is passed!") + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0100 + * @tc.name fileio_test_stream_create_stream_sync_001 + * @tc.desc Function of API, mode = r. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_001') + try { + expect(fileio.createStreamSync(fpath, "r") == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0200 + * @tc.name fileio_test_stream_create_stream_sync_002 + * @tc.desc Function of API, mode = w. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_002') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "w") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0300 + * @tc.name fileio_test_stream_create_stream_sync_003 + * @tc.desc Function of API, mode = w. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_003') + try { + let ss = fileio.createStreamSync(fpath, "w") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0400 + * @tc.name fileio_test_stream_create_stream_sync_004 + * @tc.desc Function of API, mode = a. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_004') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "a") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_004 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0500 + * @tc.name fileio_test_stream_create_stream_sync_005 + * @tc.desc Function of API, mode = a. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_005') + try { + let ss = fileio.createStreamSync(fpath, "a") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0600 + * @tc.name fileio_test_stream_create_stream_sync_006 + * @tc.desc Function of API, mode = r+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_006') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_006 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0700 + * @tc.name fileio_test_stream_create_stream_sync_007 + * @tc.desc Function of API, mode = r+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_007', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_007') + try { + fileio.createStreamSync(fpath, "r+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0800 + * @tc.name fileio_test_stream_create_stream_sync_008 + * @tc.desc Function of API, mode = w+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_008', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_008') + expect(prepareFile(fpath, "")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "w+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_008 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_0900 + * @tc.name fileio_test_stream_create_stream_sync_009 + * @tc.desc Function of API, mode = w+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_009', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_009') + try { + let ss = fileio.createStreamSync(fpath, "w+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_009 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1000 + * @tc.name fileio_test_stream_create_stream_sync_010 + * @tc.desc Function of API, mode = a+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_010', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_010') + expect(prepareFile(fpath, "a")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "a+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_010 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1100 + * @tc.name fileio_test_stream_create_stream_sync_011 + * @tc.desc Function of API, mode = a+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_011', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_011') + try { + let ss = fileio.createStreamSync(fpath, "a+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_011 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1200 + * @tc.name fileio_test_stream_create_stream_sync_012 + * @tc.desc Function of API, mode = ab. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_012', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_012') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "rb") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_012 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1300 + * @tc.name fileio_test_stream_create_stream_sync_013 + * @tc.desc Function of API, mode = ab. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_013', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_013') + try { + fileio.createStreamSync(fpath, "rb") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_013 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1400 + * @tc.name fileio_test_stream_create_stream_sync_014 + * @tc.desc Function of API, mode = wb. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_014', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_014') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "wb") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_014 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1500 + * @tc.name fileio_test_stream_create_stream_sync_015 + * @tc.desc Function of API, mode = wb. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_015', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_015') + try { + let ss = fileio.createStreamSync(fpath, "wb") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_015 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1600 + * @tc.name fileio_test_stream_create_stream_sync_016 + * @tc.desc Function of API, mode = ab. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_016', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_016') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "ab") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_stream_create_stream_sync_016 is passed!") + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_016 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1700 + * @tc.name fileio_test_stream_create_stream_sync_017 + * @tc.desc Function of API, mode = ab. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_017', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_017') + try { + let ss = fileio.createStreamSync(fpath, "ab") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_017 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1800 + * @tc.name fileio_test_stream_create_stream_sync_018 + * @tc.desc Function of API, mode = rb+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_018', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_018') + expect(prepareFile(fpath, "")).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "rb+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_018 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_1900 + * @tc.name fileio_test_stream_create_stream_sync_019 + * @tc.desc Function of API, mode = rb+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_019', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_019') + try { + fileio.createStreamSync(fpath, "rb+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_019 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2000 + * @tc.name fileio_test_stream_create_stream_sync_020 + * @tc.desc Function of API, mode = wb+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_020', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_020') + expect(prepareFile(fpath, "")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "wb+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_020 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2100 + * @tc.name fileio_test_stream_create_stream_sync_021 + * @tc.desc Function of API, mode = wb+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_021', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_021') + try { + let ss = fileio.createStreamSync(fpath, "wb+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_021 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2200 + * @tc.name fileio_test_stream_create_stream_sync_022 + * @tc.desc Function of API, mode = ab+. The test file is exist. + */ + it('fileio_test_stream_create_stream_sync_022', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_022') + expect(prepareFile(fpath, "a")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "ab+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_022 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2300 + * @tc.name fileio_test_stream_create_stream_sync_023 + * @tc.desc Function of API, mode = ab+. The test file is not exist. + */ + it('fileio_test_stream_create_stream_sync_023', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_023') + try { + let ss = fileio.createStreamSync(fpath, "ab+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_023 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2400 + * @tc.name fileio_test_stream_create_stream_sync_024 + * @tc.desc Function of API, invaild fpath. + */ + it('fileio_test_stream_create_stream_sync_024', 0, function () { + try { + fileio.createStreamSync("", "r") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_024 is passed!" + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2500 + * @tc.name fileio_test_stream_create_stream_sync_025 + * @tc.desc Function of API, invaild mode. + */ + it('fileio_test_stream_create_stream_sync_025', 0, function () { + let fpath = nextFileName('fileio_test_stream_create_stream_sync_025') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + fileio.createStreamSync(fpath, "") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_025 is passed!" + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2600 + * @tc.name fileio_test_stream_create_stream_sync_026 + * @tc.desc Function of API, fpath too long. + */ + it('fileio_test_stream_create_stream_sync_026', 0, function () { + let dpath = nextFileName("fileio_stream") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 16; i++) { + if (i == 15) { + let fpath = dpath + "/f" + randomString(248) + fileio.createStreamSync(fpath, "w+") + } else { + dpath = dpath + "/d" + randomString(248) + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_026 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2700 + * @tc.name fileio_test_stream_create_stream_sync_027 + * @tc.desc Function of API, filename too long. + */ + it('fileio_test_stream_create_stream_sync_027', 0, function () { + let fpath = nextFileName(randomString(256)) + try { + fileio.createStreamSync(fpath, "w+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_027 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2800 + * @tc.name fileio_test_stream_create_stream_sync_028 + * @tc.desc Function of API, path too deep. + */ + it('fileio_test_stream_create_stream_sync_028', 0, function () { + let dpath = nextFileName("stream") + fileio.mkdirSync(dpath) + try { + for (let i = 0; i < 113; i++) { + if (i == 112) { + let fpath = dpath + "/f" + i + fileio.createStreamSync(fpath, "w+") + } else { + dpath = dpath + "/" + i + fileio.mkdirSync(dpath) + } + } + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_028 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CreateStreamSync_2900 + * @tc.name fileio_test_stream_create_stream_sync_029 + * @tc.desc Function of API, special character. + */ + it('fileio_test_stream_create_stream_sync_029', 0, function () { + let fpath = nextFileName("?*:<>/|") + try { + fileio.createStreamSync(fpath, "w+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_create_stream_sync_029 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0000 + * @tc.name fileio_test_stream_fdopen_stream_sync_000 + * @tc.desc Function of API, mode=r. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_000') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + + try { + let fd = fileio.openSync(fpath, 0o0) + let ss = fileio.fdopenStreamSync(fd, "r") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0100 + * @tc.name fileio_test_stream_fdopen_stream_sync_001 + * @tc.desc Function of API, mode=r. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_001', 0, function () { + try { + expect(fileio.fdopenStreamSync(-1, "r") == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_001 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0200 + * @tc.name fileio_test_stream_fdopen_stream_sync_002 + * @tc.desc Function of API, mode=w. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_002') + let fd; + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0300 + * @tc.name fileio_test_stream_fdopen_stream_sync_003 + * @tc.desc Function of API, mode=w. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_003') + try { + let fd = fileio.openSync(fpath, 0o101, 0o222) + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0400 + * @tc.name fileio_test_stream_fdopen_stream_sync_004 + * @tc.desc Function of API, mode=a. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_004') + expect(prepareFile(fpath, "1")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o2001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "a") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0500 + * @tc.name fileio_test_stream_fdopen_stream_sync_005 + * @tc.desc Function of API, mode=a. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_005') + try { + let fd = fileio.openSync(fpath, 0o101, 0o222) + let ss = fileio.fdopenStreamSync(fd, "a") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0600 + * @tc.name fileio_test_stream_fdopen_stream_sync_006 + * @tc.desc Function of API, mode=r+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_006') + expect(prepareFile(fpath, "")).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let ss = fileio.fdopenStreamSync(fd, "r+") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_006 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0700 + * @tc.name fileio_test_stream_fdopen_stream_sync_007 + * @tc.desc Function of API, mode=r+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_007', 0, function () { + try { + fileio.fdopenStreamSync(-1, "r+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_007 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0800 + * @tc.name fileio_test_stream_fdopen_stream_sync_008 + * @tc.desc Function of API, mode=w+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_008', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_008') + expect(prepareFile(fpath, "")).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o2) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_008 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_0900 + * @tc.name fileio_test_stream_fdopen_stream_sync_009 + * @tc.desc Function of API, mode=w+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_009', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_009') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + let ss = fileio.fdopenStreamSync(fd, "w+") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_009 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1000 + * @tc.name fileio_test_stream_fdopen_stream_sync_010 + * @tc.desc Function of API, mode=a+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_010', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_010') + expect(prepareFile(fpath, "1")).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o2002) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "a+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_010 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1100 + * @tc.name fileio_test_stream_fdopen_stream_sync_011 + * @tc.desc Function of API, mode=a+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_011', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_011') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + let ss = fileio.fdopenStreamSync(fd, "a+") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_011 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1200 + * @tc.name fileio_test_stream_fdopen_stream_sync_012 + * @tc.desc Function of API, mode=rb. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_012', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_012') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o0) + let ss = fileio.fdopenStreamSync(fd, "rb") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_012 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1300 + * @tc.name fileio_test_stream_fdopen_stream_sync_013 + * @tc.desc Function of API, mode=rb. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_013', 0, function () { + try { + fileio.fdopenStreamSync(-1, "rb") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_013 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1400 + * @tc.name fileio_test_stream_fdopen_stream_sync_014 + * @tc.desc Function of API, mode=wb. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_014', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_014') + expect(prepareFile(fpath, "")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "wb") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_014 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1500 + * @tc.name fileio_test_stream_fdopen_stream_sync_015 + * @tc.desc Function of API, mode=wb. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_015', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_015') + + try { + let fd = fileio.openSync(fpath, 0o101, 0o222) + let ss = fileio.fdopenStreamSync(fd, "wb") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_015 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1600 + * @tc.name fileio_test_stream_fdopen_stream_sync_016 + * @tc.desc Function of API, mode=ab. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_016', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_016') + expect(prepareFile(fpath, "1")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o2001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "ab") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_016 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1700 + * @tc.name fileio_test_stream_fdopen_stream_sync_017 + * @tc.desc Function of API, mode=ab. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_017', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_017') + try { + let fd = fileio.openSync(fpath, 0o101, 0o222) + let ss = fileio.fdopenStreamSync(fd, "ab") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_017 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1800 + * @tc.name fileio_test_stream_fdopen_stream_sync_018 + * @tc.desc Function of API, mode=rb+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_018', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_018') + expect(prepareFile(fpath, "")).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + let ss = fileio.fdopenStreamSync(fd, "rb+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_018 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_1900 + * @tc.name fileio_test_stream_fdopen_stream_sync_019 + * @tc.desc Function of API, mode=rb+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_019', 0, function () { + try { + fileio.fdopenStreamSync(-1, "rb+") + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_019 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2000 + * @tc.name fileio_test_stream_fdopen_stream_sync_020 + * @tc.desc Function of API, mode=wb+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_020', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_020') + expect(prepareFile(fpath, "")).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o002) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "wb+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_020 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2100 + * @tc.name fileio_test_stream_fdopen_stream_sync_021 + * @tc.desc Function of API, mode=wb+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_021', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_021') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + let ss = fileio.fdopenStreamSync(fd, "wb+") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_021 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2200 + * @tc.name fileio_test_stream_fdopen_stream_sync_022 + * @tc.desc Function of API, mode=ab+. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_022', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_022') + expect(prepareFile(fpath, "1")).assertTrue() + let text = "0123456789abcdefg"; + try { + let fd = fileio.openSync(fpath, 0o2002) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "ab+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length + 1).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_022 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2300 + * @tc.name fileio_test_stream_fdopen_stream_sync_023 + * @tc.desc Function of API, mode=ab+. The test file is not exist. + */ + it('fileio_test_stream_fdopen_stream_sync_023', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_023') + try { + let fd = fileio.openSync(fpath, 0o102, 0o666) + let ss = fileio.fdopenStreamSync(fd, "ab+") + expect(ss !== null).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_fdopen_stream_sync_023 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2400 + * @tc.name fileio_test_stream_fdopen_stream_sync_024 + * @tc.desc Function of API, invaild fildes. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_024', 0, function () { + try { + expect(fileio.fdopenStreamSync(null, "r") == null).assertTrue() + expect(null).assertFail(); + } catch (e) { + console.log("---fileio_test_stream_fdopen_stream_sync_024 is passed!" + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FdopenStreamSync_2400 + * @tc.name fileio_test_stream_fdopen_stream_sync_025 + * @tc.desc Function of API, invaild mode. The test file is exist. + */ + it('fileio_test_stream_fdopen_stream_sync_025', 0, function () { + let fpath = nextFileName('fileio_test_stream_fdopen_stream_sync_025') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o2) + expect(fileio.fdopenStreamSync(fd, "") == null).assertTrue() + expect(null).assertFail(); + } catch (e) { + console.log("---fileio_test_stream_fdopen_stream_sync_025 is passed!" + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0000 + * @tc.name fileio_test_stream_read_sync_000 + * @tc.desc Function of API, not set options. + */ + it('fileio_test_stream_read_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_000') + let text = "0123456789abcdefg"; + expect(prepareFile(fpath, text)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096)) + expect(len == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_read_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0100 + * @tc.name fileio_test_stream_read_sync_001 + * @tc.desc Function of API, position. + */ + it('fileio_test_stream_read_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_001') + let text = "0123456789abcdefg"; + expect(prepareFile(fpath, text)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096), { + position: 1 + }) + expect(len == text.length - 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_read_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0200 + * @tc.name fileio_test_stream_read_sync_002 + * @tc.desc Function of API, offset. + */ + it('fileio_test_stream_read_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_002') + let text = "0123456789abcdefg"; + expect(prepareFile(fpath, text)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096), { + offset: 1 + }) + expect(len == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_read_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0300 + * @tc.name fileio_test_stream_read_sync_003 + * @tc.desc Function of API, length. + */ + it('fileio_test_stream_read_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_003') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096), { + length: 1 + }) + expect(len == 1).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_read_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0400 + * @tc.name fileio_test_stream_read_sync_004 + * @tc.desc Function of API, readBuf. + */ + it('fileio_test_stream_read_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_004') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(null) + expect(len == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_read_sync_004 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0500 + * @tc.name fileio_test_stream_read_sync_005 + * @tc.desc Function of API, position = -1. + */ + it('fileio_test_stream_read_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_005') + let text = "0123456789abcdefg"; + expect(prepareFile(fpath, text)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096), { + position: -1 + }) + expect(len == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("---fileio_test_stream_read_sync_005 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_ReadSync_0600 + * @tc.name fileio_test_stream_read_sync_006 + * @tc.desc Function of API, offset. + */ + it('fileio_test_stream_read_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_stream_read_sync_006') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let len = ss.readSync(new ArrayBuffer(4096), { + offset: -1 + }) + expect(len == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_read_sync_006 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0000 + * @tc.name fileio_test_stream_write_sync_000 + * @tc.desc Function of API, not set options. + */ + it('fileio_test_stream_write_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(text) == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("---fileio_test_stream_write_sync_000 is passed!") + } catch (e) { + console.log("fileio_test_stream_write_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0100 + * @tc.name fileio_test_stream_write_sync_001 + * @tc.desc Function of API, invaild encoding. + */ + it('fileio_test_stream_write_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_001') + expect(prepareFile(fpath, "")).assertTrue() + let ss + try { + ss = fileio.createStreamSync(fpath, "w+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(FILE_CONTENT, { + encoding: "ASCII" + }) !== null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_write_sync_001 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0200 + * @tc.name fileio_test_stream_write_sync_002 + * @tc.desc Function of API, position. + */ + it('fileio_test_stream_write_sync_002', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_002') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(ss.writeSync("aaa") !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == 3).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_002 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0300 + * @tc.name fileio_test_stream_write_sync_003 + * @tc.desc Function of API, offset. + */ + it('fileio_test_stream_write_sync_003', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_003') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(ss.writeSync("aaa") !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == 3).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_003 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0400 + * @tc.name fileio_test_stream_write_sync_004 + * @tc.desc Function of API, length. + */ + it('fileio_test_stream_write_sync_004', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_004') + expect(prepareFile(fpath, "a")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text) + expect(wlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + ss = fileio.createStreamSync(fpath, "r+") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_004 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0500 + * @tc.name fileio_test_stream_write_sync_005 + * @tc.desc Function of API, encoding. + */ + it('fileio_test_stream_write_sync_005', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_005') + expect(prepareFile(fpath, "")).assertTrue() + let writeStrArray = new Array("aaa", "123") + let encodingArray = new Array('utf-8', 'utf-16') + try { + for (let i = 0; i < encodingArray.length; i++) { + let ss = fileio.createStreamSync(fpath, "w+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(writeStrArray[i], { + encoding: encodingArray[i] + }) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + ss = fileio.createStreamSync(fpath, "r+") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + } + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_005 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0600 + * @tc.name fileio_test_stream_write_sync_006 + * @tc.desc Function of API, position. + */ + it('fileio_test_stream_write_sync_006', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_006') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(ss.writeSync("aaa", { + position: 1 + }) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == 4).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_006 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0700 + * @tc.name fileio_test_stream_write_sync_007 + * @tc.desc Function of API, offset. + */ + it('fileio_test_stream_write_sync_007', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_007') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(ss.writeSync("aaa", { + offset: 1 + }) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == 2).assertTrue() + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_007 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0800 + * @tc.name fileio_test_stream_write_sync_008 + * @tc.desc Function of API, length. + */ + it('fileio_test_stream_write_sync_008', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_008') + expect(prepareFile(fpath, "")).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + let wlen = ss.writeSync(text, { + length: text.length + }) + expect(wlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + ss = fileio.createStreamSync(fpath, "r+") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(rlen == text.length).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_sync_008 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_0900 + * @tc.name fileio_test_stream_write_sync_009 + * @tc.desc Function of API, invaild fcontent. + */ + it('fileio_test_stream_write_sync_009', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_009') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + ss.writeSync(-1) + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_stream_write_sync_009 has failed for " + e) + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_1000 + * @tc.name fileio_test_stream_write_sync_010 + * @tc.desc Function of API, invaild encoding. + */ + it('fileio_test_stream_write_sync_010', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_010') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(FILE_CONTENT, { + encoding: "" + }) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_write_sync_010 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_1100 + * @tc.name fileio_test_stream_write_sync_011 + * @tc.desc Function of API, invaild position. + */ + it('fileio_test_stream_write_sync_011', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_011') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(FILE_CONTENT, { + position: -1 + }) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_write_sync_011 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_WriteSync_1200 + * @tc.name fileio_test_stream_write_sync_012 + * @tc.desc Function of API, invaild offset. + */ + it('fileio_test_stream_write_sync_012', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_sync_012') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + var ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(FILE_CONTENT, { + offset: -1 + }) == null).assertTrue() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_write_sync_012 has failed for " + e) + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_write_read_4k_sync + * @tc.name fileio_test_stream_write_read_4k_sync + * @tc.desc Function of API, read 4k file. + */ + it('fileio_test_stream_write_read_4k_sync', 0, function () { + let fpath = nextFileName('fileio_test_stream_write_read_4k_sync') + expect(prepareFile(fpath, "a")).assertTrue() + expect(fileToWriteOnly(fpath)).assertTrue() + try { + let fd = fileio.openSync(fpath, 0o001) + expect(fd !== null).assertTrue() + let ss = fileio.fdopenStreamSync(fd, "w") + expect(ss !== null).assertTrue() + expect(ss.writeSync(randomString(4096)) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileToReadOnly(fpath)).assertTrue() + ss = fileio.createStreamSync(fpath, "r") + let rlen = ss.readSync(new ArrayBuffer(4096)) + expect(fileio.closeSync(fd) !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_write_read_4k_sync has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FlushSync_0000 + * @tc.name fileio_test_stream_flush_sync_000 + * @tc.desc Function of API, flushSync. + */ + it('fileio_test_stream_flush_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_flush_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let text = "0123456789abcdefg"; + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.writeSync(text) == text.length).assertTrue() + expect(ss.flushSync() !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_flush_sync_001 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_FlushSync_0100 + * @tc.name fileio_test_stream_flush_sync_001 + * @tc.desc Function of API, error. + */ + it('fileio_test_stream_flush_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stream_flush_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss !== null).assertTrue() + expect(ss.closeSync() !== null).assertTrue() + ss.flushSync() + expect(null).assertFail() + } catch (e) { + console.log("fileio_test_stream_flush_sync_001 has failed for " + e) + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CloseSync_0000 + * @tc.name fileio_test_stream_close_sync_000 + * @tc.desc Function of API, closeSync. + */ + it('fileio_test_stream_close_sync_000', 0, function () { + let fpath = nextFileName('fileio_test_stream_close_sync_000') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + try { + let ss = fileio.createStreamSync(fpath, "r+") + expect(ss.closeSync() !== null).assertTrue() + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + } catch (e) { + console.log("fileio_test_stream_close_sync_000 has failed for " + e) + expect(null).assertFail() + } + }) + + /** + * @tc.number SUB_STORAGE_FileIO_stream_CloseSync_0100 + * @tc.name fileio_test_stream_close_sync_001 + * @tc.desc Function of API, error. + */ + it('fileio_test_stream_close_sync_001', 0, function () { + let fpath = nextFileName('fileio_test_stream_close_sync_001') + expect(prepareFile(fpath, FILE_CONTENT)).assertTrue() + let ss; + try { + ss = fileio.createStreamSync(fpath, "r+") + expect(ss.closeSync() !== null).assertTrue() + expect(ss.closeSync() == null).assertTrue() + expect(null).assertFail() + } catch (e) { + expect(fileio.unlinkSync(fpath) !== null).assertTrue() + console.log("fileio_test_stream_close_sync_001 has failed for " + e) + } + }) +}) \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/js/test/List.test.js b/storage/storagefileiojstest/project/entry/src/main/js/test/List.test.js new file mode 100644 index 000000000..e8dcb6983 --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/js/test/List.test.js @@ -0,0 +1,21 @@ +/* + * 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. + */ + +require('./File.test.js') +require('./FileIO.test.js') +require('./FileIODir.test.js') +require('./FileIODirent.test.js') +require('./FileIOStat.test.js') +require('./FileIOStream.test.js') \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/resources/base/element/string.json b/storage/storagefileiojstest/project/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..2f9470d82 --- /dev/null +++ b/storage/storagefileiojstest/project/entry/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "MyApplication" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/storage/storagefileiojstest/project/entry/src/main/resources/base/media/icon.png b/storage/storagefileiojstest/project/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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