[DSRM] Do recovery actions only after validation passed once.

Symptom: If there is no live network in the lab, data stall recovery
will be triggered always when validation failed. It might cause lab
testing failed. To avoid it, skipping the recovery action if there's
no any validation pass before.

Solution: Start to do the recovery actions after validation passed once.

Bug: 232810415
Test: manual test passed(go/dsrm-test-result-lab)
      atest DataStallRecoveryManagerTest
Merged-In: Ia1a8ef3335273852a07cd2e63659979947132dd4
Change-Id: Ia1a8ef3335273852a07cd2e63659979947132dd4
diff --git a/src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java b/src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java
index a23b71e..22d0498 100644
--- a/src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java
+++ b/src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java
@@ -364,11 +364,13 @@
         if (isValid) {
             reset();
         } else {
-            mIsValidNetwork = false;
-            if (isRecoveryNeeded(true)) {
-                log("trigger data stall recovery");
-                mTimeLastRecoveryStartMs = SystemClock.elapsedRealtime();
-                sendMessage(obtainMessage(EVENT_DO_RECOVERY));
+            if (mIsValidNetwork || isRecoveryAlreadyStarted()) {
+                mIsValidNetwork = false;
+                if (isRecoveryNeeded(true)) {
+                    log("trigger data stall recovery");
+                    mTimeLastRecoveryStartMs = SystemClock.elapsedRealtime();
+                    sendMessage(obtainMessage(EVENT_DO_RECOVERY));
+                }
             }
         }
     }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java
index ce5f3bb..de0998d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java
@@ -87,7 +87,6 @@
                         mMockedWwanDataServiceManager,
                         mTestableLooper.getLooper(),
                         mDataStallRecoveryManagerCallback);
-        sendOnInternetDataNetworkCallback(true);
         logd("DataStallRecoveryManagerTest -Setup!");
     }
 
@@ -128,6 +127,7 @@
 
     @Test
     public void testRecoveryStepPDPReset() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(1);
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -141,6 +141,7 @@
 
     @Test
     public void testRecoveryStepRestartRadio() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(3);
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -154,6 +155,7 @@
 
     @Test
     public void testRecoveryStepModemReset() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(4);
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -168,6 +170,7 @@
 
     @Test
     public void testDoNotDoRecoveryActionWhenPoorSignal() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(3);
         doReturn(1).when(mSignalStrength).getLevel();
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
@@ -183,6 +186,7 @@
 
     @Test
     public void testDoNotDoRecoveryActionWhenDialCall() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(3);
         doReturn(3).when(mSignalStrength).getLevel();
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
@@ -198,6 +202,7 @@
 
     @Test
     public void testDoNotDoRecoveryBySendMessageDelayedWhenDialCall() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
         mDataStallRecoveryManager.setRecoveryAction(0);
         doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState();
@@ -217,6 +222,7 @@
 
     @Test
     public void testDoNotContinueRecoveryActionAfterModemReset() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
         mDataStallRecoveryManager.setRecoveryAction(0);
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -252,6 +258,7 @@
 
     @Test
     public void testDoRecoveryWhenMeetDataStallAgain() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID);
         mDataStallRecoveryManager.setRecoveryAction(0);
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -296,6 +303,7 @@
 
     @Test
     public void testDoNotDoRecoveryWhenDataNoService() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(1);
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -310,6 +318,7 @@
 
     @Test
     public void testDoNotDoRecoveryWhenDataNetworkNotConnected() throws Exception {
+        sendOnInternetDataNetworkCallback(true);
         mDataStallRecoveryManager.setRecoveryAction(1);
         doReturn(mSignalStrength).when(mPhone).getSignalStrength();
         doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
@@ -321,4 +330,24 @@
 
         assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1);
     }
+
+    @Test
+    public void testDoNotDoRecoveryIfNoValidationPassedYet() throws Exception {
+        sendOnInternetDataNetworkCallback(false);
+        doReturn(mSignalStrength).when(mPhone).getSignalStrength();
+        doReturn(PhoneConstants.State.IDLE).when(mPhone).getState();
+
+        logd("Sending validation failed callback");
+        sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
+        processAllFutureMessages();
+
+        // Handle multiple VALIDATION_STATUS_NOT_VALID and make sure we don't attempt recovery
+        for (int i = 0; i < 4; i++) {
+            sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
+            logd("Sending validation failed callback");
+            processAllMessages();
+            moveTimeForward(101);
+            assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(0);
+        }
+    }
 }