diff --git a/multimedia/media/media_js_standard/AVPlayerTestBase.js b/multimedia/media/media_js_standard/AVPlayerTestBase.js index cbd2cfe50b55e9b6d6b34a92c6ae2145f52a6309..4cca15ed95fe73745888906371938fe465bc9cfb 100644 --- a/multimedia/media/media_js_standard/AVPlayerTestBase.js +++ b/multimedia/media/media_js_standard/AVPlayerTestBase.js @@ -409,7 +409,7 @@ function setAVPlayerPlayAndPauseWithCallBack(src, avPlayer, playTime, done) { avPlayer.surfaceId = surfaceID; console.info('playPauseLoopWithCallBack play state is INITIALIZED') // step 1: initialized -> prepared -> play - preparePromise(avPlayer); + await preparePromise(avPlayer); await sleep(2000); avPlayer.play() break; @@ -509,18 +509,17 @@ export async function createToRelease(src, avPlayer, done) { avPlayer = await idle(src, avPlayer) await setSource(avPlayer, src); console.info('CreateToRelease setSource'); - if(avPlayer.state == AV_PLAYER_STATE.INITIALIZED) { - avPlayer.surfaceId = surfaceID; - await avPlayer.release().then(() => { - console.info('CreateToRelease avPlayer from stop to release') - console.info(`case CreateToRelease loop is ${i}`); - expect(avPlayer.state).assertEqual(AV_PLAYER_STATE.RELEASED); - avPlayer = null; - if(i == 999){ - done(); - } - }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); - } + await sleep(20) + avPlayer.surfaceId = surfaceID; + await avPlayer.release().then(() => { + expect(avPlayer.state).assertEqual(AV_PLAYER_STATE.RELEASED); + console.info('CreateToRelease avPlayer from stop to release') + console.info(`case CreateToRelease loop is ${i}`); + avPlayer = null; + if(i == 999){ + done(); + } + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); } } @@ -542,7 +541,7 @@ async function playToCompletedLoop(src, avPlayer, done) { avPlayer.surfaceId = surfaceID; console.info('playToCompletedLoop play state is INITIALIZED') // step 1: initialized -> prepared -> play - preparePromise(avPlayer); + await preparePromise(avPlayer); await sleep(2000); avPlayer.play() break; @@ -601,7 +600,7 @@ export async function seekLoop(src, avPlayer, done) { if(avPlayer.state == AV_PLAYER_STATE.INITIALIZED) { avPlayer.surfaceId = surfaceID; console.info('seekLoop case prepare success'); - preparePromise(avPlayer); + await preparePromise(avPlayer); await sleep(2000); } await avPlayer.play().then(() => { @@ -642,7 +641,7 @@ export async function seekLoopWithoutCallback(src, avPlayer, done) { await setSource(avPlayer, src); if(avPlayer.state == 'initialized') { avPlayer.surfaceId = surfaceID; - preparePromise(avPlayer); + await preparePromise(avPlayer); await sleep(2000); } await avPlayer.play().then(() => { @@ -2078,7 +2077,7 @@ export async function avPlayerWithoutCallBack(src, avPlayer, done) { console.info('avPlayerWithoutCallBack setSource'); if(avPlayer.state == AV_PLAYER_STATE.INITIALIZED) { avPlayer.surfaceId = surfaceID; - preparePromise(avPlayer); + await preparePromise(avPlayer); await sleep(2000); } if(avPlayer.state == AV_PLAYER_STATE.PREPARED){ @@ -2110,7 +2109,7 @@ function setAVPlayerPlay(src, avPlayer, done) { avPlayer.surfaceId = surfaceID; console.info('setAVPlayerPlay play state is INITIALIZED') // step 1: initialized -> prepared -> play - preparePromise(avPlayer) + await preparePromise(avPlayer) await sleep(3000); avPlayer.play() break; diff --git a/multimedia/media/media_js_standard/AVRecorderTestBase.js b/multimedia/media/media_js_standard/AVRecorderTestBase.js index efadf2f66e2af5974c4be9367f27be73b73743a6..27bb7cb23e8740fbbe802e8a615c112a3814c2d5 100644 --- a/multimedia/media/media_js_standard/AVRecorderTestBase.js +++ b/multimedia/media/media_js_standard/AVRecorderTestBase.js @@ -18,15 +18,13 @@ import * as mediaTestBase from './MediaTestBase.js'; async function idleCallBack(avRecorder) { console.info('case createAVRecorder called'); - await media.createAVRecorder().then((recorder) => { + await media.createAVRecorder((error, recorder) => { if (recorder != null) { avRecorder = recorder; console.info('createAVRecorder success'); } else { - console.info('createAVRecorder fail'); + console.info(`createAVRecorder fail, error:${error}`); } - }).catch((error) => { - console.info(`createAVRecorder catchCallback, error:${error}`); }); return avRecorder; } diff --git a/multimedia/media/media_js_standard/avPlayer/Test.json b/multimedia/media/media_js_standard/avPlayer/Test.json index 7d452df46b09bc0a02817ff377c07e45d33cc298..7ba4f9113ba75c065972e5558ec476475c9c37eb 100644 --- a/multimedia/media/media_js_standard/avPlayer/Test.json +++ b/multimedia/media/media_js_standard/avPlayer/Test.json @@ -5,8 +5,8 @@ "test-timeout": "180000", "bundle-name": "ohos.acts.multimedia.avplayer", "module-name": "phone", - "shell-timeout": "5000000", - "testcase-timeout": 800000 + "shell-timeout": "9000000", + "testcase-timeout": 850000 }, "kits": [ { diff --git a/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekAPITest.test.js b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekAPITest.test.js new file mode 100644 index 0000000000000000000000000000000000000000..3d9fe69052aa9116fe13955acad30161ad6d6632 --- /dev/null +++ b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekAPITest.test.js @@ -0,0 +1,823 @@ +/* + * Copyright (C) 2023 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 * as mediaTestBase from '../../../../../../MediaTestBase.js'; +import media from '@ohos.multimedia.media' +import fileio from '@ohos.fileio' +import { testAVPlayerFun, AV_PLAYER_STATE, setSource } from '../../../../../../AVPlayerTestBase.js'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'; + +export default function AVPlayerDataSrcNoSeekAPITest() { + describe('AVPlayerDataSrcNoSeekAPITest', function () { + const PLAY_TIME = 1000; + const TAG = 'AVPlayerLocalAPITest:'; + const CREATE_EVENT = 'create'; + const SETURL_EVENT = 'setUrl'; + const SETFDSRC_EVENT = 'setfdSrc'; + const SETSOURCE_EVENT = 'setSource'; + const SETDATASRC_NOSEEK_EVENT = 'setDataSourceNoseek'; + const SETSURFACE_EVENT = 'setDisplaySurface'; + const GETDESCRIPTION_PROMISE = 'getTrackDescriptionPromise'; + const GETDESCRIPTION_CALLBACK = 'getTrackDescriptionCallback'; + const PREPARE_EVENT = 'prepare'; + const PLAY_EVENT = 'play'; + const PAUSE_EVENT = 'pause'; + const STOP_EVENT = 'stop'; + const RESET_EVENT = 'reset'; + const RELEASE_EVENT = 'release'; + const SEEK_EVENT = 'seek'; + const SEEK_FUNCTION_EVENT = 'seek_function'; + const SPEED_FUNCTION_EVENT = 'speed_function'; + const PLAY_FUNCTION_EVENT = 'play_function'; + const SETVOLUME_EVENT = 'volume'; + const SETSPEED_EVENT = 'speed'; + const FINISH_EVENT = 'finish'; + const ERROR_EVENT = 'error'; + const LOOP_EVENT = 'loop'; + const END_EVENT = 'end'; + const DELTA_TIME = 1000; + let pathDir = globalThis.abilityContext.filesDir; + let stepCount = 0; + let testTag = 'test'; + let events = require('events'); + let eventEmitter = new events.EventEmitter(); + let path_mp3 = pathDir + "/01_15s.mp3"; + let path_h264_mp3_ts = pathDir + "/h264_mp3_640x480_25r.ts"; + let path_mpeg4_mkv = pathDir + "/mpeg4_none_audio.mkv"; + let readAtList = new Array(); + let fdList = new Array(); + let srcList = new Array(); + let pathList = new Array(); + let avPlayer = null; + + let surfaceID = globalThis.value; + let testCount = 0; + let myStepsList = new Array(); + let myStepsNameList = new Array(); + let testFdSource; + let testDataSource; + let srcCount = 0; + let duration = 0; + let durationTag = -100; + let halfDurationTag = -50; + let speedValue = -1; + let videoInfor = new Array({ + type : 'video_audio', + width: 720, + height: 640, + duration: 10034, + state: '', + PREV_FRAME: 4166, + NEXT_FRAME: 8333, + }, { + type : 'audio', + width: 0, + height: 0, + duration: 219600, + state: '', + PREV_FRAME: 0, + NEXT_FRAME: 0, + }, { + type : 'video', + width: 720, + height: 640, + duration: 10034, + state: '', + PREV_FRAME: 5000, + NEXT_FRAME: 10001, + }); + + let descriptionKey01 = new Array(['bitrate', 'codec_mime', 'frame_rate', 'height', + 'track_index', 'track_type', 'width'], ['bitrate', 'channel_count', 'codec_mime', 'sample_rate', + 'track_index', 'track_type']); + let descriptionValue01 = new Array([1366541, 'video/avc', 6000, 480, 0, 1, 720], [129207, 2, 'audio/mp4a-latm', 44100, 1, 0]); + let descriptionKey02 = new Array(['channel_count', 'codec_mime', 'sample_rate', 'track_index', 'track_type']); + let descriptionValue02 = new Array([1, 'audio/mpeg', 48000, 0, 0]); + let descriptionKey03 = new Array(['bitrate', 'codec_mime', 'frame_rate', 'height', 'track_index', 'track_type', 'width']); + let descriptionValue03 = new Array([1506121, 'video/avc', 6000, 480, 0, 1, 720]); + let descriptionKey = new Array(descriptionKey01, descriptionKey02, descriptionKey03); + let descriptionValue = new Array(descriptionValue01, descriptionValue02, descriptionValue03); + + beforeAll(async function () { + console.info('beforeAll case'); + + pathList = new Array(path_mp3, path_h264_mp3_ts, path_mpeg4_mkv); + for (let i = 0; i < pathList.length; i++) { + fdList.push(fileio.openSync(pathList[i], 0o0)); + readAtList.push(setReadAt(fdList[i], pathList[i])); + srcList.push( {fileSize: -1, callback: readAtList[i]} ); + console.info('fdList:' + fdList[i]); + } + }) + beforeEach(async function () { + testDataSource = srcList[0]; + srcCount = 0; + testCount = 0; + stepCount = 0; + console.info('beforeEach case'); + }) + + afterEach(async function () { + if (avPlayer != null) { + avPlayer.release().then(() => { + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + } + avPlayer = null; + console.info('afterEach case'); + }) + + function setReadAt(fd, filePath) { + let readAt = (buf, length, pos) => { + console.info(' readAt:' + length); + let num = 0; + if (buf == undefined || length == undefined) { + expect().assertFail(); + return -1; + } + if (pos == undefined) { + num = fileio.readSync(fd, buf, {offset: 0, length: length}); + if (num == 0) { + fileio.closeSync(fd); + fd = fileio.openSync(filePath, 0o0); + } + } else { + num = stream.readSync(buf, {offset: 0, length: length, position: pos}); + } + console.info(' readAt num:' + num); + if (num > 0) { + return num; + } + return -1; + } + return readAt; + } + function setReadAtErr(fd, filePath) { + let readAt = (buf, length, pos) => { + console.info(' readAt:' + length); + let num = 0; + if (buf == undefined || length == undefined) { + expect().assertFail(); + return -1; + } + num = fileio.readSync(fd, buf, {offset: 1000, length: 2000}); + if (num == 0) { + fileio.closeSync(fd); + fd = fileio.openSync(filePath, 0o0); + } + console.info(' readAt num:' + num); + if (num > 0) { + return num; + } + return -1; + } + return readAt; + } + function openFileFailed() { + console.info('case file fail'); + } + + afterAll(async function () { + console.info('afterAll case'); + for (let i = 0; i < srcList.length; i++) { + fileio.closeSync(fdList[i]); + } + }) + + async function setOtherCallback(avPlayer, steps, done) { + avPlayer.on('error', (error) => { + console.error(TAG + 'error happened,message is :' + error.message) + if (steps[stepCount] == ERROR_EVENT) { + stepCount++; + toNextStep(avPlayer, steps, done); + } else { + expect().assertFail(); + steps[stepCount] = END_EVENT; + avPlayer.release((err) => { + if (err == undefined) { + console.info(TAG + ' release success'); + } else { + console.info(TAG + 'error happened, release failed,message is :' + err.message); + } + }) + } + }) + // 时间戳变化上报函数 + avPlayer.on('timeUpdate', (time) => { + console.info(TAG + 'timeUpdate called: time is :' + time) + }) + // 音量变化上报函数 + avPlayer.on('volumeChange', (vol) => { + console.info(TAG + 'volumeChange success,and new volume is :' + vol) + toNextStep(avPlayer, steps, done); + }) + // 视频播放结束触发回调 + avPlayer.on('endOfStream', () => { + console.info(TAG + 'endOfStream success') + }) + // seek操作回调函数 + avPlayer.on('seekDone', (seekDoneTime) => { + console.info(TAG + 'seekDone success,and seek time is:' + seekDoneTime) + expect(seekDoneTime).assertEqual(steps[stepCount - 2] == durationTag ? duration : steps[stepCount - 2]); + toNextStep(avPlayer, steps, done); + }) + // 设置倍速播放回调函数 + avPlayer.on('speedDone', (speed) => { + console.info(TAG + 'speedDone success,and speed value is:' + speed) + expect(speed).assertEqual(steps[stepCount]); + stepCount++; + toNextStep(avPlayer, steps, done); + }) + // bitrate设置成功回调函数 + avPlayer.on('bitrateDone', (bitrate) => { + console.info(TAG + 'bitrateDone success,and bitrate value is:' + bitrate) + }) + // 缓冲上报回调函数 + avPlayer.on('bufferingUpdate', (infoType, value) => { + console.info(TAG + 'bufferingUpdate success,and infoType value is:' + infoType + ', value is :' + value) + }) + // duration 变化函数上报 + avPlayer.on('durationUpdate', (duration) => { + console.info(TAG + 'durationUpdate called,duration:' + duration) + }) + // 首帧上报回调函数 + avPlayer.on('startRenderFrame', () => { + console.info(TAG + 'startRenderFrame success') + }) + // 视频宽高上报回调函数 + avPlayer.on('videoSizeChange', (width, height) => { + console.info(TAG + 'videoSizeChange success,and width is:' + width + ', height is :' + height) + }) + // 焦点上报回调函数 + avPlayer.on('audioInterrupt', (info) => { + console.info(TAG + 'audioInterrupt success,and InterruptEvent info is:' + info) + }) + // HLS上报所有支持的比特率 + avPlayer.on('availableBitrates', (bitrates) => { + console.info(TAG + 'availableBitrates success,and availableBitrates length is:' + bitrates.length) + }) + } + + // 状态机变化回调函数 + async function setStateChangeCallback(avPlayer, steps, done) { + avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case AV_PLAYER_STATE.IDLE: + console.info(TAG + 'state idle called') + break; + case AV_PLAYER_STATE.INITIALIZED: + toNextStep(avPlayer, steps, done); + console.info(TAG + 'state initialized called ') + break; + case AV_PLAYER_STATE.PREPARED: + console.info(TAG + 'state prepared called') + break; + case AV_PLAYER_STATE.PLAYING: + console.info(TAG + 'state playing called') + break; + case AV_PLAYER_STATE.PAUSED: + console.info(TAG + 'state paused called') + break; + case AV_PLAYER_STATE.COMPLETED: + console.info(TAG + 'state completed called') + toNextStep(avPlayer, steps, done); + break; + case AV_PLAYER_STATE.STOPPED: + console.info(TAG + 'state stopped called') + break; + case AV_PLAYER_STATE.RELEASED: + console.info(TAG + 'state released called') + break; + case AV_PLAYER_STATE.ERROR: + console.info(TAG + 'state error called') + break; + default: + console.info(TAG + 'unkown state :' + state) + break; + } + }) + } + + // 释放数组内存 + function deleteArrayList() { + for (let i = 0; i < myStepsList.length; i++) { + console.info(TAG + 'case delete myStepsList!!'); + myStepsList[i].length = 0; + } + myStepsList.length = 0; + myStepsNameList.length = 0; + console.info(TAG + 'case delete myStepsNameList!!'); + } + + // 执行下一步操作函数 + async function toNextStep(avPlayer, steps, done) { + console.info(TAG + 'next step is :' + steps[stepCount]); + if (steps[stepCount] == END_EVENT) { + avPlayer = null; + if ((testCount == myStepsList.length)) { + if (srcCount == (srcList.length - 1)) { + console.info(TAG + 'case success!!'); + deleteArrayList(); + done(); + } else { + stepCount = 0; + srcCount++; + testDataSource = srcList[srcCount]; + testCount = 0; + eventEmitter.emit(testTag); + } + } else { + stepCount = 0; + console.info(TAG + 'start next step,and length is:' + testCount) + eventEmitter.emit(testTag); + } + } else { + eventEmitter.emit(steps[stepCount], avPlayer, steps, done); + } + } + + // 触发create事件,创建avplayer实例对象 + eventEmitter.on(CREATE_EVENT, (avPlayer, steps, done) => { + stepCount++; + media.createAVPlayer((err, video) => { + if (video != null) { + avPlayer = video; + // 设置状态机回调函数 + setStateChangeCallback(avPlayer, steps, done); + setOtherCallback(avPlayer, steps, done); + expect(avPlayer.state).assertEqual('idle'); + console.info(TAG + 'createVideoPlayer success!!'); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // 设置播放源,即avplayer.url的值 + eventEmitter.on(SETSOURCE_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.url = steps[stepCount]; + stepCount++; + }); + + // 设置播放源,即avplayer.fdSrc的值 + eventEmitter.on(SETFDSRC_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.fdSrc = testFdSource; + }); + + // 设置播放源,即avplayer.fdSrc的值 + eventEmitter.on(SETDATASRC_NOSEEK_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.dataSrc = testDataSource; + }); + + // 设置surfaceID + eventEmitter.on(SETSURFACE_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.surfaceId = steps[stepCount]; + stepCount++; + toNextStep(avPlayer, steps, done); + }); + + // prepare 操作 + eventEmitter.on(PREPARE_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.prepare((err) => { + if (err == null) { + console.info(TAG + 'prepare success!!'); + duration = avPlayer.duration; + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'prepare error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // play 操作 + eventEmitter.on(PLAY_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.play(async (err) => { + if (err == null) { + console.info(TAG + 'play success!!'); + await mediaTestBase.msleepAsync(PLAY_TIME); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'play error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // pause 操作 + eventEmitter.on(PAUSE_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.pause(async (err) => { + if (err == null) { + console.info(TAG + 'pause success!!'); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'pause error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // stop 操作 + eventEmitter.on(STOP_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.stop(async (err) => { + if (err == null) { + console.info(TAG + 'stop success!!'); + + fileio.closeSync(fdList[srcCount]); + fdList[srcCount] = fileio.openSync(pathList[srcCount], 0o0); + + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'stop error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // reset 操作 + eventEmitter.on(RESET_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.reset(async (err) => { + if (err == null) { + console.info(TAG + 'reset success!!'); + fileio.closeSync(fdList[srcCount]); + fdList[srcCount] = fileio.openSync(pathList[srcCount], 0o0); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'reset error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // seek 操作 + eventEmitter.on(SEEK_EVENT, (avPlayer, steps, done) => { + let seekTime = steps[stepCount + 1]; + if (seekTime == durationTag) { + seekTime = videoInfor[srcCount].duration; + } + let seekMode = steps[stepCount + 2]; + stepCount = stepCount + 3 + avPlayer.seek(seekTime, seekMode); + }); + + // 设置音量操作 + eventEmitter.on(SETVOLUME_EVENT, (avPlayer, steps, done) => { + let volumeValue = steps[stepCount + 1]; + stepCount = stepCount + 2; + avPlayer.setVolume(volumeValue) + }); + + // 设置倍数操作 + eventEmitter.on(SETSPEED_EVENT, (avPlayer, steps, done) => { + let speedValue = steps[stepCount + 1]; + stepCount++; + avPlayer.setSpeed(speedValue); + }); + + // 设置loop值 + eventEmitter.on(LOOP_EVENT, (avPlayer, steps, done) => { + let loopValue = steps[stepCount + 1]; + stepCount = stepCount + 2 + avPlayer.loop = loopValue; + if ((steps[stepCount] != ERROR_EVENT)) { + toNextStep(avPlayer, steps, done); + } + }); + + // 等待complete上报 + eventEmitter.on(FINISH_EVENT, (avPlayer, steps, done) => { + stepCount++ + console.info(TAG + 'wait for completed called'); + }); + + + // 释放avplayer实例对象 + eventEmitter.on(RELEASE_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.release((err) => { + if (err == null) { + console.info(TAG + 'release success!!'); + fileio.closeSync(fdList[srcCount]); + fdList[srcCount] = fileio.openSync(pathList[srcCount], 0o0); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + toNextStep(avPlayer, steps, done); + console.info(TAG + 'release failed, and message is:' + err.message); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // function seek 调用接口: SUB_MULTIMEDIA_MEDIA_AVPLAYER_FUNCTION_SEEK + async function checkSeekTime(avPlayer, seekTime, seekMode) { + console.info(TAG + 'test currentTime is:' + avPlayer.currentTime); + switch (seekTime) { + case 0: + if (seekMode == media.SeekMode.SEEK_PREV_SYNC) { + expect(avPlayer.currentTime - 0).assertLess(DELTA_TIME); + } else { + expect(avPlayer.currentTime - videoInfor[srcCount].PREV_FRAME).assertLess(DELTA_TIME); + } + break; + case videoInfor[srcCount].duration / 2: + if (seekMode == media.SeekMode.SEEK_PREV_SYNC) { + expect(avPlayer.currentTime - videoInfor[srcCount].PREV_FRAME).assertLess(DELTA_TIME); + } else { + expect(avPlayer.currentTime - videoInfor[srcCount].NEXT_FRAME).assertLess(DELTA_TIME); + } + break; + case videoInfor[srcCount].duration: + if (seekMode == media.SeekMode.SEEK_PREV_SYNC) { + expect(avPlayer.currentTime - videoInfor[srcCount].NEXT_FRAME).assertLess(DELTA_TIME); + } else { + expect(avPlayer.currentTime - seekTime).assertLess(DELTA_TIME); + } + break; + } + } + + eventEmitter.on(SEEK_FUNCTION_EVENT, (avPlayer, steps, done) => { + let seekTime; + if (steps[stepCount + 1] == halfDurationTag) { + seekTime = videoInfor[srcCount].duration / 2; + } else if (steps[stepCount + 1] == durationTag) { + seekTime = videoInfor[srcCount].duration; + } else { + seekTime = steps[stepCount + 1]; + } + let seekMode = steps[stepCount + 2]; + // seek操作回调函数 + avPlayer.on('seekDone', (seekDoneTime) => { + console.info(TAG + 'seekDone success, seekTime is ' + seekTime + ' seekDoneTime time is:' + seekDoneTime); + expect(seekDoneTime).assertEqual(seekTime); + if (videoInfor[srcCount].type == 'audio') { + expect(avPlayer.currentTime - seekDoneTime).assertLess(DELTA_TIME); + } else { + checkSeekTime(avPlayer, seekTime, seekMode); + } + toNextStep(avPlayer, steps, done); + }) + stepCount = stepCount + 3 + avPlayer.seek(seekTime, seekMode); + }); + + // function speed 调用接口: SUB_MULTIMEDIA_MEDIA_AVPLAYER_FUNCTION_SPEED + function checkSpeedTime(avPlayer, speedValue, startTime) { + let newTime = avPlayer.currentTime; + console.info(TAG + 'start checkSpeedTime 22,new time is :' + newTime); + if (avPlayer.state == 'playing') { + switch (speedValue) { + case media.PlaybackSpeed.SPEED_FORWARD_0_75_X: + console.error('checkSpeedTime time is :' + (newTime - startTime)); + expect(Math.abs(newTime - startTime - (0.75 * PLAY_TIME))).assertLess(DELTA_TIME * 0.75); + break; + case media.PlaybackSpeed.SPEED_FORWARD_1_00_X: + console.error('checkSpeedTime time is :' + (newTime - startTime)); + expect(Math.abs(newTime - startTime - (PLAY_TIME))).assertLess(DELTA_TIME); + break; + case media.PlaybackSpeed.SPEED_FORWARD_1_25_X: + console.error('checkSpeedTime time is :' + (newTime - startTime)); + expect(Math.abs(newTime - startTime - (1.25 * PLAY_TIME))).assertLess(DELTA_TIME * 1.25); + break; + case media.PlaybackSpeed.SPEED_FORWARD_1_75_X: + console.error('checkSpeedTime time is :' + (newTime - startTime)); + expect(Math.abs(newTime - startTime - (1.75 * PLAY_TIME))).assertLess(DELTA_TIME * 1.75); + break; + case media.PlaybackSpeed.SPEED_FORWARD_2_00_X: + console.error('checkSpeedTime time is :' + (newTime - startTime)); + expect(Math.abs(newTime - startTime - (2 * PLAY_TIME))).assertLess(DELTA_TIME * 2); + break; + } + } else { + console.info('case speed not in play'); + } + } + + eventEmitter.on(SPEED_FUNCTION_EVENT, (avPlayer, steps, done) => { + let testSpeedValue = steps[stepCount + 1]; + stepCount = stepCount + 2; + avPlayer.on('speedDone', (speed) => { + console.info(TAG + 'speedDone success, set speed value is ' + testSpeedValue + ' speed value is:' + speed) + expect(speed).assertEqual(testSpeedValue); + speedValue = speed; + toNextStep(avPlayer, steps, done); + }) + avPlayer.setSpeed(testSpeedValue); + }); + + eventEmitter.on(PLAY_FUNCTION_EVENT, (avPlayer, steps, done) => { + stepCount++; + avPlayer.play(async (err) => { + if (err == null) { + let startTime = avPlayer.currentTime; + console.info(TAG + 'start checkSpeedTime 11,start time is :' + startTime); + await mediaTestBase.msleepAsync(PLAY_TIME); + //checkSpeedTime(avPlayer, speedValue, startTime); + toNextStep(avPlayer, steps, done); + } else if ((err != null) && (steps[stepCount] == ERROR_EVENT)) { + stepCount++; + console.info(TAG + 'play error happened,and message is :' + err.message); + toNextStep(avPlayer, steps, done); + } else { + mediaTestBase.printError(err, done); + } + }); + }); + + // gettreckdescription promise + eventEmitter.on(GETDESCRIPTION_PROMISE, async (avPlayer, steps, done) => { + let arrayDescription; + stepCount++; + await avPlayer.getTrackDescription().then((arrayList) => { + console.info('case getTrackDescription called!!'); + if (typeof (arrayList) != 'undefined') { + arrayDescription = arrayList; + expect(descriptionKey[srcCount].length).assertEqual(arrayDescription.length); + for (let i = 0; i < arrayDescription.length; i++) { + mediaTestBase.checkDescription(arrayDescription[i], descriptionKey[srcCount][i], descriptionValue[srcCount][i]); + } + toNextStep(avPlayer, steps, done); + } else { + console.info('case getTrackDescription is null'); + expect().assertFail(); + done(); + } + }, (error) => { + console.info(TAG + 'getTrackDescription error happened,and message is :' + error.message); + if (steps[stepCount] == ERROR_EVENT) { + stepCount++; + toNextStep(avPlayer, steps, done); + } + }).catch(mediaTestBase.catchCallback); + }); + + // gettreckdescription callback + eventEmitter.on(GETDESCRIPTION_CALLBACK, async (avPlayer, steps, done) => { + stepCount++; + avPlayer.getTrackDescription((error, arrayList) => { + if (error == null) { + expect(descriptionKey[srcCount].length).assertEqual(arrayList.length); + for (let i = 0; i < arrayList.length; i++) { + mediaTestBase.checkDescription(arrayList[i], descriptionKey[srcCount][i], descriptionValue[srcCount][i]); + } + toNextStep(avPlayer, steps, done); + } else { + if (steps[stepCount] == ERROR_EVENT) { + stepCount++; + console.info(TAG + 'getTrackDescription error happened,and message is :' + error.message); + toNextStep(avPlayer, steps, done); + } + } + }) + }); + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_STATE_PREPARED + * @tc.name : 001.test prepared stateChange + * @tc.desc : Local Video playback control test + * @tc.size : MediumTest + * @tc.type : Function test + * @tc.level : Level0 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_STATE_PREPARED', 0, async function (done) { + testTag = 'test_prepared'; + myStepsNameList.push("prepared -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> setDataSource (initialized)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, SETDATASRC_NOSEEK_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> released (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> prepare (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, PREPARE_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> play (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, PLAY_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> pause (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, PAUSE_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> stop (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, STOP_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> seek (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> setsurfaceID (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, SETSURFACE_EVENT, surfaceID, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> reset -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, RESET_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek(error) -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek(error) -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek(error) -> seek (prepared)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, SEEK_EVENT, 8000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek(error) -> play (playing)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, PLAY_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek(error) -> stop (stopped)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, STOP_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> seek -> prepared (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, PREPARE_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> seek (prepared)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> stop (stopped)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, STOP_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> pause (paused)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, PAUSE_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play(loop = 0) -> eos (completed)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, LOOP_EVENT, false, ERROR_EVENT, PLAY_EVENT, FINISH_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> setSource (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, SETDATASRC_NOSEEK_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> prepare (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, PREPARE_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> surfaceid (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, SETSURFACE_EVENT, surfaceID, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> play -> play (playing)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PLAY_EVENT, PLAY_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> prepare (prepared)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, PREPARE_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> setSource (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, SETDATASRC_NOSEEK_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> play (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, PLAY_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> pause (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, PAUSE_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> seek (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, SEEK_EVENT, 5000, media.SeekMode.SEEK_NEXT_SYNC, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> surfaceid (error)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, SETSURFACE_EVENT, surfaceID, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> stop -> stop (stopped)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, STOP_EVENT, STOP_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> url -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SETDATASRC_NOSEEK_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> url -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SETDATASRC_NOSEEK_EVENT, ERROR_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> pause -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PAUSE_EVENT, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> pause -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PAUSE_EVENT, ERROR_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> surfaceid -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SETSURFACE_EVENT, surfaceID, ERROR_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> surfaceid -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, SETSURFACE_EVENT, surfaceID, ERROR_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> prepared -> release (released)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PREPARE_EVENT, RELEASE_EVENT, END_EVENT)); + myStepsNameList.push("prepared -> prepared -> reset (idle)"); + myStepsList.push(new Array(CREATE_EVENT, SETDATASRC_NOSEEK_EVENT, SETSURFACE_EVENT, surfaceID, PREPARE_EVENT, PREPARE_EVENT, RESET_EVENT, RELEASE_EVENT, END_EVENT)); + + eventEmitter.on('test_prepared', () => { + console.info(TAG + '**************************test video or audio name is :'+ pathList[srcCount] +'*****************'); + console.info(TAG + '**************************this is state playing test: ' + (testCount + 1) + ' testcase start****************'); + console.info(TAG + '**************************this is state playing test: ' + myStepsNameList[testCount] + ' ****************'); + let avPlayer = null; + eventEmitter.emit(myStepsList[testCount][stepCount], avPlayer, myStepsList[testCount], done); + testCount++; + }); + eventEmitter.emit(testTag); + }) + }) +} diff --git a/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekCompatibilityTest.test.js b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekCompatibilityTest.test.js new file mode 100644 index 0000000000000000000000000000000000000000..8b900eefee00a3ae56cfca0025f21a562fba1266 --- /dev/null +++ b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekCompatibilityTest.test.js @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2023 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 media from '@ohos.multimedia.media' +import fileio from '@ohos.fileio' +import {testAVPlayerDataSrcNoSeek, testAVPlayerFun} from '../../../../../../AVPlayerTestBase.js'; +import * as mediaTestBase from '../../../../../../MediaTestBase.js'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'; + +export default function AVPlayerDataSrcNoSeekCompatibilityTest() { + describe('AVPlayerDataSrcNoSeekCompatibilityTest', function () { + const PLAY_TIME = 3000; + let avPlayer = null; + let avPlayTest = { + width: 0, + height: 0, + duration: -1, + } + let pathDir = globalThis.abilityContext.filesDir; + let filePath = pathDir + "/01.mp3"; + let stream = null; + let fd = null; + let srcNoSeek = { + fileSize: -1, + callback: readAtNoSeek + } + beforeAll(async function() { + console.info('beforeAll case'); + }) + + beforeEach(async function() { + console.info('beforeEach case'); + }) + + afterEach(async function() { + console.info('afterEach case'); + }) + + afterAll(async function() { + console.info('afterAll case'); + if (avPlayer != null) { + avPlayer.release().then(() => { + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + } + }) + + function readAtNoSeek(buf, length) { + console.info(' readAt length:' + length); + let num = 0; + if (buf == undefined || length == undefined) { + expect().assertFail(); + return -1; + } + num = fileio.readSync(fd, buf, {offset: 0, length: length}); + console.info('case readAt num:' + num); + if (num == 0) { + fileio.closeSync(fd); + fd = fileio.openSync(filePath, 0o0); + } + if (num > 0) { + return num; + } + return -1; + } + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_MP3_0100 + * @tc.name : 0100.mp3 + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level0 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_MP3_0100', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 0, height: 0, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_AAC_0100 + * @tc.name : 0100.aac_48ksr_16kbr_1ch + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level0 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_AAC_0100', 0, async function (done) { + filePath = pathDir + "/aac_48ksr_16kbr_1ch.aac"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 0, height: 0, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_OGG_0100 + * @tc.name : 0100.vorbis_48ksr_32kbr_1ch + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_OGG_0100', 0, async function (done) { + filePath = pathDir + "/vorbis_48ksr_32kbr_1ch.ogg"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 0, height: 0, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_WAV_0100 + * @tc.name : 0100.pcm_96ksr_64kbr_2ch + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_WAV_0100', 0, async function (done) { + filePath = pathDir + "/pcm_96ksr_64kbr_2ch.wav"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 0, height: 0, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_FLAC_0100 + * @tc.name : 0100.flac_48ksr_32kbr_2ch + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_FLAC_0100', 0, async function (done) { + filePath = pathDir + "/flac_48ksr_32kbr_2ch.flac"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 0, height: 0, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_MKV_0100 + * @tc.name : 0100.mpeg4_aac_1080p_60r.mkv + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_MKV_0100', 0, async function (done) { + filePath = pathDir + "/mpeg4_aac_1080p_60r.mkv"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 1920, height: 1080, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_WEBM_0100 + * @tc.name : 0100.vp8_vorbis_270p_10r.webm + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_WEBM_0100', 0, async function (done) { + filePath = pathDir + "/vp8_vorbis_270p_10r.webm"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 360, height: 270, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_TS_0100 + * @tc.name : 0100.h264_aac_640x480_30r.ts + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level1 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_TS_0100', 0, async function (done) { + filePath = pathDir + "/h264_aac_640x480_30r.ts"; + console.info(`case filePath is ${filePath}`); + fd = fileio.openSync(filePath, 0o0); + avPlayTest = { width: 640, height: 480, duration: 0 }; + await testAVPlayerDataSrcNoSeek(srcNoSeek, avPlayer, avPlayTest, PLAY_TIME, done); + }) + }); +} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekReliabilityTest.test.js b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekReliabilityTest.test.js new file mode 100644 index 0000000000000000000000000000000000000000..f67733fd864fc1ae1bb10b5a811f733e1df60466 --- /dev/null +++ b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerDataSrcNoSeekReliabilityTest.test.js @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2023 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 media from '@ohos.multimedia.media' +import fileio from '@ohos.fileio' +import {testAVPlayerDataSrcNoSeek, testAVPlayerFun, AV_PLAYER_STATE} from '../../../../../../AVPlayerTestBase.js'; +import * as mediaTestBase from '../../../../../../MediaTestBase.js'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'; + +export default function AVPlayerDataSrcNoSeekReliabilityTest() { + describe('AVPlayerDataSrcNoSeekReliabilityTest', function () { + let avPlayer = null; + let pathDir = globalThis.abilityContext.filesDir; + let filePath = pathDir + "/01_15s.mp3"; + let src = null; + let stream = null; + let fd = null; + let readAtCnt = 0; + let expectErr = 0; + beforeAll(async function() { + console.info('beforeAll case'); + }) + + beforeEach(async function() { + console.info('beforeEach case'); + stream = null; + fd = null; + readAtCnt = 0; + expectErr = 0; + }) + + afterEach(async function() { + console.info('afterEach case'); + }) + + afterAll(async function() { + console.info('afterAll case'); + if (avPlayer != null) { + avPlayer.release().then(() => { + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + } + }) + async function testDataSrcNoSeek(done) { + await media.createAVPlayer().then((video) => { + if (typeof(video) != 'undefined') { + console.info('case createAVPlayer success'); + avPlayer = video; + setCallback(done); + avPlayer.dataSrc = src; + } else { + console.error('case createAVPlayer failed'); + expect().assertFail(); + done(); + } + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + } + function setCallback(done) { + avPlayer.on('stateChange', async (state, reason) => { + console.info(`case state is ${state}`); + switch (state) { + case AV_PLAYER_STATE.INITIALIZED: + console.info(`case AVPlayerTestBase.AV_PLAYER_STATE.INITIALIZED`); + expect(avPlayer.state).assertEqual(AV_PLAYER_STATE.INITIALIZED); + avPlayer.surfaceId = globalThis.value; + console.info(`case toPreparePromise`); + await avPlayer.prepare().then(() => { + console.info('case prepare success'); + avPlayer.play(); + }, mediaTestBase.expectFailureCallback).catch(mediaTestBase.catchCallback); + break; + case AV_PLAYER_STATE.COMPLETED: + avPlayer.release().then(() => { + avPlayer = null; + done(); + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + case AV_PLAYER_STATE.ERROR: + avPlayer.release().then(() => { + avPlayer = null; + done(); + }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); + break; + default: + break; + } + }) + avPlayer.on('seekDone', async (seekDoneTime) => { + console.info(`case seekDone called, seekDoneCnt is ${seekDoneCnt}, seekDoneTime is ${seekDoneTime}`); + }) + avPlayer.on('error', async (err) => { + console.error(`case error called, errCode is ${err.code}, errMessage is ${err.message}`); + expect(err.code).assertEqual(expectErr); + }); + } + function readErr(buf, length) { + let num = fileio.readSync(fd, buf, {offset: 0, length: 1000}); + return num; + } + function readAt(buf, length, pos) { + console.info(' readAtCnt:' + readAtCnt + ' readAt:' + length + ' pos: ' + pos); + readAtCnt++; + let num = 0; + if (buf == undefined || length == undefined) { + console.info(' buf == undefined || length == undefined' ); + expect().assertFail(); + return -1; + } + num = readErr(buf, length); + if (num != -1) { + console.info('case readAt num:' + num); + return num; + } else if (pos == undefined) { + num = fileio.readSync(fd, buf, {offset: 0, length: length}); + if (num == 0) { + fileio.closeSync(fd); + fd = fileio.openSync(filePath, 0o0); + readAtCnt = 0; + return -1; + } + } else { + num = stream.readSync(buf, {offset: 0, length: length, position: pos}); + } + console.info('case readAt num:' + num); + if (num >= 0) { + return num; + } + return -1; + } + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0100 + * @tc.name : 0100.readAt buffer data is not enough + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level3 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0100', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + console.info('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0100 filePath is '+JSON.stringify(filePath)); + let size = fileio.statSync(filePath).size; + console.info('case file size:' + size); + fd = fileio.openSync(filePath, 0o0); + readErr = (buf, length) => { + if (readAtCnt >= 2 && readAtCnt <= 10) { + let num = fileio.readSync(fd, buf, {offset: 0, length: (readAtCnt ) * 1000}); + return num; + } else { + return -1; + } + } + src = { + fileSize: -1, + callback: readAt + } + testDataSrcNoSeek(done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0200 + * @tc.name : 0200.readAt buffer offset is wrong + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level3 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0200', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + fd = fileio.openSync(filePath, 0o0); + readErr = (buf, length) => { + if (readAtCnt >= 2 && readAtCnt <= 10) { + console.info('case buf length:' + length + 'readAtCnt:' + readAtCnt); + let num = fileio.readSync(fd, buf, {offset: 1000, length: readAtCnt * 1000}); + return num; + } else { + return -1; + } + } + src = { + fileSize: -1, + callback: readAt + } + testDataSrcNoSeek(done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0300 + * @tc.name : 0200.readAt media file position is wrong + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level3 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0300', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + fd = fileio.openSync(filePath, 0o0); + readErr = (buf, length) => { + if (readAtCnt >= 2 && readAtCnt <= 10) { + let num = fileio.readSync(fd, buf, {offset: 0, length: 1000, position: readAtCnt}); + return num; + } else { + return -1; + } + } + src = { + fileSize: -1, + callback: readAt + } + testDataSrcNoSeek(done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0400 + * @tc.name : 0200.readAt num is wrong + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level3 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0400', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + fd = fileio.openSync(filePath, 0o0); + readErr = (buf, length) => { + if (readAtCnt >= 2 && readAtCnt <= 10) { + let num = fileio.readSync(fd, buf, {offset: 0, length: (readAtCnt ) * 1000}); + return num + readAtCnt; + } else { + return -1; + } + } + src = { + fileSize: -1, + callback: readAt + } + testDataSrcNoSeek(done); + }) + + /* * + * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0500 + * @tc.name : 0200.readAt num is wrong + * @tc.desc : data source compatibility test + * @tc.size : MediumTest + * @tc.type : compatibility test + * @tc.level : Level3 + */ + it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_DATASRC_NOSEEK_RELI_MP3_0500', 0, async function (done) { + filePath = pathDir + "/01_15s.mp3"; + fd = fileio.openSync(filePath, 0o0); + readErr = (buf, length) => { + if (readAtCnt >= 2 && readAtCnt <= 10) { + let num = fileio.readSync(fd, buf, {offset: 0, length: (readAtCnt ) * 1000}); + return num - readAtCnt; + } else { + return -1; + } + } + src = { + fileSize: -1, + callback: readAt + } + testDataSrcNoSeek(done); + }) + }); +} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerStabilityTest.test.js b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerStabilityTest.test.js index d7921c202f34b1ee91920900372716359901ece9..56c1b392f944924e9895ef6cd12a42e8f819b779 100644 --- a/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerStabilityTest.test.js +++ b/multimedia/media/media_js_standard/avPlayer/entry/src/main/ets/test/AVPlayerStabilityTest.test.js @@ -803,19 +803,19 @@ export default function AVPlayerStabilityTest() { console.info(TAG + 'SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0200 end') }) - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 - * @tc.name : 001.test complete->play->seek duration (1000 times) - * @tc.desc : Local Video complete->play->seek duration (1000 times) - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level3 - */ - it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300', 0, async function (done) { - console.info(TAG + 'SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 start') - AVPlayerTestBase.playToCompleted(videos[0], avPlayer, done); - console.info(TAG + 'SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 end') - }) +// /* * +// * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 +// * @tc.name : 001.test complete->play->seek duration (1000 times) +// * @tc.desc : Local Video complete->play->seek duration (1000 times) +// * @tc.size : MediumTest +// * @tc.type : Function test +// * @tc.level : Level3 +// */ +// it('SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300', 0, async function (done) { +// console.info(TAG + 'SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 start') +// AVPlayerTestBase.playToCompleted(videos[0], avPlayer, done); +// console.info(TAG + 'SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0300 end') +// }) /* * * @tc.number : SUB_MULTIMEDIA_MEDIA_AVPLAYER_STABILITY_01_0400