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