17ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong/*
27ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Copyright (C) 2015 The Android Open Source Project
37ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong *
47ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Licensed under the Apache License, Version 2.0 (the "License");
57ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * you may not use this file except in compliance with the License.
67ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * You may obtain a copy of the License at
77ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong *
87ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong *      http://www.apache.org/licenses/LICENSE-2.0
97ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong *
107ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Unless required by applicable law or agreed to in writing, software
117ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * distributed under the License is distributed on an "AS IS" BASIS,
127ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * See the License for the specific language governing permissions and
147ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * limitations under the License
157ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong */
167ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
177ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tongpackage android.net;
187ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
1976a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinimport com.google.caliper.BeforeExperiment;
207ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tongimport com.google.caliper.Param;
217ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
2276a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinpublic class NetworkStatsBenchmark {
237ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    private static final String UNDERLYING_IFACE = "wlan0";
247ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    private static final String TUN_IFACE = "tun0";
257ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    private static final int TUN_UID = 999999999;
267ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
277ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    @Param({"100", "1000"})
287ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    private int mSize;
297ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    private NetworkStats mNetworkStats;
307ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
3176a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffin    @BeforeExperiment
327ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    protected void setUp() throws Exception {
337ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        mNetworkStats = new NetworkStats(0, mSize + 2);
347ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        int uid = 0;
357ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        NetworkStats.Entry recycle = new NetworkStats.Entry();
367ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        for (int i = 0; i < mSize; i++) {
377ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.iface = (i < mSize / 2) ? TUN_IFACE : UNDERLYING_IFACE;
387ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.uid = uid;
397ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.set = i % 2;
407ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.tag = NetworkStats.TAG_NONE;
417ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.rxBytes = 60000;
427ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.rxPackets = 60;
437ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.txBytes = 150000;
447ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.txPackets = 1500;
457ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            recycle.operations = 0;
467ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            mNetworkStats.addValues(recycle);
477ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            if (recycle.set == 1) {
487ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong                uid++;
497ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            }
507ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        }
517ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.iface = UNDERLYING_IFACE;
527ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.uid = TUN_UID;
537ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.set = NetworkStats.SET_FOREGROUND;
547ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.tag = NetworkStats.TAG_NONE;
557ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.rxBytes = 90000 * mSize;
567ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.rxPackets = 40 * mSize;
577ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.txBytes = 180000 * mSize;
587ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.txPackets = 1200 * mSize;
597ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        recycle.operations = 0;
607ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        mNetworkStats.addValues(recycle);
617ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    }
627ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
637ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    public void timeMigrateTun(int reps) {
647ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        for (int i = 0; i < reps; i++) {
657ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            NetworkStats stats = mNetworkStats.clone();
667ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            stats.migrateTun(TUN_UID, TUN_IFACE, UNDERLYING_IFACE);
677ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        }
687ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    }
697ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong
707ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    /**
717ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong     * Since timeMigrateTun() includes a clone() call on the NetworkStats object,
727ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong     * we need to measure the cost of the clone() call itself in order to get more
737ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong     * accurate measurement on the migrateTun() method.
747ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong     */
757ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    public void timeClone(int reps) {
767ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        for (int i = 0; i < reps; i++) {
777ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong            NetworkStats stats = mNetworkStats.clone();
787ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong        }
797ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong    }
807ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong}
81