blob: 2f6bae47e9fd2bf8eaf3d4aff711c03fd2058977 [file] [log] [blame]
/*
* 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 androidx.test.filters.SmallTest;
import com.android.wifi.resources.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}.
*/
@SmallTest
public class VelocityBasedConnectedScoreTest extends WifiBaseTest {
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);
}
/**
* Generate a score with no updates
*
* Expect no crash, passing score
*/
@Test
public void noCrashWhenNoData() throws Exception {
int score = mVelocityBasedConnectedScore.generateScore();
assertTrue(score > ConnectedScore.WIFI_TRANSITION_SCORE);
}
/**
*
* 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.setSuccessfulTxPacketsPerSecond(2.1); // proportional to pps
mWifiInfo.setLostTxPacketsPerSecond(.5);
mWifiInfo.setSuccessfulRxPacketsPerSecond(2.1);
for (int i = 0; i < 10; i++) {
mVelocityBasedConnectedScore.updateUsingWifiInfo(mWifiInfo,
mClock.getWallClockMillis());
}
int score = mVelocityBasedConnectedScore.generateScore();
assertTrue(score > ConnectedScore.WIFI_TRANSITION_SCORE);
// If we reset, should be below threshold after the first input
mVelocityBasedConnectedScore.reset();
mVelocityBasedConnectedScore.updateUsingWifiInfo(mWifiInfo, mClock.getWallClockMillis());
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.setSuccessfulTxPacketsPerSecond(.1); // proportional to pps
mWifiInfo.setLostTxPacketsPerSecond(0);
mWifiInfo.setSuccessfulRxPacketsPerSecond(.1);
for (int i = 0; i < 10; i++) {
mVelocityBasedConnectedScore.updateUsingWifiInfo(mWifiInfo,
mClock.getWallClockMillis());
}
int score = mVelocityBasedConnectedScore.generateScore();
assertTrue(score < ConnectedScore.WIFI_TRANSITION_SCORE);
}
}