/*
 * 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.net;

import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_NO;
import static android.net.NetworkStats.METERED_YES;
import static android.net.NetworkStats.ROAMING_ALL;
import static android.net.NetworkStats.ROAMING_NO;
import static android.net.NetworkStats.ROAMING_YES;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.TAG_NONE;

import static org.junit.Assert.assertEquals;

import android.net.NetworkStats;
import android.net.UnderlyingNetworkInfo;

import java.util.Arrays;

/** Superclass with utilities for NetworkStats(Service|Factory)Test */
abstract class NetworkStatsBaseTest {
    static final String TEST_IFACE = "test0";
    static final String TEST_IFACE2 = "test1";
    static final String TUN_IFACE = "test_nss_tun0";
    static final String TUN_IFACE2 = "test_nss_tun1";

    static final int UID_RED = 1001;
    static final int UID_BLUE = 1002;
    static final int UID_GREEN = 1003;
    static final int UID_VPN = 1004;

    void assertValues(NetworkStats stats, String iface, int uid, long rxBytes,
            long rxPackets, long txBytes, long txPackets) {
        assertValues(
                stats, iface, uid, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL,
                rxBytes, rxPackets, txBytes, txPackets, 0);
    }

    void assertValues(NetworkStats stats, String iface, int uid, int set, int tag,
            int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
            long txBytes, long txPackets, long operations) {
        final NetworkStats.Entry entry = new NetworkStats.Entry();
        final int[] sets;
        if (set == SET_ALL) {
            sets = new int[] {SET_ALL, SET_DEFAULT, SET_FOREGROUND};
        } else {
            sets = new int[] {set};
        }

        final int[] roamings;
        if (roaming == ROAMING_ALL) {
            roamings = new int[] {ROAMING_ALL, ROAMING_YES, ROAMING_NO};
        } else {
            roamings = new int[] {roaming};
        }

        final int[] meterings;
        if (metered == METERED_ALL) {
            meterings = new int[] {METERED_ALL, METERED_YES, METERED_NO};
        } else {
            meterings = new int[] {metered};
        }

        final int[] defaultNetworks;
        if (defaultNetwork == DEFAULT_NETWORK_ALL) {
            defaultNetworks =
                    new int[] {DEFAULT_NETWORK_ALL, DEFAULT_NETWORK_YES, DEFAULT_NETWORK_NO};
        } else {
            defaultNetworks = new int[] {defaultNetwork};
        }

        for (int s : sets) {
            for (int r : roamings) {
                for (int m : meterings) {
                    for (int d : defaultNetworks) {
                        final int i = stats.findIndex(iface, uid, s, tag, m, r, d);
                        if (i != -1) {
                            entry.add(stats.getValues(i, null));
                        }
                    }
                }
            }
        }

        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
        assertEquals("unexpected operations", operations, entry.operations);
    }

    static UnderlyingNetworkInfo createVpnInfo(String[] underlyingIfaces) {
        return createVpnInfo(TUN_IFACE, underlyingIfaces);
    }

    static UnderlyingNetworkInfo createVpnInfo(String vpnIface, String[] underlyingIfaces) {
        return new UnderlyingNetworkInfo(UID_VPN, vpnIface, Arrays.asList(underlyingIfaces));
    }
}
