1c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman/*
2c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman t Copyright (C) 2016 The Android Open Source Project
3c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman *
4c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * Licensed under the Apache License, Version 2.0 (the "License");
5c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * you may not use this file except in compliance with the License.
6c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * You may obtain a copy of the License at
7c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman *
8c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman *      http://www.apache.org/licenses/LICENSE-2.0
9c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman *
10c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * Unless required by applicable law or agreed to in writing, software
11c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * distributed under the License is distributed on an "AS IS" BASIS,
12c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * See the License for the specific language governing permissions and
14c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman * limitations under the License
15c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman */
16c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
17c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanpackage android.net;
18c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
19c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport static org.junit.Assert.*;
20c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
21c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport android.os.Bundle;
22c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport android.os.Parcel;
23c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport android.support.test.runner.AndroidJUnit4;
24c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
25c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport org.junit.Test;
26c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport org.junit.runner.RunWith;
27c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
28c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanimport java.util.Arrays;
29c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
30c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman/** Unit tests for {@link ScoredNetwork}. */
31c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman@RunWith(AndroidJUnit4.class)
32c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghumanpublic class ScoredNetworkTest {
33c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
34c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final int RSSI_START = -110;
35c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final int TEST_RSSI = -50;
36c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final byte TEST_SCORE = 5;
37c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final RssiCurve CURVE =
38c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            new RssiCurve(RSSI_START, 10, new byte[] {-1, 0, 1, 2, 3, 4, TEST_SCORE, 6, 7});
39c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
40c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final byte RANKING_SCORE_OFFSET = 13;
41c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final Bundle ATTRIBUTES;
42c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    static {
43c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ATTRIBUTES = new Bundle();
44c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ATTRIBUTES.putInt(
45c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, RANKING_SCORE_OFFSET);
46c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
47c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
48c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    private static final NetworkKey KEY
49c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        = new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00"));
50c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
51c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
524efd1ca53643c9608700d32da05504a315821d7dStephen Chen    public void scoredNetworksWithBothNullAttributeBundle_equal() {
534efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork1 =
544efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
554efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork2 =
564efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
574efd1ca53643c9608700d32da05504a315821d7dStephen Chen        assertTrue(scoredNetwork1.equals(scoredNetwork2));
584efd1ca53643c9608700d32da05504a315821d7dStephen Chen    }
594efd1ca53643c9608700d32da05504a315821d7dStephen Chen
604efd1ca53643c9608700d32da05504a315821d7dStephen Chen    @Test
614efd1ca53643c9608700d32da05504a315821d7dStephen Chen    public void scoredNetworksWithOneNullAttributeBundle_notEqual() {
624efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork1 =
634efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
644efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork2 =
654efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
664efd1ca53643c9608700d32da05504a315821d7dStephen Chen        assertFalse(scoredNetwork1.equals(scoredNetwork2));
674efd1ca53643c9608700d32da05504a315821d7dStephen Chen    }
684efd1ca53643c9608700d32da05504a315821d7dStephen Chen
694efd1ca53643c9608700d32da05504a315821d7dStephen Chen    @Test
704efd1ca53643c9608700d32da05504a315821d7dStephen Chen    public void scoredNetworksWithDifferentSizedAttributeBundle_notEqual() {
714efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork1 =
724efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
734efd1ca53643c9608700d32da05504a315821d7dStephen Chen        Bundle attr = new Bundle(ATTRIBUTES);
744efd1ca53643c9608700d32da05504a315821d7dStephen Chen        attr.putBoolean(ScoredNetwork.ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL, true);
754efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork2 =
764efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
774efd1ca53643c9608700d32da05504a315821d7dStephen Chen        assertFalse(scoredNetwork1.equals(scoredNetwork2));
784efd1ca53643c9608700d32da05504a315821d7dStephen Chen    }
794efd1ca53643c9608700d32da05504a315821d7dStephen Chen
804efd1ca53643c9608700d32da05504a315821d7dStephen Chen    @Test
814efd1ca53643c9608700d32da05504a315821d7dStephen Chen    public void scoredNetworksWithDifferentAttributeValues_notEqual() {
824efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork1 =
834efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
844efd1ca53643c9608700d32da05504a315821d7dStephen Chen        Bundle attr = new Bundle();
854efd1ca53643c9608700d32da05504a315821d7dStephen Chen        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
864efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork2 =
874efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
884efd1ca53643c9608700d32da05504a315821d7dStephen Chen        assertFalse(scoredNetwork1.equals(scoredNetwork2));
894efd1ca53643c9608700d32da05504a315821d7dStephen Chen    }
904efd1ca53643c9608700d32da05504a315821d7dStephen Chen
914efd1ca53643c9608700d32da05504a315821d7dStephen Chen    @Test
924efd1ca53643c9608700d32da05504a315821d7dStephen Chen    public void scoredNetworksWithSameAttributeValuesAndSize_equal() {
934efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork1 =
944efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
954efd1ca53643c9608700d32da05504a315821d7dStephen Chen        ScoredNetwork scoredNetwork2 =
964efd1ca53643c9608700d32da05504a315821d7dStephen Chen                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
974efd1ca53643c9608700d32da05504a315821d7dStephen Chen        assertTrue(scoredNetwork1.equals(scoredNetwork2));
984efd1ca53643c9608700d32da05504a315821d7dStephen Chen    }
994efd1ca53643c9608700d32da05504a315821d7dStephen Chen
1004efd1ca53643c9608700d32da05504a315821d7dStephen Chen    @Test
101c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void calculateRankingOffsetShouldThrowUnsupportedOperationException() {
102c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        // No curve or ranking score offset set in curve
103c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, null);
104c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        try {
105c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            scoredNetwork.calculateRankingScore(TEST_RSSI);
106c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            fail("Should have thrown UnsupportedOperationException");
107c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        } catch (UnsupportedOperationException e) {
108c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            // expected
109c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        }
110c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
111c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
112c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
113c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void calculateRankingOffsetWithRssiCurveShouldReturnExpectedScore() {
114c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, CURVE);
115c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(TEST_SCORE << Byte.SIZE, scoredNetwork.calculateRankingScore(TEST_RSSI));
116c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
117c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
118c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
119c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void rankingScoresShouldDifferByRankingScoreOffset() {
120c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork1 = new ScoredNetwork(KEY, CURVE);
121c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork2
122c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
123c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        int scoreDifference =
124c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            scoredNetwork2.calculateRankingScore(TEST_RSSI)
125c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            - scoredNetwork1.calculateRankingScore(TEST_RSSI);
126c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(RANKING_SCORE_OFFSET, scoreDifference);
127c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
128c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
129c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
130c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void calculateRankingScoreShouldNotResultInIntegerOverflow() {
131c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        Bundle attr = new Bundle();
132c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MAX_VALUE);
133c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork
134c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
135c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(Integer.MAX_VALUE, scoredNetwork.calculateRankingScore(TEST_RSSI));
136c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
137c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
138c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
139c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void calculateRankingScoreShouldNotResultInIntegerUnderflow() {
140c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        Bundle attr = new Bundle();
141c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
142c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork scoredNetwork =
143c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
144c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(Integer.MIN_VALUE, scoredNetwork.calculateRankingScore(RSSI_START));
145c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
146c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
147c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
148c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void hasRankingScoreShouldReturnFalse() {
149c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork network = new ScoredNetwork(KEY, null /* rssiCurve */);
150c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertFalse(network.hasRankingScore());
151c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
152c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
153c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
154c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void hasRankingScoreShouldReturnTrueWhenAttributesHasRankingScoreOffset() {
155c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork network =
156c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                new ScoredNetwork(KEY, null /* rssiCurve */, false /* meteredHint */, ATTRIBUTES);
157c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(network.hasRankingScore());
158c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
159c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
160c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
161c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void hasRankingScoreShouldReturnTrueWhenCurveIsPresent() {
162c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork network =
163c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                new ScoredNetwork(KEY, CURVE , false /* meteredHint */);
164c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(network.hasRankingScore());
165c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
166c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
167c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
168c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void shouldWriteAndReadFromParcelWhenAllFieldsSet() {
169c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */, ATTRIBUTES);
170c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork newNetwork;
171c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
172c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        Parcel parcel = null;
173c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        try {
174c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            parcel = Parcel.obtain();
175c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            network.writeToParcel(parcel, 0 /* flags */);
176c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            parcel.setDataPosition(0);
177c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
178c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        } finally {
179c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            if (parcel != null) {
180c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                parcel.recycle();
181c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            }
182c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        }
183c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(CURVE.start, newNetwork.rssiCurve.start);
184c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
185c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
186c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(newNetwork.meteredHint);
187c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertNotNull(newNetwork.attributes);
188c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(
189c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                RANKING_SCORE_OFFSET,
190c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                newNetwork.attributes.getInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET));
191c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
192c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
193c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    @Test
194c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    public void shouldWriteAndReadFromParcelWithoutBundle() {
195c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */);
196c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        ScoredNetwork newNetwork;
197c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman
198c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        Parcel parcel = null;
199c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        try {
200c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            parcel = Parcel.obtain();
201c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            network.writeToParcel(parcel, 0 /* flags */);
202c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            parcel.setDataPosition(0);
203c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
204c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        } finally {
205c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            if (parcel != null) {
206c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman                parcel.recycle();
207c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman            }
208c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        }
209c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(CURVE.start, newNetwork.rssiCurve.start);
210c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
211c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
212c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertTrue(newNetwork.meteredHint);
213c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman        assertNull(newNetwork.attributes);
214c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman    }
2156c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2166c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2176c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturnNoBadgeWhenNoAttributesBundle() {
2186c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network = new ScoredNetwork(KEY, CURVE);
219699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
2206c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2216c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2226c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2236c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturnNoBadgeWhenNoBadgingCurveInBundle() {
2246c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
225699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
2266c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2276c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2286c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2296c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturn4kBadge() {
2306c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network =
231699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_4K);
232699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_4K, network.calculateBadge(TEST_RSSI));
2336c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2346c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2356c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2366c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturnHdBadge() {
2376c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network =
238699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_HD);
239699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_HD, network.calculateBadge(TEST_RSSI));
2406c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2416c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2426c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2436c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturnSdBadge() {
2446c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network =
245699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_SD);
246699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_SD, network.calculateBadge(TEST_RSSI));
2476c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2486c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2496c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    @Test
2506c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    public void calculateBadgeShouldReturnNoBadge() {
2516c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        ScoredNetwork network =
252699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_NONE);
253699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
2546c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
2556c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman
2566c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    private ScoredNetwork buildScoredNetworkWithGivenBadgeForTestRssi(int badge) {
2576c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        RssiCurve badgingCurve =
2586c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman               new RssiCurve(RSSI_START, 10, new byte[] {0, 0, 0, 0, 0, 0, (byte) badge});
2596c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        Bundle attr = new Bundle();
2606c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        attr.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, badgingCurve);
2616c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman        return new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
2626c929621536664d6c014b177e7e6983f1fbd67acSundeep Ghuman    }
263c63d5b0c74ad7330d9893640cdfce0e03f91c0f1Sundeep Ghuman}
264