NetworkStatsCollectionTest.java revision 0cf6de0c930c9082b7bffdb9824e4a7c7832b6df
163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/*
263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Copyright (C) 2012 The Android Open Source Project
363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *
463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * you may not use this file except in compliance with the License.
663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * You may obtain a copy of the License at
763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *
863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *
1063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Unless required by applicable law or agreed to in writing, software
1163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
1263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * See the License for the specific language governing permissions and
1463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * limitations under the License.
1563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */
1663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
1763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeypackage com.android.server.net;
1863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
1963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateMobileAll;
2063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
2163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
2263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.content.res.Resources;
2363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.net.NetworkStats;
2463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.net.NetworkTemplate;
2563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.AndroidTestCase;
2663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.suitebuilder.annotation.MediumTest;
2763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
2863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.frameworks.servicestests.R;
2963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
3063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.ByteArrayInputStream;
3163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.ByteArrayOutputStream;
3263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.DataOutputStream;
3363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.File;
3463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.FileOutputStream;
3563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.InputStream;
3663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport java.io.OutputStream;
3763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
3863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport libcore.io.IoUtils;
3963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport libcore.io.Streams;
4063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
4163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/**
4263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Tests for {@link NetworkStatsCollection}.
4363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */
4463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey@MediumTest
4563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeypublic class NetworkStatsCollectionTest extends AndroidTestCase {
460cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey
4763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private static final String TEST_FILE = "test.bin";
4863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private static final String TEST_IMSI = "310260000000000";
4963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
5063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    public void testReadLegacyNetwork() throws Exception {
5163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File testFile = new File(getContext().getFilesDir(), TEST_FILE);
5263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        stageFile(R.raw.netstats_v1, testFile);
5363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
5463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS);
5563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.readLegacyNetwork(testFile);
560cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey
5763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // verify that history read correctly
5863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
590cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey                636016770L, 709306L, 88038768L, 518836L);
6063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
6163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // now export into a unified format
6263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final ByteArrayOutputStream bos = new ByteArrayOutputStream();
6363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.write(new DataOutputStream(bos));
6463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
6563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // clear structure completely
6663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.reset();
6763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
6863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                0L, 0L, 0L, 0L);
6963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
7063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // and read back into structure, verifying that totals are same
7163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.read(new ByteArrayInputStream(bos.toByteArray()));
7263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
730cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey                636016770L, 709306L, 88038768L, 518836L);
7463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
7563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
7663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    public void testReadLegacyUid() throws Exception {
7763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File testFile = new File(getContext().getFilesDir(), TEST_FILE);
7863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        stageFile(R.raw.netstats_uid_v4, testFile);
7963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS);
8163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.readLegacyUid(testFile, false);
8263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // verify that history read correctly
8463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
850cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey                637076152L, 711413L, 88343717L, 521022L);
8663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // now export into a unified format
8863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final ByteArrayOutputStream bos = new ByteArrayOutputStream();
8963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.write(new DataOutputStream(bos));
9063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
9163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // clear structure completely
9263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.reset();
9363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
9463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                0L, 0L, 0L, 0L);
9563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
9663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // and read back into structure, verifying that totals are same
9763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.read(new ByteArrayInputStream(bos.toByteArray()));
9863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI),
990cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey                637076152L, 711413L, 88343717L, 521022L);
10063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
10163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
10263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    public void testReadLegacyUidTags() throws Exception {
10363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File testFile = new File(getContext().getFilesDir(), TEST_FILE);
10463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        stageFile(R.raw.netstats_uid_v4, testFile);
10563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
10663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS);
10763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.readLegacyUid(testFile, true);
10863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
10963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // verify that history read correctly
11063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI),
11163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                77017831L, 100995L, 35436758L, 92344L);
11263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
11363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // now export into a unified format
11463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final ByteArrayOutputStream bos = new ByteArrayOutputStream();
11563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.write(new DataOutputStream(bos));
11663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
11763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // clear structure completely
11863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.reset();
11963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI),
12063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                0L, 0L, 0L, 0L);
12163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
12263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // and read back into structure, verifying that totals are same
12363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        collection.read(new ByteArrayInputStream(bos.toByteArray()));
12463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI),
12563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                77017831L, 100995L, 35436758L, 92344L);
12663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
12763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
12863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    /**
12963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     * Copy a {@link Resources#openRawResource(int)} into {@link File} for
13063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     * testing purposes.
13163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     */
13263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void stageFile(int rawId, File file) throws Exception {
13363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        new File(file.getParent()).mkdirs();
13463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        InputStream in = null;
13563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        OutputStream out = null;
13663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        try {
13763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            in = getContext().getResources().openRawResource(rawId);
13863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            out = new FileOutputStream(file);
13963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            Streams.copy(in, out);
14063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        } finally {
14163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            IoUtils.closeQuietly(in);
14263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            IoUtils.closeQuietly(out);
14363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
14463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
14563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
14663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private static void assertSummaryTotal(NetworkStatsCollection collection,
14763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkTemplate template, long rxBytes, long rxPackets, long txBytes, long txPackets) {
14863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats.Entry entry = collection.getSummary(
14963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                template, Long.MIN_VALUE, Long.MAX_VALUE).getTotal(null);
15063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEntry(entry, rxBytes, rxPackets, txBytes, txPackets);
15163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
15263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
15363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private static void assertSummaryTotalIncludingTags(NetworkStatsCollection collection,
15463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkTemplate template, long rxBytes, long rxPackets, long txBytes, long txPackets) {
15563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats.Entry entry = collection.getSummary(
15663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                template, Long.MIN_VALUE, Long.MAX_VALUE).getTotalIncludingTags(null);
15763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEntry(entry, rxBytes, rxPackets, txBytes, txPackets);
15863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
15963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
16063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private static void assertEntry(
16163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkStats.Entry entry, long rxBytes, long rxPackets, long txBytes, long txPackets) {
16263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
16363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
16463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
16563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
16663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
16763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
168