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 */
16package com.android.tests.dataidle;
17
18import android.content.Context;
19import android.net.INetworkStatsService;
20import android.net.INetworkStatsSession;
21import android.net.NetworkStats;
22import android.net.NetworkStats.Entry;
23import android.net.NetworkTemplate;
24import android.net.TrafficStats;
25import android.os.Bundle;
26import android.os.RemoteException;
27import android.os.ServiceManager;
28import android.telephony.TelephonyManager;
29import android.test.InstrumentationTestCase;
30import android.util.Log;
31
32/**
33 * A test that dumps data usage to instrumentation out, used for measuring data usage for idle
34 * devices.
35 */
36public class DataIdleTest extends InstrumentationTestCase {
37
38    private TelephonyManager mTelephonyManager;
39    private INetworkStatsService mStatsService;
40
41    private static final String LOG_TAG = "DataIdleTest";
42    private final static int INSTRUMENTATION_IN_PROGRESS = 2;
43
44    protected void setUp() throws Exception {
45        super.setUp();
46        Context c = getInstrumentation().getTargetContext();
47        mStatsService = INetworkStatsService.Stub.asInterface(
48                ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
49        mTelephonyManager = (TelephonyManager) c.getSystemService(Context.TELEPHONY_SERVICE);
50    }
51
52    /**
53     * Test that dumps all the data usage metrics for wifi to instrumentation out.
54     */
55    public void testWifiIdle() {
56        NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard();
57        fetchStats(template);
58    }
59
60    /**
61     * Test that dumps all the data usage metrics for all mobile to instrumentation out.
62     */
63    public void testMobile() {
64        String subscriberId = mTelephonyManager.getSubscriberId();
65        NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
66        fetchStats(template);
67    }
68
69    /**
70     * Helper method that fetches all the network stats available and reports it
71     * to instrumentation out.
72     * @param template {@link NetworkTemplate} to match.
73     */
74    private void fetchStats(NetworkTemplate template) {
75        INetworkStatsSession session = null;
76        try {
77            mStatsService.forceUpdate();
78            session = mStatsService.openSession();
79            final NetworkStats stats = session.getSummaryForAllUid(
80                    template, Long.MIN_VALUE, Long.MAX_VALUE, false);
81            reportStats(stats);
82        } catch (RemoteException e) {
83            Log.w(LOG_TAG, "Failed to fetch network stats.");
84        } finally {
85            TrafficStats.closeQuietly(session);
86        }
87    }
88
89    /**
90     * Print network data usage stats to instrumentation out
91     * @param stats {@link NetworkorStats} to print
92     */
93    void reportStats(NetworkStats stats) {
94        Bundle result = new Bundle();
95        long rxBytes = 0;
96        long txBytes = 0;
97        long rxPackets = 0;
98        long txPackets = 0;
99        for (int i = 0; i < stats.size(); ++i) {
100            // Label will be iface_uid_tag_set
101            Entry  statsEntry = stats.getValues(i, null);
102            // Debugging use.
103            /*
104            String labelTemplate = String.format("%s_%d_%d_%d", statsEntry.iface, statsEntry.uid,
105                    statsEntry.tag, statsEntry.set) + "_%s";
106            result.putLong(String.format(labelTemplate, "rxBytes"), statsEntry.rxBytes);
107            result.putLong(String.format(labelTemplate, "txBytes"), statsEntry.txBytes);
108            */
109            rxPackets += statsEntry.rxPackets;
110            rxBytes += statsEntry.rxBytes;
111            txPackets += statsEntry.txPackets;
112            txBytes += statsEntry.txBytes;
113        }
114        result.putLong("Total rx Bytes", rxBytes);
115        result.putLong("Total tx Bytes", txBytes);
116        result.putLong("Total rx Packets", rxPackets);
117        result.putLong("Total tx Packets", txPackets);
118        getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
119
120    }
121}
122