1d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou/*
2d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * Copyright (C) 2014 The Android Open Source Project
3d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou *
4d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * Licensed under the Apache License, Version 2.0 (the "License");
5d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * you may not use this file except in compliance with the License.
6d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * You may obtain a copy of the License at
7d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou *
8d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou *      http://www.apache.org/licenses/LICENSE-2.0
9d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou *
10d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * Unless required by applicable law or agreed to in writing, software
11d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * distributed under the License is distributed on an "AS IS" BASIS,
12d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * See the License for the specific language governing permissions and
14d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * limitations under the License.
15d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou */
16d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
17d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zoupackage com.android.mediaframeworktest.stress;
18d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
19d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport com.android.mediaframeworktest.MediaFrameworkTest;
20d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport com.android.mediaframeworktest.MediaPlayerStressTestRunner;
21d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
22d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport android.os.Bundle;
23d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport android.os.Environment;
24d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport android.test.ActivityInstrumentationTestCase2;
25d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport android.test.suitebuilder.annotation.LargeTest;
26d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport android.util.Log;
27d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
28d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport com.android.mediaframeworktest.MediaNames;
29d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport com.android.mediaframeworktest.functional.CodecTest;
30d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
31d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.BufferedReader;
32d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.BufferedWriter;
33d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.File;
34d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.FileReader;
35d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.FileWriter;
36d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.io.Writer;
37d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
38d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.util.ArrayList;
39d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zouimport java.util.List;
40d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
41d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou/**
42d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou * Junit / Instrumentation test case for the media player
43d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou */
44d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zoupublic class MediaPlayerStreamingStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
45d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private String TAG = "MediaPlayerStreamingStressTest";
46d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private String mStreamingSrc;
47d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
48d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    public MediaPlayerStreamingStressTest() {
49d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
50d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
51d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
52d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    protected void setUp() throws Exception {
53d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        //Insert a 2 second before launching the test activity. This is
54d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        //the workaround for the race condition of requesting the updated surface.
55d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        Thread.sleep(2000);
56d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        getActivity();
57d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        MediaPlayerStressTestRunner mRunner = (MediaPlayerStressTestRunner)getInstrumentation();
58d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        Bundle arguments = mRunner.getArguments();
59d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mStreamingSrc = arguments.getString("streaming-source");
60d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        if (mStreamingSrc == null) {
61d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            mStreamingSrc = MediaNames.MEDIA_STREAMING_SRC;
62d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        }
63d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        super.setUp();
64d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
65d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
66d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalPlaybackError = 0;
67d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalComplete = 0;
68d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalInfoUnknown = 0;
69d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalVideoTrackLagging = 0;
70d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalBadInterleaving = 0;
71d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalNotSeekable = 0;
72d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private int mTotalMetaDataUpdate = 0;
73d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
74d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    //Test result output file
75d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private static final String PLAYBACK_RESULT = "StreamingTestResult.txt";
76d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
77d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private void writeTestOutput(String filename, Writer output) throws Exception{
78d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("URL: " + filename);
79d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Complete: " + CodecTest.onCompleteSuccess);
80d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Error: " + CodecTest.mPlaybackError);
81d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Unknown Info: " + CodecTest.mMediaInfoUnknownCount);
82d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Track Lagging: " +  CodecTest.mMediaInfoVideoTrackLaggingCount);
83d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Bad Interleaving: " + CodecTest.mMediaInfoBadInterleavingCount);
84d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Not Seekable: " + CodecTest.mMediaInfoNotSeekableCount);
85d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write(" Info Meta data update: " + CodecTest.mMediaInfoMetdataUpdateCount);
86d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("\n");
87d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
88d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
89d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private void writeTestSummary(Writer output) throws Exception{
90d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Result:\n");
91d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Complete: " + mTotalComplete + "\n");
92d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Error: " + mTotalPlaybackError + "\n");
93d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Unknown Info: " + mTotalInfoUnknown + "\n");
94d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Track Lagging: " + mTotalVideoTrackLagging + "\n" );
95d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Bad Interleaving: " + mTotalBadInterleaving + "\n");
96d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Not Seekable: " + mTotalNotSeekable + "\n");
97d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("Total Info Meta data update: " + mTotalMetaDataUpdate + "\n");
98d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        output.write("\n");
99d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
100d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
101d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    private void updateTestResult(){
102d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        if (CodecTest.onCompleteSuccess){
103d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            mTotalComplete++;
104d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        }
105d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        else if (CodecTest.mPlaybackError){
106d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            mTotalPlaybackError++;
107d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        }
108d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mTotalInfoUnknown += CodecTest.mMediaInfoUnknownCount;
109d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mTotalVideoTrackLagging += CodecTest.mMediaInfoVideoTrackLaggingCount;
110d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mTotalBadInterleaving += CodecTest.mMediaInfoBadInterleavingCount;
111d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mTotalNotSeekable += CodecTest.mMediaInfoNotSeekableCount;
112d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        mTotalMetaDataUpdate += CodecTest.mMediaInfoMetdataUpdateCount;
113d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
114d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
115d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    //Test that will start the playback for all the videos
116d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    //under the samples folder
117d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    @LargeTest
118d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    public void testVideoPlayback() throws Exception {
119d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        String fileWithError = "Filename:\n";
120d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        File playbackOutput = new File(Environment.getExternalStorageDirectory(), PLAYBACK_RESULT);
121d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        Writer output = new BufferedWriter(new FileWriter(playbackOutput, true));
122d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
123d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        boolean testResult = true;
124d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        // load directory files
125d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        boolean onCompleteSuccess = false;
126d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
127d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
128d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        Log.i(TAG, "Streaming src file: " + mStreamingSrc);
129d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        //TODO: add try catch
130d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou
131d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        File f = new File(mStreamingSrc);
132d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        BufferedReader br = new BufferedReader(new FileReader(f));
133d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        List<String> urls = new ArrayList<String>();
134d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        String line;
135d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        while ((line = br.readLine()) != null) {
136d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou           urls.add(line.trim());
137d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        }
138d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        br.close();
139d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        if (urls == null) {
140d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            Log.v("MediaPlayerStreamingTest:testVideoPlayback", "no url found");
141d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            return;
142d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou        } else {
143d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            for (int i = 0; i < urls.size(); i++) {
144d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                //Get url
145d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                String filename = urls.get(i);
146d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                onCompleteSuccess =
147d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                    CodecTest.playMediaSamples(filename, 60000);
148d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                if (!onCompleteSuccess){
149d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                    //Don't fail the test right away, print out the failure file.
150d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                    fileWithError += filename + '\n';
151d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                    Log.v(TAG, "Failure File : " + fileWithError);
152d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                    testResult = false;
153d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                }
154d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                Thread.sleep(3000);
155d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                //Write test result to an output file
156d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                writeTestOutput(filename,output);
157d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                //Get the summary
158d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou                updateTestResult();
159d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            }
160d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            writeTestSummary(output);
161d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            output.close();
162d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou            assertTrue("testMediaSamples", testResult);
163d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou       }
164d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou    }
165d097e7ef745714cadc299db5e8bb0ff57c255373Shaohan Zou}
166