ScoredNetworkTest.java revision c63d5b0c74ad7330d9893640cdfce0e03f91c0f1
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.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    }
169}
170