xds: (minor) address Java Code Clarity recommendations in CSDS (#10804)

Redoes https://github.com/grpc/grpc-java/pull/8028
Ref cl/365582959
diff --git a/xds/src/main/java/io/grpc/xds/CsdsService.java b/xds/src/main/java/io/grpc/xds/CsdsService.java
index 3aab66d..20f78c1 100644
--- a/xds/src/main/java/io/grpc/xds/CsdsService.java
+++ b/xds/src/main/java/io/grpc/xds/CsdsService.java
@@ -80,6 +80,8 @@
     if (handleRequest(request, responseObserver)) {
       responseObserver.onCompleted();
     }
+    // TODO(sergiitk): Add a case covering mutating handleRequest return false to true - to verify
+    //   that responseObserver.onCompleted() isn't erroneously called on error.
   }
 
   @Override
@@ -115,12 +117,11 @@
       Thread.currentThread().interrupt();
       logger.log(Level.FINE, "Server interrupted while building CSDS config dump", e);
       error = Status.ABORTED.withDescription("Thread interrupted").withCause(e).asException();
-    } catch (Exception e) {
+    } catch (RuntimeException e) {
       logger.log(Level.WARNING, "Unexpected error while building CSDS config dump", e);
       error =
           Status.INTERNAL.withDescription("Unexpected internal error").withCause(e).asException();
     }
-
     responseObserver.onError(error);
     return false;
   }
diff --git a/xds/src/test/java/io/grpc/xds/CsdsServiceTest.java b/xds/src/test/java/io/grpc/xds/CsdsServiceTest.java
index 6892324..904bcdc 100644
--- a/xds/src/test/java/io/grpc/xds/CsdsServiceTest.java
+++ b/xds/src/test/java/io/grpc/xds/CsdsServiceTest.java
@@ -37,6 +37,7 @@
 import io.envoyproxy.envoy.service.status.v3.ClientStatusRequest;
 import io.envoyproxy.envoy.service.status.v3.ClientStatusResponse;
 import io.envoyproxy.envoy.type.matcher.v3.NodeMatcher;
+import io.grpc.Deadline;
 import io.grpc.InsecureChannelCredentials;
 import io.grpc.Status;
 import io.grpc.Status.Code;
@@ -54,7 +55,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Rule;
@@ -97,7 +98,11 @@
 
     @Before
     public void setUp() {
-      csdsStub = ClientStatusDiscoveryServiceGrpc.newBlockingStub(grpcServerRule.getChannel());
+      // The deadline is needed to prevent CsdsService#handleRequest mutation tests from hanging,
+      // because true->false return mutation prevents fetchClientStatus from completing the request.
+      csdsStub = ClientStatusDiscoveryServiceGrpc
+          .newBlockingStub(grpcServerRule.getChannel())
+          .withDeadline(Deadline.after(3, TimeUnit.SECONDS));
       csdsAsyncStub = ClientStatusDiscoveryServiceGrpc.newStub(grpcServerRule.getChannel());
     }
 
@@ -152,14 +157,10 @@
         @Override
         ListenableFuture<Map<XdsResourceType<?>, Map<String, ResourceMetadata>>>
             getSubscribedResourcesMetadataSnapshot() {
-          return Futures.submit(
-              new Callable<Map<XdsResourceType<?>, Map<String, ResourceMetadata>>>() {
-                @Override
-                public Map<XdsResourceType<?>, Map<String, ResourceMetadata>> call() {
-                  Thread.currentThread().interrupt();
-                  return null;
-                }
-              }, MoreExecutors.directExecutor());
+          return Futures.submit(() -> {
+            Thread.currentThread().interrupt();
+            return null;
+          }, MoreExecutors.directExecutor());
         }
       };
       grpcServerRule.getServiceRegistry()
@@ -214,7 +215,7 @@
       requestObserver.onCompleted();
 
       List<ClientStatusResponse> responses = responseObserver.getValues();
-      assertThat(responses.size()).isEqualTo(3);
+      assertThat(responses).hasSize(3);
       // Empty response on XdsClient not ready.
       assertThat(responses.get(0)).isEqualTo(ClientStatusResponse.getDefaultInstance());
       // The following calls return ClientConfig's successfully.
@@ -236,7 +237,7 @@
       requestObserver.onCompleted();
 
       List<ClientStatusResponse> responses = responseObserver.getValues();
-      assertThat(responses.size()).isEqualTo(1);
+      assertThat(responses).hasSize(1);
       verifyResponse(responses.get(0));
       assertThat(responseObserver.getError()).isNotNull();
       verifyRequestInvalidResponseStatus(Status.fromThrowable(responseObserver.getError()));
@@ -254,7 +255,7 @@
       requestObserver.onError(new StatusRuntimeException(Status.DATA_LOSS));
 
       List<ClientStatusResponse> responses = responseObserver.getValues();
-      assertThat(responses.size()).isEqualTo(1);
+      assertThat(responses).hasSize(1);
       verifyResponse(responses.get(0));
       // Server quietly closes its side.
       assertThat(responseObserver.getError()).isNull();