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");
104780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau        // Skip the first two lines since there
105780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau        // is a new media.log introudced recently.
106780dc88ddbc1d7a8d4a634e556a5bba04992a412Yu Shan Emily Lau        String memusage = poList[2].concat("\n");
1079dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        return memusage;
1089dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1099dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
11075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    private int getVsize() {
11175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        String memoryUsage = captureMemInfo();
1129dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String[] poList2 = memoryUsage.split("\t|\\s+");
1139dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String vsize = poList2[3];
1149dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int vsizevalue = Integer.parseInt(vsize);
1159dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        Log.v(TAG, "VSIZE = " + vsizevalue);
1169dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        return vsizevalue;
1179dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1189dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
11975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    // Write the startup media memory mOutput to the file
12075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getStartMemoryLog() throws Exception {
1219dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memusage = null;
12275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mStartMemory = getVsize();
12375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(mTestName + '\n');
12475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("Start memory : " + mStartMemory + "\n");
12575afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memusage = captureMemInfo();
12675afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(memusage);
1279dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1289dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
12975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    // Write the ps mediaserver mOutput to the file
13075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getMemoryLog() throws Exception {
1319dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        String memusage = null;
13275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memusage = captureMemInfo();
13375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(memusage);
13475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.flush();
1359dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1369dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
13775afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau    public void getMemorySummary() throws Exception {
1389dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int endMemory = 0;
1399dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        int memDiff = 0;
1409dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau
14175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        endMemory = getVsize();
14275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        memDiff = endMemory - mStartMemory;
14375afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau
14475afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("End Memory :" + endMemory + "\n");
1459dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        if (memDiff < 0) {
1469dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau            memDiff = 0;
1479dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau        }
14875afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write(mTestName + " total diff = " + memDiff);
14975afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.write("\n\n");
15075afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        validateProcessStatus();
15175afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.flush();
15275afb97c4d46e1c001986faca8a5ee7e68d7b82bYu Shan Emily Lau        mOutput.close();
1539dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau    }
1549dab78470592be7542b9c0f9090603ed0dc80949Yu Shan Emily Lau}
155