Better network stats parsing, integer tags, async.

Change NMS parsing to handle extended /proc/ stats formats by pairing
values with header keys.  Move TrafficStats to integer tags to match
kernel internals, and offer well-known tags for system services.

Async policy event dispatch from NPMS, and update tests to block for
event dispatch.  Narrow app policy to exclude apps signed with system
key, which are usually critical.

Bug: 4948913, 4903489, 4585280

Change-Id: Idb357227ccaa617906411f309371cea18d7bc519
This commit is contained in:
Jeff Sharkey
2011-06-24 17:05:24 -07:00
parent efaa396ae9
commit 2cc5fa7fbe
3 changed files with 157 additions and 1 deletions

View File

@@ -0,0 +1,32 @@
idx iface acct_tag_hex uid_tag_int rx_bytes tx_bytes
1 wlan0 0x0 0 14615 4270
2 wlan0 0x0 1000 5175 915
3 wlan0 0x0 1021 3381 903
4 wlan0 0x0 10004 333821 53558
5 wlan0 0x0 10010 4888 37363
6 wlan0 0x0 10013 52 104
7 wlan0 0x74182ada00000000 10004 18725 1066
8 rmnet0 0x0 0 301274 30244
9 rmnet0 0x0 1000 304 441
10 rmnet0 0x0 1013 2880 2272
11 rmnet0 0x0 1021 31407 8430
12 rmnet0 0x0 10003 32665 3814
13 rmnet0 0x0 10004 2373141 420112
14 rmnet0 0x0 10010 870370 1111727
15 rmnet0 0x0 10013 240 240
16 rmnet0 0x0 10016 16703 13512
17 rmnet0 0x0 10017 3990 3269
18 rmnet0 0x0 10018 474504 14516062
19 rmnet0 0x0 10019 782804 71077
20 rmnet0 0x0 10022 70671 49684
21 rmnet0 0x0 10029 5785354 397159
22 rmnet0 0x0 10033 2102 1686
23 rmnet0 0x0 10034 15495464 227694
24 rmnet0 0x0 10037 31184994 684122
25 rmnet0 0x0 10051 298687 113485
26 rmnet0 0x0 10056 29504 20669
27 rmnet0 0x0 10069 683 596
28 rmnet0 0x0 10072 34051 12453
29 rmnet0 0x0 10077 7025393 213866
30 rmnet0 0x0 10081 354 1178
31 rmnet0 0x74182ada00000000 10037 28507378 437004

View File

@@ -0,0 +1,121 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server;
import static dalvik.system.BlockGuard.kernelToTag;
import static dalvik.system.BlockGuard.tagToKernel;
import android.content.res.Resources;
import android.net.NetworkStats;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import com.android.frameworks.servicestests.R;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import libcore.io.IoUtils;
import libcore.io.Streams;
/**
* Tests for {@link NetworkManagementService}.
*/
@LargeTest
public class NetworkManagementServiceTest extends AndroidTestCase {
private File mTestProc;
private NetworkManagementService mService;
@Override
public void setUp() throws Exception {
super.setUp();
mTestProc = getContext().getFilesDir();
mService = NetworkManagementService.createForTest(mContext, mTestProc);
}
@Override
public void tearDown() throws Exception {
mService = null;
super.tearDown();
}
public void testNetworkStatsDetail() throws Exception {
stageFile(R.raw.xt_qtaguid_typical, new File(mTestProc, "net/xt_qtaguid/stats"));
final NetworkStats stats = mService.getNetworkStatsDetail();
assertEquals(31, stats.size);
assertStatsEntry(stats, "wlan0", 0, 0, 14615L, 4270L);
assertStatsEntry(stats, "wlan0", 10004, 0, 333821L, 53558L);
assertStatsEntry(stats, "wlan0", 10004, 1947740890, 18725L, 1066L);
assertStatsEntry(stats, "rmnet0", 10037, 0, 31184994L, 684122L);
assertStatsEntry(stats, "rmnet0", 10037, 1947740890, 28507378L, 437004L);
}
public void testNetworkStatsDetailExtended() throws Exception {
stageFile(R.raw.xt_qtaguid_extended, new File(mTestProc, "net/xt_qtaguid/stats"));
final NetworkStats stats = mService.getNetworkStatsDetail();
assertEquals(2, stats.size);
assertStatsEntry(stats, "test0", 1000, 0, 1024L, 2048L);
assertStatsEntry(stats, "test0", 1000, 0xF00D, 512L, 512L);
}
public void testKernelTags() throws Exception {
assertEquals("0", tagToKernel(0x0));
assertEquals("214748364800", tagToKernel(0x32));
assertEquals("9223372032559808512", tagToKernel(Integer.MAX_VALUE));
assertEquals("0", tagToKernel(Integer.MIN_VALUE));
assertEquals("9223369837831520256", tagToKernel(Integer.MIN_VALUE - 512));
assertEquals(0, kernelToTag("0x0000000000000000"));
assertEquals(0x32, kernelToTag("0x0000003200000000"));
assertEquals(2147483647, kernelToTag("0x7fffffff00000000"));
assertEquals(0, kernelToTag("0x0000000000000000"));
assertEquals(2147483136, kernelToTag("0x7FFFFE0000000000"));
}
/**
* Copy a {@link Resources#openRawResource(int)} into {@link File} for
* testing purposes.
*/
private void stageFile(int rawId, File file) throws Exception {
new File(file.getParent()).mkdirs();
InputStream in = null;
OutputStream out = null;
try {
in = getContext().getResources().openRawResource(rawId);
out = new FileOutputStream(file);
Streams.copy(in, out);
} finally {
IoUtils.closeQuietly(in);
IoUtils.closeQuietly(out);
}
}
private static void assertStatsEntry(
NetworkStats stats, String iface, int uid, int tag, long rx, long tx) {
final int i = stats.findIndex(iface, uid, tag);
assertEquals(rx, stats.rx[i]);
assertEquals(tx, stats.tx[i]);
}
}

View File

@@ -59,7 +59,6 @@ import android.os.INetworkManagementService;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.test.AndroidTestCase; import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
import android.util.TrustedTime; import android.util.TrustedTime;
import com.android.server.net.NetworkStatsService; import com.android.server.net.NetworkStatsService;
@@ -611,6 +610,9 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
mAlarmManager.setInexactRepeating( mAlarmManager.setInexactRepeating(
eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class)); eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
expectLastCall().atLeastOnce(); expectLastCall().atLeastOnce();
mNetManager.setBandwidthControlEnabled(true);
expectLastCall().atLeastOnce();
} }
private void expectNetworkState(NetworkState... state) throws Exception { private void expectNetworkState(NetworkState... state) throws Exception {
@@ -631,6 +633,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
private void expectSettings(long persistThreshold, long bucketDuration, long maxHistory) private void expectSettings(long persistThreshold, long bucketDuration, long maxHistory)
throws Exception { throws Exception {
expect(mSettings.getEnabled()).andReturn(true).anyTimes();
expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes(); expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
expect(mSettings.getPersistThreshold()).andReturn(persistThreshold).anyTimes(); expect(mSettings.getPersistThreshold()).andReturn(persistThreshold).anyTimes();
expect(mSettings.getNetworkBucketDuration()).andReturn(bucketDuration).anyTimes(); expect(mSettings.getNetworkBucketDuration()).andReturn(bucketDuration).anyTimes();