interop-testing: client compressed tests without probing (#4279)

diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
index e54b3cc..6fa7812 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
@@ -390,7 +390,7 @@
    * Tests client per-message compression for unary calls. The Java API does not support inspecting
    * a message's compression level, so this is primarily intended to run against a gRPC C++ server.
    */
-  public void clientCompressedUnary() throws Exception {
+  public void clientCompressedUnary(boolean probe) throws Exception {
     assumeEnoughMemory();
     final SimpleRequest expectCompressedRequest =
         SimpleRequest.newBuilder()
@@ -409,15 +409,17 @@
             .setPayload(Payload.newBuilder().setBody(ByteString.copyFrom(new byte[314159])))
             .build();
 
-    // Send a non-compressed message with expectCompress=true. Servers supporting this test case
-    // should return INVALID_ARGUMENT.
-    try {
-      blockingStub.unaryCall(expectCompressedRequest);
-      fail("expected INVALID_ARGUMENT");
-    } catch (StatusRuntimeException e) {
-      assertEquals(Status.INVALID_ARGUMENT.getCode(), e.getStatus().getCode());
+    if (probe) {
+      // Send a non-compressed message with expectCompress=true. Servers supporting this test case
+      // should return INVALID_ARGUMENT.
+      try {
+        blockingStub.unaryCall(expectCompressedRequest);
+        fail("expected INVALID_ARGUMENT");
+      } catch (StatusRuntimeException e) {
+        assertEquals(Status.INVALID_ARGUMENT.getCode(), e.getStatus().getCode());
+      }
+      assertStatsTrace("grpc.testing.TestService/UnaryCall", Status.Code.INVALID_ARGUMENT);
     }
-    assertStatsTrace("grpc.testing.TestService/UnaryCall", Status.Code.INVALID_ARGUMENT);
 
     assertEquals(
         goldenResponse, blockingStub.withCompression("gzip").unaryCall(expectCompressedRequest));
@@ -557,7 +559,7 @@
    * inspecting a message's compression level, so this is primarily intended to run against a gRPC
    * C++ server.
    */
-  public void clientCompressedStreaming() throws Exception {
+  public void clientCompressedStreaming(boolean probe) throws Exception {
     final StreamingInputCallRequest expectCompressedRequest =
         StreamingInputCallRequest.newBuilder()
             .setExpectCompressed(BoolValue.newBuilder().setValue(true))
@@ -575,13 +577,15 @@
     StreamObserver<StreamingInputCallRequest> requestObserver =
         asyncStub.streamingInputCall(responseObserver);
 
-    // Send a non-compressed message with expectCompress=true. Servers supporting this test case
-    // should return INVALID_ARGUMENT.
-    requestObserver.onNext(expectCompressedRequest);
-    responseObserver.awaitCompletion(operationTimeoutMillis(), TimeUnit.MILLISECONDS);
-    Throwable e = responseObserver.getError();
-    assertNotNull("expected INVALID_ARGUMENT", e);
-    assertEquals(Status.INVALID_ARGUMENT.getCode(), Status.fromThrowable(e).getCode());
+    if (probe) {
+      // Send a non-compressed message with expectCompress=true. Servers supporting this test case
+      // should return INVALID_ARGUMENT.
+      requestObserver.onNext(expectCompressedRequest);
+      responseObserver.awaitCompletion(operationTimeoutMillis(), TimeUnit.MILLISECONDS);
+      Throwable e = responseObserver.getError();
+      assertNotNull("expected INVALID_ARGUMENT", e);
+      assertEquals(Status.INVALID_ARGUMENT.getCode(), Status.fromThrowable(e).getCode());
+    }
 
     // Start a new stream
     responseObserver = StreamRecorder.create();
diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestCases.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestCases.java
index 2efbd31..7056d38 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/TestCases.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestCases.java
@@ -26,9 +26,13 @@
   CACHEABLE_UNARY("cacheable unary rpc sent using GET"),
   LARGE_UNARY("single request and (large) response"),
   CLIENT_COMPRESSED_UNARY("client compressed unary request"),
+  CLIENT_COMPRESSED_UNARY_NOPROBE(
+      "client compressed unary request (skip initial feature-probing request)"),
   SERVER_COMPRESSED_UNARY("server compressed unary response"),
   CLIENT_STREAMING("request streaming with single response"),
   CLIENT_COMPRESSED_STREAMING("client per-message compression on stream"),
+  CLIENT_COMPRESSED_STREAMING_NOPROBE(
+      "client per-message compression on stream (skip initial feature-probing request)"),
   SERVER_STREAMING("single request with response streaming"),
   SERVER_COMPRESSED_STREAMING("server per-message compression on stream"),
   PING_PONG("full-duplex ping-pong streaming"),
diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java
index bdf7eb1..4d891c9 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java
@@ -221,7 +221,11 @@
         break;
 
       case CLIENT_COMPRESSED_UNARY:
-        tester.clientCompressedUnary();
+        tester.clientCompressedUnary(true);
+        break;
+
+      case CLIENT_COMPRESSED_UNARY_NOPROBE:
+        tester.clientCompressedUnary(false);
         break;
 
       case SERVER_COMPRESSED_UNARY:
@@ -233,7 +237,11 @@
         break;
 
       case CLIENT_COMPRESSED_STREAMING:
-        tester.clientCompressedStreaming();
+        tester.clientCompressedStreaming(true);
+        break;
+
+      case CLIENT_COMPRESSED_STREAMING_NOPROBE:
+        tester.clientCompressedStreaming(false);
         break;
 
       case SERVER_STREAMING:
diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/TestCasesTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/TestCasesTest.java
index aac5cbc..6e54f5c 100644
--- a/interop-testing/src/test/java/io/grpc/testing/integration/TestCasesTest.java
+++ b/interop-testing/src/test/java/io/grpc/testing/integration/TestCasesTest.java
@@ -65,12 +65,21 @@
       "timeout_on_sleeping_server"
     };
 
-    assertEquals(testCases.length, TestCases.values().length);
+    // additional test cases
+    String[] additionalTestCases = {
+      "client_compressed_unary_noprobe",
+      "client_compressed_streaming_noprobe"
+    };
+
+    assertEquals(testCases.length + additionalTestCases.length, TestCases.values().length);
 
     Set<TestCases> testCaseSet = new HashSet<TestCases>(testCases.length);
     for (String testCase : testCases) {
       testCaseSet.add(TestCases.fromString(testCase));
     }
+    for (String testCase : additionalTestCases) {
+      testCaseSet.add(TestCases.fromString(testCase));
+    }
 
     assertEquals(TestCases.values().length, testCaseSet.size());
   }