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 */ 16 17package com.android.internal.net; 18 19import static android.net.NetworkStats.ROAMING_NO; 20import static android.net.NetworkStats.SET_ALL; 21import static android.net.NetworkStats.SET_DEFAULT; 22import static android.net.NetworkStats.SET_FOREGROUND; 23import static android.net.NetworkStats.TAG_NONE; 24import static android.net.NetworkStats.UID_ALL; 25import static com.android.server.NetworkManagementSocketTagger.kernelToTag; 26 27import android.content.res.Resources; 28import android.net.NetworkStats; 29import android.net.TrafficStats; 30import android.test.AndroidTestCase; 31 32import com.android.frameworks.coretests.R; 33 34import java.io.File; 35import java.io.FileOutputStream; 36import java.io.FileWriter; 37import java.io.InputStream; 38import java.io.OutputStream; 39 40import libcore.io.IoUtils; 41import libcore.io.Streams; 42 43/** 44 * Tests for {@link NetworkStatsFactory}. 45 */ 46public class NetworkStatsFactoryTest extends AndroidTestCase { 47 private File mTestProc; 48 private NetworkStatsFactory mFactory; 49 50 @Override 51 public void setUp() throws Exception { 52 super.setUp(); 53 54 mTestProc = new File(getContext().getFilesDir(), "proc"); 55 if (mTestProc.exists()) { 56 IoUtils.deleteContents(mTestProc); 57 } 58 59 mFactory = new NetworkStatsFactory(mTestProc); 60 } 61 62 @Override 63 public void tearDown() throws Exception { 64 mFactory = null; 65 66 if (mTestProc.exists()) { 67 IoUtils.deleteContents(mTestProc); 68 } 69 70 super.tearDown(); 71 } 72 73 public void testNetworkStatsDetail() throws Exception { 74 stageFile(R.raw.xt_qtaguid_typical, new File(mTestProc, "net/xt_qtaguid/stats")); 75 76 final NetworkStats stats = mFactory.readNetworkStatsDetail(); 77 assertEquals(70, stats.size()); 78 assertStatsEntry(stats, "wlan0", 0, SET_DEFAULT, 0x0, 18621L, 2898L); 79 assertStatsEntry(stats, "wlan0", 10011, SET_DEFAULT, 0x0, 35777L, 5718L); 80 assertStatsEntry(stats, "wlan0", 10021, SET_DEFAULT, 0x7fffff01, 562386L, 49228L); 81 assertStatsEntry(stats, "rmnet1", 10021, SET_DEFAULT, 0x30100000, 219110L, 227423L); 82 assertStatsEntry(stats, "rmnet2", 10001, SET_DEFAULT, 0x0, 1125899906842624L, 984L); 83 } 84 85 public void testKernelTags() throws Exception { 86 assertEquals(0, kernelToTag("0x0000000000000000")); 87 assertEquals(0x32, kernelToTag("0x0000003200000000")); 88 assertEquals(2147483647, kernelToTag("0x7fffffff00000000")); 89 assertEquals(0, kernelToTag("0x0000000000000000")); 90 assertEquals(2147483136, kernelToTag("0x7FFFFE0000000000")); 91 92 assertEquals(0, kernelToTag("0x0")); 93 assertEquals(0, kernelToTag("0xf00d")); 94 assertEquals(1, kernelToTag("0x100000000")); 95 assertEquals(14438007, kernelToTag("0xdc4e7700000000")); 96 assertEquals(TrafficStats.TAG_SYSTEM_DOWNLOAD, kernelToTag("0xffffff0100000000")); 97 } 98 99 public void testNetworkStatsWithSet() throws Exception { 100 stageFile(R.raw.xt_qtaguid_typical, new File(mTestProc, "net/xt_qtaguid/stats")); 101 102 final NetworkStats stats = mFactory.readNetworkStatsDetail(); 103 assertEquals(70, stats.size()); 104 assertStatsEntry(stats, "rmnet1", 10021, SET_DEFAULT, 0x30100000, 219110L, 578L, 227423L, 676L); 105 assertStatsEntry(stats, "rmnet1", 10021, SET_FOREGROUND, 0x30100000, 742L, 3L, 1265L, 3L); 106 } 107 108 public void testNetworkStatsSingle() throws Exception { 109 stageFile(R.raw.xt_qtaguid_iface_typical, new File(mTestProc, "net/xt_qtaguid/iface_stat_all")); 110 111 final NetworkStats stats = mFactory.readNetworkStatsSummaryDev(); 112 assertEquals(6, stats.size()); 113 assertStatsEntry(stats, "rmnet0", UID_ALL, SET_ALL, TAG_NONE, 2112L, 24L, 700L, 10L); 114 assertStatsEntry(stats, "test1", UID_ALL, SET_ALL, TAG_NONE, 6L, 8L, 10L, 12L); 115 assertStatsEntry(stats, "test2", UID_ALL, SET_ALL, TAG_NONE, 1L, 2L, 3L, 4L); 116 } 117 118 public void testNetworkStatsXt() throws Exception { 119 stageFile(R.raw.xt_qtaguid_iface_fmt_typical, 120 new File(mTestProc, "net/xt_qtaguid/iface_stat_fmt")); 121 122 final NetworkStats stats = mFactory.readNetworkStatsSummaryXt(); 123 assertEquals(3, stats.size()); 124 assertStatsEntry(stats, "rmnet0", UID_ALL, SET_ALL, TAG_NONE, 6824L, 16L, 5692L, 10L); 125 assertStatsEntry(stats, "rmnet1", UID_ALL, SET_ALL, TAG_NONE, 11153922L, 8051L, 190226L, 2468L); 126 assertStatsEntry(stats, "rmnet2", UID_ALL, SET_ALL, TAG_NONE, 4968L, 35L, 3081L, 39L); 127 } 128 129 /** 130 * Copy a {@link Resources#openRawResource(int)} into {@link File} for 131 * testing purposes. 132 */ 133 private void stageFile(int rawId, File file) throws Exception { 134 new File(file.getParent()).mkdirs(); 135 InputStream in = null; 136 OutputStream out = null; 137 try { 138 in = getContext().getResources().openRawResource(rawId); 139 out = new FileOutputStream(file); 140 Streams.copy(in, out); 141 } finally { 142 IoUtils.closeQuietly(in); 143 IoUtils.closeQuietly(out); 144 } 145 } 146 147 private void stageLong(long value, File file) throws Exception { 148 new File(file.getParent()).mkdirs(); 149 FileWriter out = null; 150 try { 151 out = new FileWriter(file); 152 out.write(Long.toString(value)); 153 } finally { 154 IoUtils.closeQuietly(out); 155 } 156 } 157 158 private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, 159 int tag, long rxBytes, long txBytes) { 160 final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO); 161 final NetworkStats.Entry entry = stats.getValues(i, null); 162 assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); 163 assertEquals("unexpected txBytes", txBytes, entry.txBytes); 164 } 165 166 private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, 167 int tag, long rxBytes, long rxPackets, long txBytes, long txPackets) { 168 final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO); 169 final NetworkStats.Entry entry = stats.getValues(i, null); 170 assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); 171 assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); 172 assertEquals("unexpected txBytes", txBytes, entry.txBytes); 173 assertEquals("unexpected txPackets", txPackets, entry.txPackets); 174 } 175 176} 177