1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.mediaframeworktest; 18 19 import java.io.BufferedWriter; 20 import java.io.File; 21 import java.io.FileOutputStream; 22 import java.io.FileWriter; 23 import java.io.IOException; 24 import java.io.InputStream; 25 import java.io.Writer; 26 27 import android.os.Debug; 28 import android.os.Environment; 29 import android.util.Log; 30 31 /** 32 * 33 * Utilities for media framework test. 34 * 35 */ 36 public class MediaTestUtil { 37 38 private static String TAG = "MediaTestUtil"; 39 private static final String STORAGE_PATH = Environment.getExternalStorageDirectory().toString(); 40 private int mStartMemory = 0; 41 private int mStartPid = 0; 42 private Writer mOutput = null; 43 private String mTestName = null; 44 private String mProcessName = null; 45 MediaTestUtil(String memoryOutFileName, String testName, String processName)46 public MediaTestUtil(String memoryOutFileName, String testName, String processName) 47 throws Exception { 48 File memoryOut = new File(memoryOutFileName); 49 mOutput = new BufferedWriter(new FileWriter(memoryOut, true)); 50 mProcessName = processName; 51 mTestName = testName; 52 mStartPid = getPid(); 53 mStartMemory = getVsize(); 54 } 55 56 // Catpure the heapdump for memory leaksage analysis getNativeHeapDump(String name)57 public static void getNativeHeapDump(String name) throws Exception { 58 System.gc(); 59 System.runFinalization(); 60 Thread.sleep(1000); 61 FileOutputStream o = new FileOutputStream(STORAGE_PATH + '/' + name + ".dump"); 62 Debug.dumpNativeHeap(o.getFD()); 63 o.close(); 64 } 65 validateProcessStatus()66 private void validateProcessStatus() throws Exception { 67 int currentPid = getPid(); 68 //Process crash 69 if (mStartPid != currentPid) { 70 mOutput.write(mProcessName + " died. Test failed\n"); 71 } 72 } 73 getPid()74 private int getPid() { 75 String memoryUsage = null; 76 int pidvalue = 0; 77 memoryUsage = captureMemInfo(); 78 String[] poList2 = memoryUsage.split("\t|\\s+"); 79 String pid = poList2[1]; 80 pidvalue = Integer.parseInt(pid); 81 Log.v(TAG, "PID = " + pidvalue); 82 return pidvalue; 83 } 84 captureMemInfo()85 private String captureMemInfo() { 86 String cm = "ps "; 87 cm += mProcessName; 88 Log.v(TAG, cm); 89 String memoryUsage = null; 90 91 int ch; 92 try { 93 Process p = Runtime.getRuntime().exec(cm); 94 InputStream in = p.getInputStream(); 95 StringBuffer sb = new StringBuffer(512); 96 while ((ch = in.read()) != -1) { 97 sb.append((char) ch); 98 } 99 memoryUsage = sb.toString(); 100 } catch (IOException e) { 101 Log.v(TAG, e.toString()); 102 } 103 String[] poList = memoryUsage.split("\r|\n|\r\n"); 104 // Skip the first two lines since there 105 // is a new media.log introudced recently. 106 String memusage = poList[2].concat("\n"); 107 return memusage; 108 } 109 getVsize()110 private int getVsize() { 111 String memoryUsage = captureMemInfo(); 112 String[] poList2 = memoryUsage.split("\t|\\s+"); 113 String vsize = poList2[3]; 114 int vsizevalue = Integer.parseInt(vsize); 115 Log.v(TAG, "VSIZE = " + vsizevalue); 116 return vsizevalue; 117 } 118 119 // Write the startup media memory mOutput to the file getStartMemoryLog()120 public void getStartMemoryLog() throws Exception { 121 String memusage = null; 122 mStartMemory = getVsize(); 123 mOutput.write(mTestName + '\n'); 124 mOutput.write("Start memory : " + mStartMemory + "\n"); 125 memusage = captureMemInfo(); 126 mOutput.write(memusage); 127 } 128 129 // Write the ps mediaserver mOutput to the file getMemoryLog()130 public void getMemoryLog() throws Exception { 131 String memusage = null; 132 memusage = captureMemInfo(); 133 mOutput.write(memusage); 134 mOutput.flush(); 135 } 136 getMemorySummary()137 public void getMemorySummary() throws Exception { 138 int endMemory = 0; 139 int memDiff = 0; 140 141 endMemory = getVsize(); 142 memDiff = endMemory - mStartMemory; 143 144 mOutput.write("End Memory :" + endMemory + "\n"); 145 if (memDiff < 0) { 146 memDiff = 0; 147 } 148 mOutput.write(mTestName + " total diff = " + memDiff); 149 mOutput.write("\n\n"); 150 validateProcessStatus(); 151 mOutput.flush(); 152 mOutput.close(); 153 } 154 } 155