Report an InternalFeedError when starvation occurs in TaskQueue.

PiperOrigin-RevId: 242216573
Change-Id: I16a676c6ed08e74f88bd025429f231980326344e
diff --git a/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java b/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
index c6ea25e..bf5370c 100644
--- a/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
+++ b/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
@@ -22,6 +22,7 @@
 import com.google.android.libraries.feed.common.logging.StringFormattingUtils;
 import com.google.android.libraries.feed.common.time.Clock;
 import com.google.android.libraries.feed.host.logging.BasicLoggingApi;
+import com.google.android.libraries.feed.host.logging.InternalFeedError;
 import java.util.ArrayDeque;
 import java.util.Queue;
 import java.util.concurrent.Executor;
@@ -118,7 +119,7 @@
   /** Track if starvation checking is running */
   private final AtomicBoolean starvationChecks = new AtomicBoolean(false);
 
-  private final BasicLoggingApi unusedBasicLoggingApi;
+  private final BasicLoggingApi basicLoggingApi;
   private final Executor executor;
   private final Clock clock;
   private final boolean checkStarvation;
@@ -148,7 +149,7 @@
       MainThreadRunner mainThreadRunner,
       Clock clock,
       boolean checkStarvation) {
-    this.unusedBasicLoggingApi = basicLoggingApi;
+    this.basicLoggingApi = basicLoggingApi;
     this.executor = executor;
     this.mainThreadRunner = mainThreadRunner;
     this.clock = clock;
@@ -271,6 +272,7 @@
           TAG, " * Starvation Check, last task %s", StringFormattingUtils.formatLogDate(lastTask));
       if (clock.currentTimeMillis() >= lastTask + STARVATION_TIMEOUT_MS) {
         Logger.e(TAG, " - Starvation check failed, stopping the delay and running tasks");
+        basicLoggingApi.onInternalError(InternalFeedError.TASK_QUEUE_STARVATION);
         // Reset the delay since things aren't being run
         synchronized (lock) {
           if (waitingForHeadReset) {
diff --git a/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java b/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
index 6a787ea..e9ad693 100644
--- a/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
+++ b/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
@@ -36,6 +36,7 @@
   InternalFeedError.NULL_SHARED_STATES,
   InternalFeedError.FAILED_TO_CREATE_LEAF,
   InternalFeedError.UNHANDLED_TOKEN,
+  InternalFeedError.TASK_QUEUE_STARVATION,
   InternalFeedError.NEXT_VALUE
 })
 public @interface InternalFeedError {
@@ -76,6 +77,12 @@
   /** Represents a token that could not be handled. */
   int UNHANDLED_TOKEN = 11;
 
+  /**
+   * Represents that the task queue timed out waiting for a network request and began executing
+   * queued tasks.
+   */
+  int TASK_QUEUE_STARVATION = 12;
+
   /** The next value that should be used when adding additional values to the IntDef. */
-  int NEXT_VALUE = 12;
+  int NEXT_VALUE = 13;
 }
diff --git a/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java b/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
index 1155cfe..331fccd 100644
--- a/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
+++ b/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
@@ -29,6 +29,7 @@
 /** Fake implementation of {@link BasicLoggingApi}. */
 public class FakeBasicLoggingApi implements BasicLoggingApi {
 
+  @InternalFeedError public int lastInternalError = InternalFeedError.NEXT_VALUE;
   @RequestReason public int serverRequestReason = RequestReason.UNKNOWN;
 
   public FakeBasicLoggingApi() {}
@@ -103,7 +104,9 @@
   public void onVisualElementViewed(ElementLoggingData data, int elementType) {}
 
   @Override
-  public void onInternalError(@InternalFeedError int internalError) {}
+  public void onInternalError(@InternalFeedError int internalError) {
+    lastInternalError = internalError;
+  }
 
   @Override
   public void onZeroStateRefreshCompleted(int newContentCount, int newTokenCount) {}
diff --git a/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD b/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
index 0efd138..abe0b26 100644
--- a/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
+++ b/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
@@ -44,6 +44,7 @@
         "//src/main/java/com/google/android/libraries/feed/common/concurrent",
         "//src/main/java/com/google/android/libraries/feed/common/concurrent/testing",
         "//src/main/java/com/google/android/libraries/feed/common/time/testing",
+        "//src/main/java/com/google/android/libraries/feed/host/logging",
         "//src/main/java/com/google/android/libraries/feed/testing/host/logging",
         "@com_google_protobuf_javalite//:protobuf_java_lite",
         "@maven//:com_google_guava_guava",
diff --git a/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java b/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
index 1cbec74..a6389ee 100644
--- a/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
+++ b/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
@@ -20,6 +20,7 @@
 import com.google.android.libraries.feed.common.concurrent.TaskQueue.TaskType;
 import com.google.android.libraries.feed.common.concurrent.testing.ClockBackedFakeMainThreadRunner;
 import com.google.android.libraries.feed.common.time.testing.FakeClock;
+import com.google.android.libraries.feed.host.logging.InternalFeedError;
 import com.google.android.libraries.feed.testing.host.logging.FakeBasicLoggingApi;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
@@ -202,6 +203,8 @@
     runAndAssertStarvationChecks();
     assertThat(delayedTaskHasRun).isTrue();
     assertThat(taskQueue.isDelayed()).isFalse();
+    assertThat(fakeBasicLoggingApi.lastInternalError)
+        .isEqualTo(InternalFeedError.TASK_QUEUE_STARVATION);
   }
 
   @Test