ScoredNetworkTest.java revision 4efd1ca53643c9608700d32da05504a315821d7d
1/*
2 t Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package android.net;
18
19import static org.junit.Assert.*;
20
21import android.os.Bundle;
22import android.os.Parcel;
23import android.support.test.runner.AndroidJUnit4;
24
25import org.junit.Test;
26import org.junit.runner.RunWith;
27
28import java.util.Arrays;
29
30/** Unit tests for {@link ScoredNetwork}. */
31@RunWith(AndroidJUnit4.class)
32public class ScoredNetworkTest {
33
34    private static final int RSSI_START = -110;
35    private static final int TEST_RSSI = -50;
36    private static final byte TEST_SCORE = 5;
37    private static final RssiCurve CURVE =
38            new RssiCurve(RSSI_START, 10, new byte[] {-1, 0, 1, 2, 3, 4, TEST_SCORE, 6, 7});
39
40    private static final byte RANKING_SCORE_OFFSET = 13;
41    private static final Bundle ATTRIBUTES;
42    static {
43        ATTRIBUTES = new Bundle();
44        ATTRIBUTES.putInt(
45                ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, RANKING_SCORE_OFFSET);
46    }
47
48    private static final NetworkKey KEY
49        = new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00"));
50
51    @Test
52    public void scoredNetworksWithBothNullAttributeBundle_equal() {
53        ScoredNetwork scoredNetwork1 =
54                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
55        ScoredNetwork scoredNetwork2 =
56                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
57        assertTrue(scoredNetwork1.equals(scoredNetwork2));
58    }
59
60    @Test
61    public void scoredNetworksWithOneNullAttributeBundle_notEqual() {
62        ScoredNetwork scoredNetwork1 =
63                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
64        ScoredNetwork scoredNetwork2 =
65                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
66        assertFalse(scoredNetwork1.equals(scoredNetwork2));
67    }
68
69    @Test
70    public void scoredNetworksWithDifferentSizedAttributeBundle_notEqual() {
71        ScoredNetwork scoredNetwork1 =
72                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
73        Bundle attr = new Bundle(ATTRIBUTES);
74        attr.putBoolean(ScoredNetwork.ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL, true);
75        ScoredNetwork scoredNetwork2 =
76                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
77        assertFalse(scoredNetwork1.equals(scoredNetwork2));
78    }
79
80    @Test
81    public void scoredNetworksWithDifferentAttributeValues_notEqual() {
82        ScoredNetwork scoredNetwork1 =
83                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
84        Bundle attr = new Bundle();
85        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
86        ScoredNetwork scoredNetwork2 =
87                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
88        assertFalse(scoredNetwork1.equals(scoredNetwork2));
89    }
90
91    @Test
92    public void scoredNetworksWithSameAttributeValuesAndSize_equal() {
93        ScoredNetwork scoredNetwork1 =
94                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
95        ScoredNetwork scoredNetwork2 =
96                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
97        assertTrue(scoredNetwork1.equals(scoredNetwork2));
98    }
99
100    @Test
101    public void calculateRankingOffsetShouldThrowUnsupportedOperationException() {
102        // No curve or ranking score offset set in curve
103        ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, null);
104        try {
105            scoredNetwork.calculateRankingScore(TEST_RSSI);
106            fail("Should have thrown UnsupportedOperationException");
107        } catch (UnsupportedOperationException e) {
108            // expected
109        }
110    }
111
112    @Test
113    public void calculateRankingOffsetWithRssiCurveShouldReturnExpectedScore() {
114        ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, CURVE);
115        assertEquals(TEST_SCORE << Byte.SIZE, scoredNetwork.calculateRankingScore(TEST_RSSI));
116    }
117
118    @Test
119    public void rankingScoresShouldDifferByRankingScoreOffset() {
120        ScoredNetwork scoredNetwork1 = new ScoredNetwork(KEY, CURVE);
121        ScoredNetwork scoredNetwork2
122            = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
123        int scoreDifference =
124            scoredNetwork2.calculateRankingScore(TEST_RSSI)
125            - scoredNetwork1.calculateRankingScore(TEST_RSSI);
126        assertEquals(RANKING_SCORE_OFFSET, scoreDifference);
127    }
128
129    @Test
130    public void calculateRankingScoreShouldNotResultInIntegerOverflow() {
131        Bundle attr = new Bundle();
132        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MAX_VALUE);
133        ScoredNetwork scoredNetwork
134            = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
135        assertEquals(Integer.MAX_VALUE, scoredNetwork.calculateRankingScore(TEST_RSSI));
136    }
137
138    @Test
139    public void calculateRankingScoreShouldNotResultInIntegerUnderflow() {
140        Bundle attr = new Bundle();
141        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
142        ScoredNetwork scoredNetwork =
143                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
144        assertEquals(Integer.MIN_VALUE, scoredNetwork.calculateRankingScore(RSSI_START));
145    }
146
147    @Test
148    public void hasRankingScoreShouldReturnFalse() {
149        ScoredNetwork network = new ScoredNetwork(KEY, null /* rssiCurve */);
150        assertFalse(network.hasRankingScore());
151    }
152
153    @Test
154    public void hasRankingScoreShouldReturnTrueWhenAttributesHasRankingScoreOffset() {
155        ScoredNetwork network =
156                new ScoredNetwork(KEY, null /* rssiCurve */, false /* meteredHint */, ATTRIBUTES);
157        assertTrue(network.hasRankingScore());
158    }
159
160    @Test
161    public void hasRankingScoreShouldReturnTrueWhenCurveIsPresent() {
162        ScoredNetwork network =
163                new ScoredNetwork(KEY, CURVE , false /* meteredHint */);
164        assertTrue(network.hasRankingScore());
165    }
166
167    @Test
168    public void shouldWriteAndReadFromParcelWhenAllFieldsSet() {
169        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */, ATTRIBUTES);
170        ScoredNetwork newNetwork;
171
172        Parcel parcel = null;
173        try {
174            parcel = Parcel.obtain();
175            network.writeToParcel(parcel, 0 /* flags */);
176            parcel.setDataPosition(0);
177            newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
178        } finally {
179            if (parcel != null) {
180                parcel.recycle();
181            }
182        }
183        assertEquals(CURVE.start, newNetwork.rssiCurve.start);
184        assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
185        assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
186        assertTrue(newNetwork.meteredHint);
187        assertNotNull(newNetwork.attributes);
188        assertEquals(
189                RANKING_SCORE_OFFSET,
190                newNetwork.attributes.getInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET));
191    }
192
193    @Test
194    public void shouldWriteAndReadFromParcelWithoutBundle() {
195        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */);
196        ScoredNetwork newNetwork;
197
198        Parcel parcel = null;
199        try {
200            parcel = Parcel.obtain();
201            network.writeToParcel(parcel, 0 /* flags */);
202            parcel.setDataPosition(0);
203            newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
204        } finally {
205            if (parcel != null) {
206                parcel.recycle();
207            }
208        }
209        assertEquals(CURVE.start, newNetwork.rssiCurve.start);
210        assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
211        assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
212        assertTrue(newNetwork.meteredHint);
213        assertNull(newNetwork.attributes);
214    }
215
216    @Test
217    public void calculateBadgeShouldReturnNoBadgeWhenNoAttributesBundle() {
218        ScoredNetwork network = new ScoredNetwork(KEY, CURVE);
219        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
220    }
221
222    @Test
223    public void calculateBadgeShouldReturnNoBadgeWhenNoBadgingCurveInBundle() {
224        ScoredNetwork network = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
225        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
226    }
227
228    @Test
229    public void calculateBadgeShouldReturn4kBadge() {
230        ScoredNetwork network =
231            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_4K);
232        assertEquals(NetworkBadging.BADGING_4K, network.calculateBadge(TEST_RSSI));
233    }
234
235    @Test
236    public void calculateBadgeShouldReturnHdBadge() {
237        ScoredNetwork network =
238            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_HD);
239        assertEquals(NetworkBadging.BADGING_HD, network.calculateBadge(TEST_RSSI));
240    }
241
242    @Test
243    public void calculateBadgeShouldReturnSdBadge() {
244        ScoredNetwork network =
245            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_SD);
246        assertEquals(NetworkBadging.BADGING_SD, network.calculateBadge(TEST_RSSI));
247    }
248
249    @Test
250    public void calculateBadgeShouldReturnNoBadge() {
251        ScoredNetwork network =
252            buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_NONE);
253        assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
254    }
255
256    private ScoredNetwork buildScoredNetworkWithGivenBadgeForTestRssi(int badge) {
257        RssiCurve badgingCurve =
258               new RssiCurve(RSSI_START, 10, new byte[] {0, 0, 0, 0, 0, 0, (byte) badge});
259        Bundle attr = new Bundle();
260        attr.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, badgingCurve);
261        return new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
262    }
263}
264