13ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang/*
23ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * Copyright (C) 2011 The Android Open Source Project
33ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang *
43ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * Licensed under the Apache License, Version 2.0 (the "License");
53ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * you may not use this file except in compliance with the License.
63ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * You may obtain a copy of the License at
73ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang *
83ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang *      http://www.apache.org/licenses/LICENSE-2.0
93ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang *
103ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * Unless required by applicable law or agreed to in writing, software
113ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * distributed under the License is distributed on an "AS IS" BASIS,
123ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * See the License for the specific language governing permissions and
143ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * limitations under the License.
153ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang */
163ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangpackage com.android.tests.dataidle;
173ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
183ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.content.Context;
193ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.net.INetworkStatsService;
20b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession;
21b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.NetworkStats;
223ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.net.NetworkStats.Entry;
233ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.net.NetworkTemplate;
24b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.TrafficStats;
253ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.os.Bundle;
263ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.os.RemoteException;
273ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.os.ServiceManager;
283ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.telephony.TelephonyManager;
293ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.test.InstrumentationTestCase;
303ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangimport android.util.Log;
313ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
323ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang/**
333ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * A test that dumps data usage to instrumentation out, used for measuring data usage for idle
343ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang * devices.
353ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang */
363ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuangpublic class DataIdleTest extends InstrumentationTestCase {
373ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
383ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    private TelephonyManager mTelephonyManager;
393ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    private INetworkStatsService mStatsService;
403ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
413ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    private static final String LOG_TAG = "DataIdleTest";
423ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    private final static int INSTRUMENTATION_IN_PROGRESS = 2;
433ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
443ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    protected void setUp() throws Exception {
453ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        super.setUp();
463ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        Context c = getInstrumentation().getTargetContext();
473ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        mStatsService = INetworkStatsService.Stub.asInterface(
483ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang                ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
493ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        mTelephonyManager = (TelephonyManager) c.getSystemService(Context.TELEPHONY_SERVICE);
503ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    }
513ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
523ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    /**
533ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * Test that dumps all the data usage metrics for wifi to instrumentation out.
543ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     */
553ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    public void testWifiIdle() {
568fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard();
573ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        fetchStats(template);
583ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    }
593ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
603ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    /**
613ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * Test that dumps all the data usage metrics for all mobile to instrumentation out.
623ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     */
633ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    public void testMobile() {
643ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        String subscriberId = mTelephonyManager.getSubscriberId();
653ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
663ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        fetchStats(template);
673ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    }
683ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
693ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    /**
703ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * Helper method that fetches all the network stats available and reports it
713ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * to instrumentation out.
72a45746efadd11bb7dfab026fb3c81a25fae74ca4Jeff Smith     * @param template {@link NetworkTemplate} to match.
733ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     */
743ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    private void fetchStats(NetworkTemplate template) {
75b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        INetworkStatsSession session = null;
763ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        try {
77db2990f5e743ed5030b6d5c1307b26737ec67a82Tsu Chiang Chuang            mStatsService.forceUpdate();
78b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            session = mStatsService.openSession();
79b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            final NetworkStats stats = session.getSummaryForAllUid(
80b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey                    template, Long.MIN_VALUE, Long.MAX_VALUE, false);
813ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang            reportStats(stats);
823ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        } catch (RemoteException e) {
83a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            Log.w(LOG_TAG, "Failed to fetch network stats.");
84b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        } finally {
85b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            TrafficStats.closeQuietly(session);
863ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        }
873ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    }
883ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang
893ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    /**
903ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * Print network data usage stats to instrumentation out
913ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     * @param stats {@link NetworkorStats} to print
923ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang     */
933ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    void reportStats(NetworkStats stats) {
94a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang        Bundle result = new Bundle();
95a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang        long rxBytes = 0;
96a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang        long txBytes = 0;
979cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        long rxPackets = 0;
989cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        long txPackets = 0;
993ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        for (int i = 0; i < stats.size(); ++i) {
100a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            // Label will be iface_uid_tag_set
1013ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang            Entry  statsEntry = stats.getValues(i, null);
1029cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang            // Debugging use.
1039cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang            /*
104a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            String labelTemplate = String.format("%s_%d_%d_%d", statsEntry.iface, statsEntry.uid,
105a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang                    statsEntry.tag, statsEntry.set) + "_%s";
106a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            result.putLong(String.format(labelTemplate, "rxBytes"), statsEntry.rxBytes);
107a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            result.putLong(String.format(labelTemplate, "txBytes"), statsEntry.txBytes);
1089cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang            */
1099cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang            rxPackets += statsEntry.rxPackets;
110a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            rxBytes += statsEntry.rxBytes;
1119cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang            txPackets += statsEntry.txPackets;
112a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang            txBytes += statsEntry.txBytes;
1133ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang        }
1149cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        result.putLong("Total rx Bytes", rxBytes);
1159cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        result.putLong("Total tx Bytes", txBytes);
1169cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        result.putLong("Total rx Packets", rxPackets);
1179cf416fde65fd5795d5e40be7bda0557611bc562Tsu Chiang Chuang        result.putLong("Total tx Packets", txPackets);
118a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang        getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
119a14d20f60cd41f1b71e8a228a6e9ac002a1dfb74Tsu Chiang Chuang
1203ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang    }
1213ae29d455866ce358b42617134610415c04e0d53Tsu Chiang Chuang}
122