DO NOT MERGE Blocklist WiFi (current BSSID) if external score input is equal to -2

Bug: 158695052

Test: atest com.android.server.wifi

Signed-off-by: Mingguang Xu <mingguangxu@google.com>
Change-Id: I8c911bd9493c3bd9414e34f27817ec98aa53c1bf
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index 5d7545c..3902933 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -61,6 +61,7 @@
     private static final int INVALID_SESSION_ID = -1;
     private static final long MIN_TIME_TO_WAIT_BEFORE_BLOCKLIST_BSSID_MILLIS = 29000;
     private static final long INVALID_WALL_CLOCK_MILLIS = -1;
+    private static final int WIFI_SCORE_TO_TERMINATE_CONNECTION_BLOCKLIST_BSSID = -2;
 
     /**
      * Copy of the settings string. Can't directly use the constant because it is @hide.
@@ -111,6 +112,21 @@
                              + " score=" + score);
                     return;
                 }
+                // Disconnect WiFi and blocklist current BSSID. This is an intermediate solution
+                // and will be removed when the extension API is extended to include more inputs
+                // tracked by b/171571687.
+                if (score == WIFI_SCORE_TO_TERMINATE_CONNECTION_BLOCKLIST_BSSID) {
+                    mBssidBlocklistMonitor.handleBssidConnectionFailure(mWifiInfo.getBSSID(),
+                            mWifiInfo.getSSID(),
+                            BssidBlocklistMonitor.REASON_FRAMEWORK_DISCONNECT_CONNECTED_SCORE,
+                            mWifiInfo.getRssi());
+                    return;
+                }
+                if (score > ConnectedScore.WIFI_MAX_SCORE
+                        || score < ConnectedScore.WIFI_MIN_SCORE) {
+                    Log.e(TAG, "Invalid score value from external scorer: " + score);
+                    return;
+                }
                 long millis = mClock.getWallClockMillis();
                 if (score < ConnectedScore.WIFI_TRANSITION_SCORE) {
                     if (mScore >= ConnectedScore.WIFI_TRANSITION_SCORE) {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
index bd15f62..e9a6f8b 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
@@ -1078,4 +1078,50 @@
         mLooper.dispatchAll();
         verify(mNetworkAgent).sendNetworkScore(51);
     }
+
+    /**
+     * Verify BSSID is added onto blocklist when the score value of -2 is sent from external Wi-Fi
+     * scorer.
+     */
+    @Test
+    public void verifyBssidBlocklistWithScoreValueOfMinus2() throws Exception {
+        WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
+        // Register Client for verification.
+        mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
+        mClock.mStepMillis = 0;
+        mClock.mWallClockMillis = 10;
+        mWifiInfo.setRssi(-65);
+
+        scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, -2);
+        mLooper.dispatchAll();
+        verify(mBssidBlocklistMonitor).handleBssidConnectionFailure(any(), any(), anyInt(),
+                anyInt());
+    }
+
+    /**
+     * Verify BSSID is not added onto blocklist when positive score values are sent from external
+     * Wi-Fi scorer.
+     */
+    @Test
+    public void verifyNoBssidBlocklistWithPositiveScoreValues() throws Exception {
+        WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
+        // Register Client for verification.
+        mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
+        when(mNetwork.getNetId()).thenReturn(TEST_NETWORK_ID);
+        mWifiScoreReport.startConnectedNetworkScorer(TEST_NETWORK_ID);
+        mClock.mStepMillis = 0;
+        mClock.mWallClockMillis = 10;
+        mWifiInfo.setRssi(-65);
+
+        scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 49);
+        mLooper.dispatchAll();
+        verify(mBssidBlocklistMonitor, never()).handleBssidConnectionFailure(any(), any(), anyInt(),
+                anyInt());
+        scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 51);
+        mLooper.dispatchAll();
+        verify(mBssidBlocklistMonitor, never()).handleBssidConnectionFailure(any(), any(), anyInt(),
+                anyInt());
+    }
 }