BandwidthTest.java revision b5d55e302d2253e4bfb233ea705caf258cdc4cb9
133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang/*
233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Copyright (C) 2011, The Android Open Source Project
333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Licensed under the Apache License, Version 2.0 (the "License");
533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * you may not use this file except in compliance with the License.
633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * You may obtain a copy of the License at
733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *      http://www.apache.org/licenses/LICENSE-2.0
933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
1033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Unless required by applicable law or agreed to in writing, software
1133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * distributed under the License is distributed on an "AS IS" BASIS,
1233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * See the License for the specific language governing permissions and
1433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * limitations under the License.
1533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */
1633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
1733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpackage com.android.bandwidthtest;
1833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
1933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.content.Context;
2033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.ConnectivityManager;
2133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.NetworkInfo.State;
2233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.NetworkStats;
2333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.TrafficStats;
2433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.wifi.WifiManager;
2533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Bundle;
2633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Environment;
2733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Process;
2833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.SystemClock;
2933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.telephony.TelephonyManager;
3033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.test.InstrumentationTestCase;
3133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.test.suitebuilder.annotation.LargeTest;
3233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.util.Log;
3333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
3433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport com.android.bandwidthtest.util.BandwidthTestUtil;
3533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport com.android.bandwidthtest.util.ConnectionUtil;
3633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
3733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.File;
3833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
3933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang/**
4033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Test that downloads files from a test server and reports the bandwidth metrics collected.
4133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */
4233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpublic class BandwidthTest extends InstrumentationTestCase {
4333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
4433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private static final String LOG_TAG = "BandwidthTest";
4533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final static String PROF_LABEL = "PROF_";
4633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final static String PROC_LABEL = "PROC_";
4733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final static int INSTRUMENTATION_IN_PROGRESS = 2;
4833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
4933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final static String BASE_DIR =
5033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Environment.getExternalStorageDirectory().getAbsolutePath();
5133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final static String TMP_FILENAME = "tmp.dat";
5233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    // Download 10.486 * 106 bytes (+ headers) from app engine test server.
5333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private final int FILE_SIZE = 10485613;
5433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private Context mContext;
5533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private ConnectionUtil mConnectionUtil;
5633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private TelephonyManager mTManager;
5733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private int mUid;
5833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private String mSsid;
5933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private String mTestServer;
6033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private String mDeviceId;
6133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private BandwidthTestRunner mRunner;
6233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
6333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
6433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    @Override
6533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    protected void setUp() throws Exception {
6633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        super.setUp();
6733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mRunner = (BandwidthTestRunner) getInstrumentation();
6833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mSsid = mRunner.mSsid;
6933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mTestServer = mRunner.mTestServer;
7033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mContext = mRunner.getTargetContext();
7133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mConnectionUtil = new ConnectionUtil(mContext);
7233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mConnectionUtil.initialize();
7333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        Log.v(LOG_TAG, "Initialized mConnectionUtil");
7433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mUid = Process.myUid();
7533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mTManager = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE);
7633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mDeviceId = mTManager.getDeviceId();
7733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
7833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
7933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    @Override
8033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    protected void tearDown() throws Exception {
8133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mConnectionUtil.cleanUp();
8233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        super.tearDown();
8333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
8433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
8533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
8633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Ensure that downloading on wifi reports reasonable stats.
8733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
8833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    @LargeTest
8933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public void testWifiDownload() {
9033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(setDeviceWifiAndAirplaneMode(mSsid));
9133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats pre_test_stats = fetchDataFromProc(mUid);
9233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String ts = Long.toString(System.currentTimeMillis());
9333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
9433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String targetUrl = BandwidthTestUtil.buildDownloadUrl(
9533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                mTestServer, FILE_SIZE, mDeviceId, ts);
9633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        TrafficStats.startDataProfiling(mContext);
9733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME);
9833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(BandwidthTestUtil.DownloadFromUrl(targetUrl, tmpSaveFile));
9933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext);
10033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
10133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats post_test_stats = fetchDataFromProc(mUid);
10233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats);
10333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
10433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // Output measurements to instrumentation out, so that it can be compared to that of
10533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // the server.
10633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        Bundle results = new Bundle();
10733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putString("device_id", mDeviceId);
10833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putString("timestamp", ts);
10933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putInt("size", FILE_SIZE);
11033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        AddStatsToResults(PROF_LABEL, prof_stats, results);
11133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        AddStatsToResults(PROC_LABEL, proc_stats, results);
11233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results);
11333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
11433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // Clean up.
11533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(cleanUpFile(tmpSaveFile));
11633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
11733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
11833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
11933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * We want to make sure that if we use the Download Manager to download stuff,
12033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * accounting still goes to the app making the call and that the numbers still make sense.
12133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
12233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    @LargeTest
12333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public void testWifiDownloadWithDownloadManager() {
12433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(setDeviceWifiAndAirplaneMode(mSsid));
12533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // If we are using the download manager, then the data that is written to /proc/uid_stat/
12633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // is accounted against download manager's uid, since it uses pre-ICS API.
12733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        int downloadManagerUid = mConnectionUtil.downloadManagerUid();
12833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(downloadManagerUid >= 0);
12933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats pre_test_stats = fetchDataFromProc(downloadManagerUid);
13033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // start profiling
13133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        TrafficStats.startDataProfiling(mContext);
13233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String ts = Long.toString(System.currentTimeMillis());
13333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String targetUrl = BandwidthTestUtil.buildDownloadUrl(
13433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                mTestServer, FILE_SIZE, mDeviceId, ts);
13533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        Log.v(LOG_TAG, "Download url: " + targetUrl);
13633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME);
13733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(mConnectionUtil.startDownloadAndWait(targetUrl, 500000));
13833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext);
13933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats post_test_stats = fetchDataFromProc(downloadManagerUid);
14033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats);
14133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
14233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // Output measurements to instrumentation out, so that it can be compared to that of
14333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // the server.
14433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        Bundle results = new Bundle();
14533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putString("device_id", mDeviceId);
14633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putString("timestamp", ts);
14733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        results.putInt("size", FILE_SIZE);
14833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        AddStatsToResults(PROF_LABEL, prof_stats, results);
14933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        AddStatsToResults(PROC_LABEL, proc_stats, results);
15033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results);
15133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
15233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        // Clean up.
15333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(cleanUpFile(tmpSaveFile));
15433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
15533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
15633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
15733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Fetch network data from /proc/uid_stat/uid
15833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @return populated {@link NetworkStats}
15933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
16033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public NetworkStats fetchDataFromProc(int uid) {
16133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String root_filepath = "/proc/uid_stat/" + uid + "/";
16233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        File rcv_stat = new File (root_filepath + "tcp_rcv");
16333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        int rx = BandwidthTestUtil.parseIntValueFromFile(rcv_stat);
16433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        File snd_stat = new File (root_filepath + "tcp_snd");
16533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        int tx = BandwidthTestUtil.parseIntValueFromFile(snd_stat);
16633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
167b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        stats.addValues(NetworkStats.IFACE_ALL, uid, NetworkStats.SET_DEFAULT,
168b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                NetworkStats.TAG_NONE, rx, 0, tx, 0, 0);
16933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return stats;
17033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
17133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
17233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
17333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Turn on Airplane mode and connect to the wifi
17433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param ssid of the wifi to connect to
17533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @return true if we successfully connected to a given network.
17633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
17733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public boolean setDeviceWifiAndAirplaneMode(String ssid) {
17833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        mConnectionUtil.setAirplaneMode(mContext, true);
17933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(mConnectionUtil.connectToWifi(ssid));
18033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        assertTrue(mConnectionUtil.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
18133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                ConnectionUtil.LONG_TIMEOUT));
18233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return mConnectionUtil.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED,
18333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                ConnectionUtil.LONG_TIMEOUT);
18433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
18533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
18633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
18733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Output the {@link NetworkStats} to Instrumentation out.
18833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param label to attach to this given stats.
18933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param stats {@link NetworkStats} to add.
19033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param results {@link Bundle} to be added to.
19133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
19233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public void AddStatsToResults(String label, NetworkStats stats, Bundle results){
19333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        if (results == null || results.isEmpty()) {
19433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Log.e(LOG_TAG, "Empty bundle provided.");
19533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            return;
19633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        }
19733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        for (int i = 0; i < stats.size(); ++i) {
19833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            android.net.NetworkStats.Entry entry = stats.getValues(i, null);
19933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            results.putInt(label + "uid", entry.uid);
20033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            results.putString(label + "iface", entry.iface);
20133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            results.putInt(label + "tag", entry.tag);
20233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            results.putLong(label + "tx", entry.txBytes);
20333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            results.putLong(label + "rx", entry.rxBytes);
20433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        }
20533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
20633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
20733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
20833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Remove file if it exists.
20933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param file {@link File} to delete.
21033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @return true if successfully deleted the file.
21133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
21233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private boolean cleanUpFile(File file) {
21333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        if (file.exists()) {
21433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            return file.delete();
21533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        }
21633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return true;
21733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
21833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang}