| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.wifi; |
| |
| import static org.junit.Assert.assertTrue; |
| import static org.mockito.Mockito.doReturn; |
| import static org.mockito.Mockito.when; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.net.wifi.WifiInfo; |
| |
| import com.android.internal.R; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.Mock; |
| import org.mockito.MockitoAnnotations; |
| import org.mockito.Spy; |
| |
| /** |
| * Unit tests for {@link com.android.server.wifi.VelocityBasedConnectedScore}. |
| */ |
| public class VelocityBasedConnectedScoreTest { |
| |
| |
| class FakeClock extends Clock { |
| long mWallClockMillis = 1500000000000L; |
| int mStepMillis = 3001; |
| |
| @Override |
| public long getWallClockMillis() { |
| mWallClockMillis += mStepMillis; |
| return mWallClockMillis; |
| } |
| } |
| |
| FakeClock mClock; |
| VelocityBasedConnectedScore mVelocityBasedConnectedScore; |
| ScanDetailCache mScanDetailCache; |
| WifiInfo mWifiInfo; |
| int mRssiExitThreshold2GHz; |
| int mRssiExitThreshold5GHz; |
| @Mock Context mContext; |
| @Spy private MockResources mResources = new MockResources(); |
| |
| private int setupIntegerResource(int resourceName, int value) { |
| doReturn(value).when(mResources).getInteger(resourceName); |
| return value; |
| } |
| |
| /** |
| * Sets up resource values for testing |
| * |
| * See frameworks/base/core/res/res/values/config.xml |
| */ |
| private void setUpResources(Resources resources) { |
| mRssiExitThreshold2GHz = setupIntegerResource( |
| R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz, -83); |
| mRssiExitThreshold5GHz = setupIntegerResource( |
| R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz, -80); |
| } |
| |
| /** |
| * Sets up for unit test |
| */ |
| @Before |
| public void setUp() throws Exception { |
| MockitoAnnotations.initMocks(this); |
| setUpResources(mResources); |
| mWifiInfo = new WifiInfo(); |
| mWifiInfo.setFrequency(2412); |
| when(mContext.getResources()).thenReturn(mResources); |
| mClock = new FakeClock(); |
| mVelocityBasedConnectedScore = new VelocityBasedConnectedScore( |
| new ScoringParams(mContext), mClock); |
| } |
| |
| /** |
| * |
| * Low RSSI, but some data is moving and error rate is low. |
| * |
| * Expect a score above threshold. |
| */ |
| @Test |
| public void allowLowRssiIfErrorRateIsLowAndSomeDataIsMoving() throws Exception { |
| mWifiInfo.setRssi(mRssiExitThreshold2GHz - 2); |
| mWifiInfo.setLinkSpeed(6); // Mbps |
| mWifiInfo.txSuccessRate = 2.1; // proportional to pps |
| mWifiInfo.txBadRate = .5; |
| mWifiInfo.rxSuccessRate = 2.1; |
| for (int i = 0; i < 10; i++) { |
| mVelocityBasedConnectedScore.updateUsingWifiInfo(mWifiInfo, |
| mClock.getWallClockMillis()); |
| } |
| int score = mVelocityBasedConnectedScore.generateScore(); |
| assertTrue(score > ConnectedScore.WIFI_TRANSITION_SCORE); |
| } |
| |
| /** |
| * |
| * Low RSSI, and almost no data is moving. |
| * |
| * Expect a score below threshold. |
| */ |
| @Test |
| public void disallowLowRssiIfDataIsNotMoving() throws Exception { |
| mWifiInfo.setRssi(mRssiExitThreshold2GHz - 1); |
| mWifiInfo.setLinkSpeed(6); // Mbps |
| mWifiInfo.txSuccessRate = .1; // proportional to pps |
| mWifiInfo.txBadRate = 0; |
| mWifiInfo.rxSuccessRate = .1; |
| for (int i = 0; i < 10; i++) { |
| mVelocityBasedConnectedScore.updateUsingWifiInfo(mWifiInfo, |
| mClock.getWallClockMillis()); |
| } |
| int score = mVelocityBasedConnectedScore.generateScore(); |
| assertTrue(score < ConnectedScore.WIFI_TRANSITION_SCORE); |
| } |
| } |