blob: 109f32e1a48e337477d7854f94e14b1f08648b92 [file] [log] [blame]
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -08001/*
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
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -080021import android.os.Bundle;
22import android.os.Parcel;
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -080023import android.support.test.runner.AndroidJUnit4;
24
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -080025import 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
Stephen Chen4efd1ca2017-08-18 15:49:58 -070052 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
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -0800101 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 }
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800215
216 @Test
217 public void calculateBadgeShouldReturnNoBadgeWhenNoAttributesBundle() {
218 ScoredNetwork network = new ScoredNetwork(KEY, CURVE);
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800219 assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800220 }
221
222 @Test
223 public void calculateBadgeShouldReturnNoBadgeWhenNoBadgingCurveInBundle() {
224 ScoredNetwork network = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800225 assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800226 }
227
228 @Test
229 public void calculateBadgeShouldReturn4kBadge() {
230 ScoredNetwork network =
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800231 buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_4K);
232 assertEquals(NetworkBadging.BADGING_4K, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800233 }
234
235 @Test
236 public void calculateBadgeShouldReturnHdBadge() {
237 ScoredNetwork network =
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800238 buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_HD);
239 assertEquals(NetworkBadging.BADGING_HD, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800240 }
241
242 @Test
243 public void calculateBadgeShouldReturnSdBadge() {
244 ScoredNetwork network =
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800245 buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_SD);
246 assertEquals(NetworkBadging.BADGING_SD, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800247 }
248
249 @Test
250 public void calculateBadgeShouldReturnNoBadge() {
251 ScoredNetwork network =
Sundeep Ghuman699deaf2017-02-13 15:32:13 -0800252 buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_NONE);
253 assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
Sundeep Ghuman6c929622016-12-16 13:30:45 -0800254 }
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 }
Sundeep Ghumanc63d5b02016-12-07 13:32:33 -0800263}