Merge "Adding mobile microbenchmark tests." into ics-mr0

This commit is contained in:
Tsu Chiang Chuang
2011-11-14 15:03:17 -08:00
committed by Android (Google) Code Review
2 changed files with 117 additions and 19 deletions

View File

@ -89,8 +89,27 @@ public class BandwidthTest extends InstrumentationTestCase {
* Ensure that downloading on wifi reports reasonable stats. * Ensure that downloading on wifi reports reasonable stats.
*/ */
@LargeTest @LargeTest
public void testWifiDownload() { public void testWifiDownload() throws Exception {
assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); assertTrue("Could not connect to wifi!", setDeviceWifiAndAirplaneMode(mSsid));
downloadFile();
}
/**
* Ensure that downloading on mobile reports reasonable stats.
*/
@LargeTest
public void testMobileDownload() throws Exception {
// As part of the setup we disconnected from wifi; make sure we are connected to mobile and
// that we have data.
assertTrue("Do not have mobile data!", hasMobileData());
downloadFile();
}
/**
* Helper method that downloads a file using http connection from a test server and reports the
* data usage stats to instrumentation out.
*/
protected void downloadFile() throws Exception {
NetworkStats pre_test_stats = fetchDataFromProc(mUid); NetworkStats pre_test_stats = fetchDataFromProc(mUid);
String ts = Long.toString(System.currentTimeMillis()); String ts = Long.toString(System.currentTimeMillis());
@ -120,11 +139,28 @@ public class BandwidthTest extends InstrumentationTestCase {
} }
/** /**
* Ensure that downloading on wifi reports reasonable stats. * Ensure that uploading on wifi reports reasonable stats.
*/ */
@LargeTest @LargeTest
public void testWifiUpload() { public void testWifiUpload() {
assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); assertTrue(setDeviceWifiAndAirplaneMode(mSsid));
uploadFile();
}
/**
* Ensure that uploading on wifi reports reasonable stats.
*/
@LargeTest
public void testMobileUpload() throws Exception {
assertTrue(hasMobileData());
uploadFile();
}
/**
* Helper method that downloads a test file to upload. The stats reported to instrumentation out
* only include upload stats.
*/
protected void uploadFile() throws Exception {
// Download a file from the server. // Download a file from the server.
String ts = Long.toString(System.currentTimeMillis()); String ts = Long.toString(System.currentTimeMillis());
String targetUrl = BandwidthTestUtil.buildDownloadUrl( String targetUrl = BandwidthTestUtil.buildDownloadUrl(
@ -156,12 +192,30 @@ public class BandwidthTest extends InstrumentationTestCase {
} }
/** /**
* We want to make sure that if we use the Download Manager to download stuff, * We want to make sure that if we use wifi and the Download Manager to download stuff,
* accounting still goes to the app making the call and that the numbers still make sense. * accounting still goes to the app making the call and that the numbers still make sense.
*/ */
@LargeTest @LargeTest
public void testWifiDownloadWithDownloadManager() { public void testWifiDownloadWithDownloadManager() {
assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); assertTrue(setDeviceWifiAndAirplaneMode(mSsid));
downloadFileUsingDownloadManager();
}
/**
* We want to make sure that if we use mobile data and the Download Manager to download stuff,
* accounting still goes to the app making the call and that the numbers still make sense.
*/
@LargeTest
public void testMobileDownloadWithDownloadManager() throws Exception {
assertTrue(hasMobileData());
downloadFileUsingDownloadManager();
}
/**
* Helper method that downloads a file from a test server using the download manager and reports
* the stats to instrumentation out.
*/
protected void downloadFileUsingDownloadManager() throws Exception {
// If we are using the download manager, then the data that is written to /proc/uid_stat/ // If we are using the download manager, then the data that is written to /proc/uid_stat/
// is accounted against download manager's uid, since it uses pre-ICS API. // is accounted against download manager's uid, since it uses pre-ICS API.
int downloadManagerUid = mConnectionUtil.downloadManagerUid(); int downloadManagerUid = mConnectionUtil.downloadManagerUid();
@ -195,6 +249,7 @@ public class BandwidthTest extends InstrumentationTestCase {
/** /**
* Fetch network data from /proc/uid_stat/uid * Fetch network data from /proc/uid_stat/uid
*
* @return populated {@link NetworkStats} * @return populated {@link NetworkStats}
*/ */
public NetworkStats fetchDataFromProc(int uid) { public NetworkStats fetchDataFromProc(int uid) {
@ -210,7 +265,8 @@ public class BandwidthTest extends InstrumentationTestCase {
} }
/** /**
* Turn on Airplane mode and connect to the wifi * Turn on Airplane mode and connect to the wifi.
*
* @param ssid of the wifi to connect to * @param ssid of the wifi to connect to
* @return true if we successfully connected to a given network. * @return true if we successfully connected to a given network.
*/ */
@ -219,12 +275,25 @@ public class BandwidthTest extends InstrumentationTestCase {
assertTrue(mConnectionUtil.connectToWifi(ssid)); assertTrue(mConnectionUtil.connectToWifi(ssid));
assertTrue(mConnectionUtil.waitForWifiState(WifiManager.WIFI_STATE_ENABLED, assertTrue(mConnectionUtil.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
ConnectionUtil.LONG_TIMEOUT)); ConnectionUtil.LONG_TIMEOUT));
return mConnectionUtil.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, assertTrue(mConnectionUtil.waitForNetworkState(ConnectivityManager.TYPE_WIFI,
ConnectionUtil.LONG_TIMEOUT); State.CONNECTED, ConnectionUtil.LONG_TIMEOUT));
return mConnectionUtil.hasData();
}
/**
* Helper method to make sure we are connected to mobile data.
*
* @return true if we successfully connect to mobile data.
*/
public boolean hasMobileData() {
assertTrue("Not connected to mobile", mConnectionUtil.isConnectedToMobile());
assertFalse("Still connected to wifi.", mConnectionUtil.isConnectedToWifi());
return mConnectionUtil.hasData();
} }
/** /**
* Output the {@link NetworkStats} to Instrumentation out. * Output the {@link NetworkStats} to Instrumentation out.
*
* @param label to attach to this given stats. * @param label to attach to this given stats.
* @param stats {@link NetworkStats} to add. * @param stats {@link NetworkStats} to add.
* @param results {@link Bundle} to be added to. * @param results {@link Bundle} to be added to.
@ -281,4 +350,4 @@ public class BandwidthTest extends InstrumentationTestCase {
} }
return true; return true;
} }
} }

View File

@ -44,6 +44,8 @@ import com.android.bandwidthtest.NetworkState;
import com.android.bandwidthtest.NetworkState.StateTransitionDirection; import com.android.bandwidthtest.NetworkState.StateTransitionDirection;
import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.List; import java.util.List;
/* /*
@ -257,14 +259,14 @@ public class ConnectionUtil {
mConnectivityState[networkType].recordState(networkState); mConnectivityState[networkType].recordState(networkState);
} }
/** /**
* Set the state transition criteria * Set the state transition criteria
* *
* @param networkType * @param networkType
* @param initState * @param initState
* @param transitionDir * @param transitionDir
* @param targetState * @param targetState
*/ */
public void setStateTransitionCriteria(int networkType, State initState, public void setStateTransitionCriteria(int networkType, State initState,
StateTransitionDirection transitionDir, State targetState) { StateTransitionDirection transitionDir, State targetState) {
mConnectivityState[networkType].setStateTransitionCriteria( mConnectivityState[networkType].setStateTransitionCriteria(
@ -495,7 +497,8 @@ public class ConnectionUtil {
* @return true if connected to a mobile network, false otherwise. * @return true if connected to a mobile network, false otherwise.
*/ */
public boolean isConnectedToMobile() { public boolean isConnectedToMobile() {
return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE); NetworkInfo networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return networkInfo.isConnected();
} }
/** /**
@ -503,10 +506,10 @@ public class ConnectionUtil {
* @return true if connected to wifi, false otherwise. * @return true if connected to wifi, false otherwise.
*/ */
public boolean isConnectedToWifi() { public boolean isConnectedToWifi() {
return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI); NetworkInfo networkInfo = mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return networkInfo.isConnected();
} }
/** /**
* Associate the device to given SSID * Associate the device to given SSID
* If the device is already associated with a WiFi, disconnect and forget it, * If the device is already associated with a WiFi, disconnect and forget it,
@ -681,4 +684,30 @@ public class ConnectionUtil {
} }
Log.v(LOG_TAG, "onDestroy, inst=" + Integer.toHexString(hashCode())); Log.v(LOG_TAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
} }
/**
* Helper method used to test data connectivity by pinging a series of popular sites.
* @return true if device has data connectivity, false otherwise.
*/
public boolean hasData() {
String[] hostList = {"www.google.com", "www.yahoo.com",
"www.bing.com", "www.facebook.com", "www.ask.com"};
try {
for (int i = 0; i < hostList.length; ++i) {
String host = hostList[i];
Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + host);
int status = p.waitFor();
if (status == 0) {
return true;
}
}
} catch (UnknownHostException e) {
Log.e(LOG_TAG, "Ping test Failed: Unknown Host");
} catch (IOException e) {
Log.e(LOG_TAG, "Ping test Failed: IOException");
} catch (InterruptedException e) {
Log.e(LOG_TAG, "Ping test Failed: InterruptedException");
}
return false;
}
} }