Growable NetworkStats object instead of builder.

NetworkStats now grows in place with arraycopy() instead of callers
needing to know record count a priori.  Better growth calculation for
both NetworkStats and NetworkStatsHistory; 50% each time.  Better
estimates of buckets needed in calling services.

Change-Id: I3adbffa0b7407612cc6349d9135a8b4eb63cd440
diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java
index 8a3e871..5250a7c 100644
--- a/core/tests/coretests/src/android/net/NetworkStatsTest.java
+++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java
@@ -16,7 +16,6 @@
 
 package android.net;
 
-import android.os.SystemClock;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import junit.framework.TestCase;
@@ -25,12 +24,14 @@
 public class NetworkStatsTest extends TestCase {
 
     private static final String TEST_IFACE = "test0";
+    private static final int TEST_UID = 1001;
+    private static final long TEST_START = 1194220800000L;
 
     public void testFindIndex() throws Exception {
-        final NetworkStats stats = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 3)
+        final NetworkStats stats = new NetworkStats(TEST_START, 3)
                 .addEntry(TEST_IFACE, 100, 1024, 0)
                 .addEntry(TEST_IFACE, 101, 0, 1024)
-                .addEntry(TEST_IFACE, 102, 1024, 1024).build();
+                .addEntry(TEST_IFACE, 102, 1024, 1024);
 
         assertEquals(2, stats.findIndex(TEST_IFACE, 102));
         assertEquals(2, stats.findIndex(TEST_IFACE, 102));
@@ -38,14 +39,40 @@
         assertEquals(-1, stats.findIndex(TEST_IFACE, 6));
     }
 
-    public void testSubtractIdenticalData() throws Exception {
-        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
-                .addEntry(TEST_IFACE, 100, 1024, 0)
-                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+    public void testAddEntryGrow() throws Exception {
+        final NetworkStats stats = new NetworkStats(TEST_START, 2);
 
-        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+        assertEquals(0, stats.size);
+        assertEquals(2, stats.iface.length);
+
+        stats.addEntry(TEST_IFACE, TEST_UID, 1L, 2L);
+        stats.addEntry(TEST_IFACE, TEST_UID, 2L, 2L);
+
+        assertEquals(2, stats.size);
+        assertEquals(2, stats.iface.length);
+
+        stats.addEntry(TEST_IFACE, TEST_UID, 3L, 4L);
+        stats.addEntry(TEST_IFACE, TEST_UID, 4L, 4L);
+        stats.addEntry(TEST_IFACE, TEST_UID, 5L, 5L);
+
+        assertEquals(5, stats.size);
+        assertTrue(stats.iface.length >= 5);
+
+        assertEquals(1L, stats.rx[0]);
+        assertEquals(2L, stats.rx[1]);
+        assertEquals(3L, stats.rx[2]);
+        assertEquals(4L, stats.rx[3]);
+        assertEquals(5L, stats.rx[4]);
+    }
+
+    public void testSubtractIdenticalData() throws Exception {
+        final NetworkStats before = new NetworkStats(TEST_START, 2)
                 .addEntry(TEST_IFACE, 100, 1024, 0)
-                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+                .addEntry(TEST_IFACE, 101, 0, 1024);
+
+        final NetworkStats after = new NetworkStats(TEST_START, 2)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024);
 
         final NetworkStats result = after.subtract(before);
 
@@ -57,13 +84,13 @@
     }
 
     public void testSubtractIdenticalRows() throws Exception {
-        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+        final NetworkStats before = new NetworkStats(TEST_START, 2)
                 .addEntry(TEST_IFACE, 100, 1024, 0)
-                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+                .addEntry(TEST_IFACE, 101, 0, 1024);
 
-        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+        final NetworkStats after = new NetworkStats(TEST_START, 2)
                 .addEntry(TEST_IFACE, 100, 1025, 2)
-                .addEntry(TEST_IFACE, 101, 3, 1028).build();
+                .addEntry(TEST_IFACE, 101, 3, 1028);
 
         final NetworkStats result = after.subtract(before);
 
@@ -75,14 +102,14 @@
     }
 
     public void testSubtractNewRows() throws Exception {
-        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+        final NetworkStats before = new NetworkStats(TEST_START, 2)
                 .addEntry(TEST_IFACE, 100, 1024, 0)
-                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+                .addEntry(TEST_IFACE, 101, 0, 1024);
 
-        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 3)
+        final NetworkStats after = new NetworkStats(TEST_START, 3)
                 .addEntry(TEST_IFACE, 100, 1024, 0)
                 .addEntry(TEST_IFACE, 101, 0, 1024)
-                .addEntry(TEST_IFACE, 102, 1024, 1024).build();
+                .addEntry(TEST_IFACE, 102, 1024, 1024);
 
         final NetworkStats result = after.subtract(before);
 
diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
index d6e4b8b..2457ff3 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
@@ -145,8 +145,8 @@
         elapsedRealtime += HOUR_IN_MILLIS;
         expectTime(TEST_START + elapsedRealtime);
         expectDefaultSettings();
-        expectNetworkStatsSummary(new NetworkStats.Builder(elapsedRealtime, 1)
-                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L).build());
+        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
+                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L));
         expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
 
         replay();
@@ -161,8 +161,8 @@
         elapsedRealtime += DAY_IN_MILLIS;
         expectTime(TEST_START + elapsedRealtime);
         expectDefaultSettings();
-        expectNetworkStatsSummary(new NetworkStats.Builder(elapsedRealtime, 1)
-                .addEntry(TEST_IFACE, UID_ALL, 4096L, 8192L).build());
+        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
+                .addEntry(TEST_IFACE, UID_ALL, 4096L, 8192L));
         expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
 
         replay();
@@ -196,12 +196,12 @@
         elapsedRealtime += HOUR_IN_MILLIS;
         expectTime(TEST_START + elapsedRealtime);
         expectDefaultSettings();
-        expectNetworkStatsSummary(new NetworkStats.Builder(elapsedRealtime, 1)
-                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L).build());
+        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
+                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L));
         // TODO: switch these stats to specific iface
-        expectNetworkStatsDetail(new NetworkStats.Builder(elapsedRealtime, 2)
+        expectNetworkStatsDetail(new NetworkStats(elapsedRealtime, 2)
                 .addEntry(IFACE_ALL, TEST_UID_1, 512L, 256L)
-                .addEntry(IFACE_ALL, TEST_UID_2, 128L, 128L).build());
+                .addEntry(IFACE_ALL, TEST_UID_2, 128L, 128L));
 
         replay();
         mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
@@ -262,8 +262,8 @@
         elapsedRealtime += 2 * HOUR_IN_MILLIS;
         expectTime(TEST_START + elapsedRealtime);
         expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
-        expectNetworkStatsSummary(new NetworkStats.Builder(elapsedRealtime, 1)
-                .addEntry(TEST_IFACE, UID_ALL, 512L, 512L).build());
+        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
+                .addEntry(TEST_IFACE, UID_ALL, 512L, 512L));
         expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
 
         replay();
@@ -378,7 +378,7 @@
     }
 
     private static NetworkStats buildEmptyStats(long elapsedRealtime) {
-        return new NetworkStats.Builder(elapsedRealtime, 0).build();
+        return new NetworkStats(elapsedRealtime, 0);
     }
 
     private void replay() {