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