/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.mediaframeworktest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import android.os.Debug;
import android.os.Environment;
import android.util.Log;
/**
*
* Utilities for media framework test.
*
*/
public class MediaTestUtil {
private static String TAG = "MediaTestUtil";
private static final String STORAGE_PATH = Environment.getExternalStorageDirectory().toString();
private int mStartMemory = 0;
private int mStartPid = 0;
private Writer mOutput = null;
private String mTestName = null;
private String mProcessName = null;
public MediaTestUtil(String memoryOutFileName, String testName, String processName)
throws Exception {
File memoryOut = new File(memoryOutFileName);
mOutput = new BufferedWriter(new FileWriter(memoryOut, true));
mProcessName = processName;
mTestName = testName;
mStartPid = getPid();
mStartMemory = getVsize();
}
// Catpure the heapdump for memory leaksage analysis
public static void getNativeHeapDump(String name) throws Exception {
System.gc();
System.runFinalization();
Thread.sleep(1000);
FileOutputStream o = new FileOutputStream(STORAGE_PATH + '/' + name + ".dump");
Debug.dumpNativeHeap(o.getFD());
o.close();
}
private void validateProcessStatus() throws Exception {
int currentPid = getPid();
//Process crash
if (mStartPid != currentPid) {
mOutput.write(mProcessName + " died. Test failed\n");
}
}
private int getPid() {
String memoryUsage = null;
int pidvalue = 0;
memoryUsage = captureMemInfo();
String[] poList2 = memoryUsage.split("\t|\\s+");
String pid = poList2[1];
pidvalue = Integer.parseInt(pid);
Log.v(TAG, "PID = " + pidvalue);
return pidvalue;
}
private String captureMemInfo() {
String cm = "ps ";
cm += mProcessName;
Log.v(TAG, cm);
String memoryUsage = null;
int ch;
try {
Process p = Runtime.getRuntime().exec(cm);
InputStream in = p.getInputStream();
StringBuffer sb = new StringBuffer(512);
while ((ch = in.read()) != -1) {
sb.append((char) ch);
}
memoryUsage = sb.toString();
} catch (IOException e) {
Log.v(TAG, e.toString());
}
String[] poList = memoryUsage.split("\r|\n|\r\n");
// Skip the first two lines since there
// is a new media.log introudced recently.
String memusage = poList[2].concat("\n");
return memusage;
}
private int getVsize() {
String memoryUsage = captureMemInfo();
String[] poList2 = memoryUsage.split("\t|\\s+");
String vsize = poList2[3];
int vsizevalue = Integer.parseInt(vsize);
Log.v(TAG, "VSIZE = " + vsizevalue);
return vsizevalue;
}
// Write the startup media memory mOutput to the file
public void getStartMemoryLog() throws Exception {
String memusage = null;
mStartMemory = getVsize();
mOutput.write(mTestName + '\n');
mOutput.write("Start memory : " + mStartMemory + "\n");
memusage = captureMemInfo();
mOutput.write(memusage);
}
// Write the ps mediaserver mOutput to the file
public void getMemoryLog() throws Exception {
String memusage = null;
memusage = captureMemInfo();
mOutput.write(memusage);
mOutput.flush();
}
public void getMemorySummary() throws Exception {
int endMemory = 0;
int memDiff = 0;
endMemory = getVsize();
memDiff = endMemory - mStartMemory;
mOutput.write("End Memory :" + endMemory + "\n");
if (memDiff < 0) {
memDiff = 0;
}
mOutput.write(mTestName + " total diff = " + memDiff);
mOutput.write("\n\n");
validateProcessStatus();
mOutput.flush();
mOutput.close();
}
}