162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau/*
262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * Copyright (C) 2011 The Android Open Source Project
362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *
462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License");
562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * you may not use this file except in compliance with the License.
662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * You may obtain a copy of the License at
762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *
862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *      http://www.apache.org/licenses/LICENSE-2.0
962f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *
1062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software
1162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS,
1262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * See the License for the specific language governing permissions and
1462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * limitations under the License.
1562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau */
1662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
1762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupackage com.android.mediaframeworktest;
1862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
1975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lauimport java.io.BufferedWriter;
2075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lauimport java.io.File;
2162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport java.io.FileOutputStream;
2275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lauimport java.io.FileWriter;
239dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lauimport java.io.IOException;
249dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lauimport java.io.InputStream;
259dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lauimport java.io.Writer;
2662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
2762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.os.Debug;
2862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lauimport android.os.Environment;
299dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lauimport android.util.Log;
3062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
3162f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau/**
3262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *
3362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau * Utilities for media framework test.
3462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau *
3562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau */
3662f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Laupublic class MediaTestUtil {
3762f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
389dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    private static String TAG = "MediaTestUtil";
3975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private static final String STORAGE_PATH = Environment.getExternalStorageDirectory().toString();
4075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private int mStartMemory = 0;
4175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private int mStartPid = 0;
4275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private Writer mOutput = null;
4375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private String mTestName = null;
4475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private String mProcessName = null;
4575afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau
4675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public MediaTestUtil(String memoryOutFileName, String testName, String processName)
4775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau            throws Exception {
4875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        File memoryOut = new File(memoryOutFileName);
4975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput = new BufferedWriter(new FileWriter(memoryOut, true));
5075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mProcessName = processName;
5175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mTestName = testName;
5275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mStartPid = getPid();
5375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mStartMemory = getVsize();
5475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    }
5562f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau
5675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    // Catpure the heapdump for memory leaksage analysis
5775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public static void getNativeHeapDump(String name) throws Exception {
5862f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        System.gc();
5962f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        System.runFinalization();
6062f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        Thread.sleep(1000);
6175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        FileOutputStream o = new FileOutputStream(STORAGE_PATH + '/' + name + ".dump");
6262f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        Debug.dumpNativeHeap(o.getFD());
6362f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau        o.close();
6462f755ac65cb40f231a7fa0695724ae01975d01cYu Shan Emily Lau    }
659dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
6675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private void validateProcessStatus() throws Exception {
6775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        int currentPid = getPid();
6875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        //Process crash
6975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        if (mStartPid != currentPid) {
7075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau            mOutput.write(mProcessName + " died. Test failed\n");
7175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        }
7275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    }
7375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau
7475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private int getPid() {
7575afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        String memoryUsage = null;
7675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        int pidvalue = 0;
7775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memoryUsage = captureMemInfo();
7875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        String[] poList2 = memoryUsage.split("\t|\\s+");
7975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        String pid = poList2[1];
8075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        pidvalue = Integer.parseInt(pid);
8175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        Log.v(TAG, "PID = " + pidvalue);
8275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        return pidvalue;
8375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    }
8475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau
8575afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private String captureMemInfo() {
869dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String cm = "ps ";
8775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        cm += mProcessName;
8875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        Log.v(TAG, cm);
899dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memoryUsage = null;
909dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
919dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int ch;
929dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        try {
939dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            Process p = Runtime.getRuntime().exec(cm);
949dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            InputStream in = p.getInputStream();
959dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            StringBuffer sb = new StringBuffer(512);
969dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            while ((ch = in.read()) != -1) {
979dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau                sb.append((char) ch);
989dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            }
999dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            memoryUsage = sb.toString();
1009dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        } catch (IOException e) {
1019dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            Log.v(TAG, e.toString());
1029dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        }
1039dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String[] poList = memoryUsage.split("\r|\n|\r\n");
1049dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memusage = poList[1].concat("\n");
1059dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        return memusage;
1069dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1079dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
10875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private int getVsize() {
10975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        String memoryUsage = captureMemInfo();
1109dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String[] poList2 = memoryUsage.split("\t|\\s+");
1119dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String vsize = poList2[3];
1129dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int vsizevalue = Integer.parseInt(vsize);
1139dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        Log.v(TAG, "VSIZE = " + vsizevalue);
1149dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        return vsizevalue;
1159dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1169dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
11775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    // Write the startup media memory mOutput to the file
11875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getStartMemoryLog() throws Exception {
1199dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memusage = null;
12075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mStartMemory = getVsize();
12175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(mTestName + '\n');
12275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("Start memory : " + mStartMemory + "\n");
12375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memusage = captureMemInfo();
12475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(memusage);
1259dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1269dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
12775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    // Write the ps mediaserver mOutput to the file
12875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getMemoryLog() throws Exception {
1299dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memusage = null;
13075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memusage = captureMemInfo();
13175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(memusage);
13275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.flush();
1339dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1349dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
13575afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getMemorySummary() throws Exception {
1369dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int endMemory = 0;
1379dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int memDiff = 0;
1389dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
13975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        endMemory = getVsize();
14075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memDiff = endMemory - mStartMemory;
14175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau
14275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("End Memory :" + endMemory + "\n");
1439dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        if (memDiff < 0) {
1449dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            memDiff = 0;
1459dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        }
14675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(mTestName + " total diff = " + memDiff);
14775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("\n\n");
14875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        validateProcessStatus();
14975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.flush();
15075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.close();
1519dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1529dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau}
153