blob: e818c564a639dee930a6113ed8fb0f2d538ab72a [file] [log] [blame]
Sundeep Ghuman0d79bde2016-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
21import android.os.Build;
22import android.os.Bundle;
23import android.os.Parcel;
24import android.support.test.filters.SmallTest;
25import android.support.test.runner.AndroidJUnit4;
26
27import org.junit.Before;
28import org.junit.Test;
29import org.junit.runner.RunWith;
30
31import java.util.Arrays;
32
33/** Unit tests for {@link ScoredNetwork}. */
34@RunWith(AndroidJUnit4.class)
35public class ScoredNetworkTest {
36
37 private static final int RSSI_START = -110;
38 private static final int TEST_RSSI = -50;
39 private static final byte TEST_SCORE = 5;
40 private static final RssiCurve CURVE =
41 new RssiCurve(RSSI_START, 10, new byte[] {-1, 0, 1, 2, 3, 4, TEST_SCORE, 6, 7});
42
43 private static final byte RANKING_SCORE_OFFSET = 13;
44 private static final Bundle ATTRIBUTES;
45 static {
46 ATTRIBUTES = new Bundle();
47 ATTRIBUTES.putInt(
48 ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, RANKING_SCORE_OFFSET);
49 }
50
51 private static final NetworkKey KEY
52 = new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00"));
53
54 @Test
55 public void calculateRankingOffsetShouldThrowUnsupportedOperationException() {
56 // No curve or ranking score offset set in curve
57 ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, null);
58 try {
59 scoredNetwork.calculateRankingScore(TEST_RSSI);
60 fail("Should have thrown UnsupportedOperationException");
61 } catch (UnsupportedOperationException e) {
62 // expected
63 }
64 }
65
66 @Test
67 public void calculateRankingOffsetWithRssiCurveShouldReturnExpectedScore() {
68 ScoredNetwork scoredNetwork = new ScoredNetwork(KEY, CURVE);
69 assertEquals(TEST_SCORE << Byte.SIZE, scoredNetwork.calculateRankingScore(TEST_RSSI));
70 }
71
72 @Test
73 public void rankingScoresShouldDifferByRankingScoreOffset() {
74 ScoredNetwork scoredNetwork1 = new ScoredNetwork(KEY, CURVE);
75 ScoredNetwork scoredNetwork2
76 = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
77 int scoreDifference =
78 scoredNetwork2.calculateRankingScore(TEST_RSSI)
79 - scoredNetwork1.calculateRankingScore(TEST_RSSI);
80 assertEquals(RANKING_SCORE_OFFSET, scoreDifference);
81 }
82
83 @Test
84 public void calculateRankingScoreShouldNotResultInIntegerOverflow() {
85 Bundle attr = new Bundle();
86 attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MAX_VALUE);
87 ScoredNetwork scoredNetwork
88 = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
89 assertEquals(Integer.MAX_VALUE, scoredNetwork.calculateRankingScore(TEST_RSSI));
90 }
91
92 @Test
93 public void calculateRankingScoreShouldNotResultInIntegerUnderflow() {
94 Bundle attr = new Bundle();
95 attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
96 ScoredNetwork scoredNetwork =
97 new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
98 assertEquals(Integer.MIN_VALUE, scoredNetwork.calculateRankingScore(RSSI_START));
99 }
100
101 @Test
102 public void hasRankingScoreShouldReturnFalse() {
103 ScoredNetwork network = new ScoredNetwork(KEY, null /* rssiCurve */);
104 assertFalse(network.hasRankingScore());
105 }
106
107 @Test
108 public void hasRankingScoreShouldReturnTrueWhenAttributesHasRankingScoreOffset() {
109 ScoredNetwork network =
110 new ScoredNetwork(KEY, null /* rssiCurve */, false /* meteredHint */, ATTRIBUTES);
111 assertTrue(network.hasRankingScore());
112 }
113
114 @Test
115 public void hasRankingScoreShouldReturnTrueWhenCurveIsPresent() {
116 ScoredNetwork network =
117 new ScoredNetwork(KEY, CURVE , false /* meteredHint */);
118 assertTrue(network.hasRankingScore());
119 }
120
121 @Test
122 public void shouldWriteAndReadFromParcelWhenAllFieldsSet() {
123 ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */, ATTRIBUTES);
124 ScoredNetwork newNetwork;
125
126 Parcel parcel = null;
127 try {
128 parcel = Parcel.obtain();
129 network.writeToParcel(parcel, 0 /* flags */);
130 parcel.setDataPosition(0);
131 newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
132 } finally {
133 if (parcel != null) {
134 parcel.recycle();
135 }
136 }
137 assertEquals(CURVE.start, newNetwork.rssiCurve.start);
138 assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
139 assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
140 assertTrue(newNetwork.meteredHint);
141 assertNotNull(newNetwork.attributes);
142 assertEquals(
143 RANKING_SCORE_OFFSET,
144 newNetwork.attributes.getInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET));
145 }
146
147 @Test
148 public void shouldWriteAndReadFromParcelWithoutBundle() {
149 ScoredNetwork network = new ScoredNetwork(KEY, CURVE, true /* meteredHint */);
150 ScoredNetwork newNetwork;
151
152 Parcel parcel = null;
153 try {
154 parcel = Parcel.obtain();
155 network.writeToParcel(parcel, 0 /* flags */);
156 parcel.setDataPosition(0);
157 newNetwork = ScoredNetwork.CREATOR.createFromParcel(parcel);
158 } finally {
159 if (parcel != null) {
160 parcel.recycle();
161 }
162 }
163 assertEquals(CURVE.start, newNetwork.rssiCurve.start);
164 assertEquals(CURVE.bucketWidth, newNetwork.rssiCurve.bucketWidth);
165 assertTrue(Arrays.equals(CURVE.rssiBuckets, newNetwork.rssiCurve.rssiBuckets));
166 assertTrue(newNetwork.meteredHint);
167 assertNull(newNetwork.attributes);
168 }
Sundeep Ghuman8bc096c2016-12-16 13:30:45 -0800169
170 @Test
171 public void calculateBadgeShouldReturnNoBadgeWhenNoAttributesBundle() {
172 ScoredNetwork network = new ScoredNetwork(KEY, CURVE);
173 assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
174 }
175
176 @Test
177 public void calculateBadgeShouldReturnNoBadgeWhenNoBadgingCurveInBundle() {
178 ScoredNetwork network = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
179 assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
180 }
181
182 @Test
183 public void calculateBadgeShouldReturn4kBadge() {
184 ScoredNetwork network =
185 buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_4K);
186 assertEquals(ScoredNetwork.BADGING_4K, network.calculateBadge(TEST_RSSI));
187 }
188
189 @Test
190 public void calculateBadgeShouldReturnHdBadge() {
191 ScoredNetwork network =
192 buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_HD);
193 assertEquals(ScoredNetwork.BADGING_HD, network.calculateBadge(TEST_RSSI));
194 }
195
196 @Test
197 public void calculateBadgeShouldReturnSdBadge() {
198 ScoredNetwork network =
199 buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_SD);
200 assertEquals(ScoredNetwork.BADGING_SD, network.calculateBadge(TEST_RSSI));
201 }
202
203 @Test
204 public void calculateBadgeShouldReturnNoBadge() {
205 ScoredNetwork network =
206 buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_NONE);
207 assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
208 }
209
210 private ScoredNetwork buildScoredNetworkWithGivenBadgeForTestRssi(int badge) {
211 RssiCurve badgingCurve =
212 new RssiCurve(RSSI_START, 10, new byte[] {0, 0, 0, 0, 0, 0, (byte) badge});
213 Bundle attr = new Bundle();
214 attr.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, badgingCurve);
215 return new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
216 }
Sundeep Ghuman0d79bde2016-12-07 13:32:33 -0800217}