149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu/*
249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * Copyright (C) 2016 The Android Open Source Project
349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu *
449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * you may not use this file except in compliance with the License.
649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * You may obtain a copy of the License at
749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu *
849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu *
1049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * Unless required by applicable law or agreed to in writing, software
1149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
1249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * See the License for the specific language governing permissions and
1449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * limitations under the License.
1549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu */
1649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
1749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiupackage com.android.server.wifi.hotspot2;
1849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
1949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport static org.junit.Assert.assertEquals;
2049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport static org.mockito.Mockito.mock;
2149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport static org.mockito.Mockito.when;
2249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
2349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport android.net.wifi.ScanResult;
247f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest;
2549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
2649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.ScanDetail;
2749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.hotspot2.anqp.ANQPElement;
2849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.hotspot2.anqp.Constants;
2949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType;
3049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.hotspot2.anqp.HSWanMetricsElement;
3149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport com.android.server.wifi.hotspot2.anqp.IPAddressTypeAvailabilityElement;
3249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
3349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport org.junit.Test;
3449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
3549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport java.util.ArrayList;
3649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport java.util.HashMap;
3749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport java.util.List;
3849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiuimport java.util.Map;
3949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
4049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu/**
4149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.PasspointNetworkScore}.
4249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu */
4349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu@SmallTest
4449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiupublic class PasspointNetworkScoreTest {
4549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static class TestData {
4649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final boolean isHomeProvider;
4749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final boolean isActiveNetwork;
4849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final int rssiLevel;
4949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final boolean internetAccess;
5049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final NetworkDetail.Ant networkType;
5149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public final Map<ANQPElementType, ANQPElement> anqpElements;
5249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        public int expectedScore;
5349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
5449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TestData(boolean homeProvider, boolean activeNetwork, int rssi, boolean internet,
5549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant type, Map<ANQPElementType, ANQPElement> elements,
5649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                int score) {
5749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            isHomeProvider = homeProvider;
5849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            isActiveNetwork = activeNetwork;
5949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            rssiLevel = rssi;
6049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            internetAccess = internet;
6149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            networkType = type;
6249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            anqpElements = elements;
6349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            expectedScore = score;
6449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        }
6549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    }
6649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
6749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final HSWanMetricsElement WAN_PORT_DOWN_ELEMENT = new HSWanMetricsElement(
6849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            HSWanMetricsElement.LINK_STATUS_DOWN /* status */, true /* symmetric */,
6949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            false /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
7049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
7149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
7249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final HSWanMetricsElement WAN_PORT_UP_ELEMENT = new HSWanMetricsElement(
7349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            HSWanMetricsElement.LINK_STATUS_UP /* status */, true /* symmetric */,
7449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            false /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
7549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
7649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
7749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final HSWanMetricsElement WAN_PORT_CAPPED_ELEMENT = new HSWanMetricsElement(
7849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            HSWanMetricsElement.LINK_STATUS_UP /* status */, true /* symmetric */,
7949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            true /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
8049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
8149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
8249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final IPAddressTypeAvailabilityElement UNRESTRICTED_IP_ADDRESS_ELEMENT =
8349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new IPAddressTypeAvailabilityElement(IPAddressTypeAvailabilityElement.IPV4_PUBLIC,
8449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                    IPAddressTypeAvailabilityElement.IPV6_AVAILABLE);
8549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
8649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final IPAddressTypeAvailabilityElement UNAVAILABLE_IP_ADDRESS_ELEMENT =
8749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new IPAddressTypeAvailabilityElement(
8849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                    IPAddressTypeAvailabilityElement.IPV4_NOT_AVAILABLE,
8949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                    IPAddressTypeAvailabilityElement.IPV6_NOT_AVAILABLE);
9049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
9149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final IPAddressTypeAvailabilityElement UNKNOWN_IP_ADDRESS_ELEMENT =
9249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new IPAddressTypeAvailabilityElement(
9349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                    IPAddressTypeAvailabilityElement.IPV4_UNKNOWN,
9449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                    IPAddressTypeAvailabilityElement.IPV6_UNKNOWN);
9549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
9649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_DOWN =
9749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
9849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
9949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_UP =
10049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
10149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
10249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_CAPPED =
10349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
10449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
10549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNRESTRICTED_IP =
10649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
10749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
10849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNAVAILABLE_IP =
10949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
11049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
11149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNKNOWN_IP =
11249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            new HashMap<>();
11349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
11449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    // List of test data.
11549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static final List<TestData> TEST_DATA_LIST = new ArrayList<>();
11649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    static {
11749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Setup ANQP elements map for testing.
11849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_WAN_PORT_DOWN.put(Constants.ANQPElementType.HSWANMetrics,
11949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                WAN_PORT_DOWN_ELEMENT);
12049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_WAN_PORT_UP.put(Constants.ANQPElementType.HSWANMetrics,
12149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                WAN_PORT_UP_ELEMENT);
12249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_WAN_PORT_CAPPED.put(Constants.ANQPElementType.HSWANMetrics,
12349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                WAN_PORT_CAPPED_ELEMENT);
12449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_UNRESTRICTED_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
12549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                UNRESTRICTED_IP_ADDRESS_ELEMENT);
12649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_UNAVAILABLE_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
12749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                UNAVAILABLE_IP_ADDRESS_ELEMENT);
12849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_ANQP_WITH_UNKNOWN_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
12949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                UNKNOWN_IP_ADDRESS_ELEMENT);
13049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
13149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
13249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network.
13349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
13449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
13549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
13649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
13749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
13849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
13949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
14049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
14149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
14249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's the current active network.
14349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, true /* isActiveNetwork */,
14449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
14549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
14649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
14749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
14849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
14949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
15049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, true)));
15149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
15249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network without Internet access that's not the current
15349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network.
15449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
15549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, false /* internetAccess */,
15649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
15749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
15849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
15949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                - PasspointNetworkScore.INTERNET_ACCESS_AWARD
16049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
16149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
16249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
16349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider personal network with Internet access that's not the current active
16449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // network.
16549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
16649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
16749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.Personal /* networkType */, null /* anqpElements */,
16849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
16949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
17049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
17149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PERSONAL_OR_EMERGENCY_NETWORK_AWARDS
17249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
17349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
17449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
17549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating WAN port is up.
17649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
17749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
17849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
17949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_WAN_PORT_UP /* anqpElements */,
18049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
18149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
18249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
18349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
18449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
18549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
18649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
18749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating WAN port is down.
18849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
18949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
19049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
19149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_WAN_PORT_DOWN /* anqpElements */,
19249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
19349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
19449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
19549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
19649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
19749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                - PasspointNetworkScore.WAN_PORT_DOWN_OR_CAPPED_PENALTY));
19849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
19949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
20049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating WAN port is capped (max load reached).
20149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
20249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
20349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
20449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_WAN_PORT_CAPPED /* anqpElements */,
20549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
20649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
20749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
20849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
20949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
21049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                - PasspointNetworkScore.WAN_PORT_DOWN_OR_CAPPED_PENALTY));
21149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
21249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
21349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are available.
21449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
21549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
21649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
21749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_UNRESTRICTED_IP /* anqpElements */,
21849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
21949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
22049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
22149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
22249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
22349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.UNRESTRICTED_IP_AWARDS * 2 /* one for IPv4 and IPv6 */));
22449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
22549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
22649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are available.
22749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
22849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
22949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
23049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_UNRESTRICTED_IP /* anqpElements */,
23149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
23249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
23349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
23449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
23549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
23649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* one each for IPv4 and IPv6. */
23749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.UNRESTRICTED_IP_AWARDS * 2));
23849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
23949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
24049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are
24149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // unavailable.
24249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
24349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
24449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
24549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_UNAVAILABLE_IP /* anqpElements */,
24649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
24749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
24849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
24949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
25049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
25149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
25249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Home provider public network with Internet access that's not the current
25349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are unknown.
25449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
25549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
25649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */,
25749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                TEST_ANQP_WITH_UNKNOWN_IP /* anqpElements */,
25849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
25949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.HOME_PROVIDER_AWARD
26049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
26149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
26249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
26349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* one each for IPv4 and IPv6. */
26449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RESTRICTED_OR_UNKNOWN_IP_AWARDS * 2));
26549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
26649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Roaming provider public network with Internet access that's not the current active
26749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // network.
26849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
26949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
27049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
27149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
27249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.INTERNET_ACCESS_AWARD
27349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
27449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
27549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
27649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Roaming provider public network with Internet access that's the current active network.
27749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, true /* isActiveNetwork */,
27849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
27949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
28049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
28149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.INTERNET_ACCESS_AWARD
28249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
28349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, true)));
28449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
28549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Roaming provider public network without Internet access that's not the current active
28649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // network.
28749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
28849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, false /* internetAccess */,
28949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
29049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
29149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
29249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                - PasspointNetworkScore.INTERNET_ACCESS_AWARD
29349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
29449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
29549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Roaming provider personal network with Internet access that's not the current active
29649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // network.
29749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
29849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                -60 /* rssiLevel */, true /* internetAccess */,
29949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                NetworkDetail.Ant.Personal /* networkType */, null /* anqpElements */,
30049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                /* expectedScore */
30149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                PasspointNetworkScore.INTERNET_ACCESS_AWARD
30249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.PERSONAL_OR_EMERGENCY_NETWORK_AWARDS
30349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
30449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    }
30549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
30649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    /**
30749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * Helper function for generating a {@link ScanDetail} for testing.
30849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     *
30949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * @param rssiLevel RSSI level of the network
31049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * @param internetAccess Flag indicating if the network provides Internet access
31149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * @param networkType The type of the network
31249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * @return {@link ScanDetail}
31349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     */
31449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    private static ScanDetail generateScanDetail(int rssiLevel, boolean internetAccess,
315ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu            NetworkDetail.Ant networkType) {
31649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Setup ScanResult.
31749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        ScanResult scanResult = new ScanResult();
31849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        scanResult.level = -60;
31949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
32049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Setup NetworkDetail.
32149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        NetworkDetail networkDetail = mock(NetworkDetail.class);
32249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        when(networkDetail.isInternet()).thenReturn(internetAccess);
32349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        when(networkDetail.getAnt()).thenReturn(networkType);
32449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
32549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        // Setup ScanDetail.
32649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        ScanDetail scanDetail = mock(ScanDetail.class);
32749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        when(scanDetail.getScanResult()).thenReturn(scanResult);
32849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        when(scanDetail.getNetworkDetail()).thenReturn(networkDetail);
32949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
33049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        return scanDetail;
33149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    }
33249036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
33349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    /**
33449036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * Go through the list of the test data {@link #TEST_DATA_LIST} and verify the score for each.
33549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     *
33649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     * @throws Exception
33749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu     */
33849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    @Test
33949036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    public void calculateScore() throws Exception {
34049036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        for (TestData data : TEST_DATA_LIST) {
34149036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            ScanDetail scanDetail = generateScanDetail(data.rssiLevel, data.internetAccess,
342ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu                    data.networkType);
34349036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu            assertEquals(data.expectedScore, PasspointNetworkScore.calculateScore(
344ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu                    data.isHomeProvider, scanDetail, data.anqpElements, data.isActiveNetwork));
34549036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu        }
34649036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu    }
34749036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu
34849036aa383a6dfdaaf84e760e72d627638a9d86aPeter Qiu}
349