|  | @@ -35,6 +35,7 @@
 | 
	
		
			
				|  |  |  #include <grpcpp/server_context.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "src/core/lib/gpr/env.h"
 | 
	
		
			
				|  |  | +#include "src/core/lib/iomgr/iomgr.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/security/credentials/credentials.h"
 | 
	
		
			
				|  |  |  #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
 | 
	
		
			
				|  |  |  #include "src/proto/grpc/testing/echo.grpc.pb.h"
 | 
	
	
		
			
				|  | @@ -52,6 +53,17 @@ using grpc::testing::EchoResponse;
 | 
	
		
			
				|  |  |  using grpc::testing::kTlsCredentialsType;
 | 
	
		
			
				|  |  |  using std::chrono::system_clock;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// MAYBE_SKIP_TEST is a macro to determine if this particular test configuration
 | 
	
		
			
				|  |  | +// should be skipped based on a decision made at SetUp time. In particular,
 | 
	
		
			
				|  |  | +// tests that use the callback server can only be run if the iomgr can run in
 | 
	
		
			
				|  |  | +// the background or if the transport is in-process.
 | 
	
		
			
				|  |  | +#define MAYBE_SKIP_TEST \
 | 
	
		
			
				|  |  | +  do {                  \
 | 
	
		
			
				|  |  | +    if (do_not_test_) { \
 | 
	
		
			
				|  |  | +      return;           \
 | 
	
		
			
				|  |  | +    }                   \
 | 
	
		
			
				|  |  | +  } while (0)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  namespace grpc {
 | 
	
		
			
				|  |  |  namespace testing {
 | 
	
		
			
				|  |  |  namespace {
 | 
	
	
		
			
				|  | @@ -237,6 +249,14 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
 | 
	
		
			
				|  |  |      GetParam().Log();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  void SetUp() override {
 | 
	
		
			
				|  |  | +    if (GetParam().callback_server && !GetParam().inproc &&
 | 
	
		
			
				|  |  | +        !grpc_iomgr_run_in_background()) {
 | 
	
		
			
				|  |  | +      do_not_test_ = true;
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    void TearDown() override {
 | 
	
		
			
				|  |  |      if (is_server_started_) {
 | 
	
		
			
				|  |  |        server_->Shutdown();
 | 
	
	
		
			
				|  | @@ -361,6 +381,7 @@ class End2endTest : public ::testing::TestWithParam<TestScenario> {
 | 
	
		
			
				|  |  |      DummyInterceptor::Reset();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  bool do_not_test_{false};
 | 
	
		
			
				|  |  |    bool is_server_started_;
 | 
	
		
			
				|  |  |    std::shared_ptr<Channel> channel_;
 | 
	
		
			
				|  |  |    std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
 | 
	
	
		
			
				|  | @@ -416,6 +437,7 @@ class End2endServerTryCancelTest : public End2endTest {
 | 
	
		
			
				|  |  |    // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
 | 
	
		
			
				|  |  |    void TestRequestStreamServerCancel(
 | 
	
		
			
				|  |  |        ServerTryCancelRequestPhase server_try_cancel, int num_msgs_to_send) {
 | 
	
		
			
				|  |  | +    MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |      RestartServer(std::shared_ptr<AuthMetadataProcessor>());
 | 
	
		
			
				|  |  |      ResetStub();
 | 
	
		
			
				|  |  |      EchoRequest request;
 | 
	
	
		
			
				|  | @@ -494,6 +516,7 @@ class End2endServerTryCancelTest : public End2endTest {
 | 
	
		
			
				|  |  |    // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
 | 
	
		
			
				|  |  |    void TestResponseStreamServerCancel(
 | 
	
		
			
				|  |  |        ServerTryCancelRequestPhase server_try_cancel) {
 | 
	
		
			
				|  |  | +    MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |      RestartServer(std::shared_ptr<AuthMetadataProcessor>());
 | 
	
		
			
				|  |  |      ResetStub();
 | 
	
		
			
				|  |  |      EchoRequest request;
 | 
	
	
		
			
				|  | @@ -575,6 +598,7 @@ class End2endServerTryCancelTest : public End2endTest {
 | 
	
		
			
				|  |  |    // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
 | 
	
		
			
				|  |  |    void TestBidiStreamServerCancel(ServerTryCancelRequestPhase server_try_cancel,
 | 
	
		
			
				|  |  |                                    int num_messages) {
 | 
	
		
			
				|  |  | +    MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |      RestartServer(std::shared_ptr<AuthMetadataProcessor>());
 | 
	
		
			
				|  |  |      ResetStub();
 | 
	
		
			
				|  |  |      EchoRequest request;
 | 
	
	
		
			
				|  | @@ -650,6 +674,7 @@ class End2endServerTryCancelTest : public End2endTest {
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endServerTryCancelTest, RequestEchoServerCancel) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -712,6 +737,7 @@ TEST_P(End2endServerTryCancelTest, BidiStreamServerCancelAfter) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, SimpleRpcWithCustomUserAgentPrefix) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    // User-Agent is an HTTP header for HTTP transports only
 | 
	
		
			
				|  |  |    if (GetParam().inproc) {
 | 
	
		
			
				|  |  |      return;
 | 
	
	
		
			
				|  | @@ -735,6 +761,7 @@ TEST_P(End2endTest, SimpleRpcWithCustomUserAgentPrefix) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, MultipleRpcsWithVariedBinaryMetadataValue) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::vector<std::thread> threads;
 | 
	
		
			
				|  |  |    threads.reserve(10);
 | 
	
	
		
			
				|  | @@ -747,6 +774,7 @@ TEST_P(End2endTest, MultipleRpcsWithVariedBinaryMetadataValue) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, MultipleRpcs) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::vector<std::thread> threads;
 | 
	
		
			
				|  |  |    threads.reserve(10);
 | 
	
	
		
			
				|  | @@ -759,6 +787,7 @@ TEST_P(End2endTest, MultipleRpcs) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, EmptyBinaryMetadata) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -771,6 +800,7 @@ TEST_P(End2endTest, EmptyBinaryMetadata) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ReconnectChannel) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    if (GetParam().inproc) {
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -796,6 +826,7 @@ TEST_P(End2endTest, ReconnectChannel) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RequestStreamOneRequest) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -812,6 +843,7 @@ TEST_P(End2endTest, RequestStreamOneRequest) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RequestStreamOneRequestWithCoalescingApi) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -827,6 +859,7 @@ TEST_P(End2endTest, RequestStreamOneRequestWithCoalescingApi) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RequestStreamTwoRequests) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -843,6 +876,7 @@ TEST_P(End2endTest, RequestStreamTwoRequests) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RequestStreamTwoRequestsWithWriteThrough) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -859,6 +893,7 @@ TEST_P(End2endTest, RequestStreamTwoRequestsWithWriteThrough) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RequestStreamTwoRequestsWithCoalescingApi) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -875,6 +910,7 @@ TEST_P(End2endTest, RequestStreamTwoRequestsWithCoalescingApi) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ResponseStream) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -893,6 +929,7 @@ TEST_P(End2endTest, ResponseStream) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ResponseStreamWithCoalescingApi) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -914,6 +951,7 @@ TEST_P(End2endTest, ResponseStreamWithCoalescingApi) {
 | 
	
		
			
				|  |  |  // This was added to prevent regression from issue:
 | 
	
		
			
				|  |  |  // https://github.com/grpc/grpc/issues/11546
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ResponseStreamWithEverythingCoalesced) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -935,6 +973,7 @@ TEST_P(End2endTest, ResponseStreamWithEverythingCoalesced) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, BidiStream) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -959,6 +998,7 @@ TEST_P(End2endTest, BidiStream) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, BidiStreamWithCoalescingApi) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -994,6 +1034,7 @@ TEST_P(End2endTest, BidiStreamWithCoalescingApi) {
 | 
	
		
			
				|  |  |  // This was added to prevent regression from issue:
 | 
	
		
			
				|  |  |  // https://github.com/grpc/grpc/issues/11546
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, BidiStreamWithEverythingCoalesced) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1019,6 +1060,7 @@ TEST_P(End2endTest, BidiStreamWithEverythingCoalesced) {
 | 
	
		
			
				|  |  |  // Talk to the two services with the same name but different package names.
 | 
	
		
			
				|  |  |  // The two stubs are created on the same channel.
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, DiffPackageServices) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1047,6 +1089,7 @@ void CancelRpc(ClientContext* context, int delay_us, ServiceType* service) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, CancelRpcBeforeStart) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1063,6 +1106,7 @@ TEST_P(End2endTest, CancelRpcBeforeStart) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Client cancels request stream after sending two messages
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ClientCancelsRequestStream) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1086,6 +1130,7 @@ TEST_P(End2endTest, ClientCancelsRequestStream) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Client cancels server stream after sending some messages
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ClientCancelsResponseStream) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1121,6 +1166,7 @@ TEST_P(End2endTest, ClientCancelsResponseStream) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Client cancels bidi stream after sending some messages
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ClientCancelsBidi) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1156,6 +1202,7 @@ TEST_P(End2endTest, ClientCancelsBidi) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, RpcMaxMessageSize) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1178,6 +1225,7 @@ void ReaderThreadFunc(ClientReaderWriter<EchoRequest, EchoResponse>* stream,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Run a Read and a WritesDone simultaneously.
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, SimultaneousReadWritesDone) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    ClientContext context;
 | 
	
		
			
				|  |  |    gpr_event ev;
 | 
	
	
		
			
				|  | @@ -1192,6 +1240,7 @@ TEST_P(End2endTest, SimultaneousReadWritesDone) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ChannelState) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    if (GetParam().inproc) {
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1242,6 +1291,7 @@ TEST_P(End2endTest, ChannelStateTimeout) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Talking to a non-existing service.
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, NonExistingService) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetChannel();
 | 
	
		
			
				|  |  |    std::unique_ptr<grpc::testing::UnimplementedEchoService::Stub> stub;
 | 
	
		
			
				|  |  |    stub = grpc::testing::UnimplementedEchoService::NewStub(channel_);
 | 
	
	
		
			
				|  | @@ -1259,6 +1309,7 @@ TEST_P(End2endTest, NonExistingService) {
 | 
	
		
			
				|  |  |  // Ask the server to send back a serialized proto in trailer.
 | 
	
		
			
				|  |  |  // This is an example of setting error details.
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, BinaryTrailerTest) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1285,6 +1336,7 @@ TEST_P(End2endTest, BinaryTrailerTest) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(End2endTest, ExpectErrorTest) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    std::vector<ErrorStatus> expected_status;
 | 
	
	
		
			
				|  | @@ -1336,11 +1388,13 @@ class ProxyEnd2endTest : public End2endTest {
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, SimpleRpc) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    SendRpc(stub_.get(), 1, false);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, SimpleRpcWithEmptyMessages) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1351,6 +1405,7 @@ TEST_P(ProxyEnd2endTest, SimpleRpcWithEmptyMessages) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, MultipleRpcs) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::vector<std::thread> threads;
 | 
	
		
			
				|  |  |    threads.reserve(10);
 | 
	
	
		
			
				|  | @@ -1364,6 +1419,7 @@ TEST_P(ProxyEnd2endTest, MultipleRpcs) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Set a 10us deadline and make sure proper error is returned.
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, RpcDeadlineExpires) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1389,6 +1445,7 @@ TEST_P(ProxyEnd2endTest, RpcDeadlineExpires) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Set a long but finite deadline.
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, RpcLongDeadline) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1405,6 +1462,7 @@ TEST_P(ProxyEnd2endTest, RpcLongDeadline) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Ask server to echo back the deadline it sees.
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, EchoDeadline) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1430,6 +1488,7 @@ TEST_P(ProxyEnd2endTest, EchoDeadline) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Ask server to echo back the deadline it sees. The rpc has no deadline.
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, EchoDeadlineForNoDeadlineRpc) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1445,6 +1504,7 @@ TEST_P(ProxyEnd2endTest, EchoDeadlineForNoDeadlineRpc) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, UnimplementedRpc) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1460,6 +1520,7 @@ TEST_P(ProxyEnd2endTest, UnimplementedRpc) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Client cancels rpc after 10ms
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, ClientCancelsRpc) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1494,6 +1555,7 @@ TEST_P(ProxyEnd2endTest, ClientCancelsRpc) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Server cancels rpc after 1ms
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, ServerCancelsRpc) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1508,6 +1570,7 @@ TEST_P(ProxyEnd2endTest, ServerCancelsRpc) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Make the response larger than the flow control window.
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, HugeResponse) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1525,6 +1588,7 @@ TEST_P(ProxyEnd2endTest, HugeResponse) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ProxyEnd2endTest, Peer) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    // Peer is not meaningful for inproc
 | 
	
		
			
				|  |  |    if (GetParam().inproc) {
 | 
	
		
			
				|  |  |      return;
 | 
	
	
		
			
				|  | @@ -1553,6 +1617,7 @@ class SecureEnd2endTest : public End2endTest {
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, SimpleRpcWithHost) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
	
		
			
				|  | @@ -1584,6 +1649,7 @@ bool MetadataContains(
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorSuccess) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    auto* processor = new TestAuthMetadataProcessor(true);
 | 
	
		
			
				|  |  |    StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
	
		
			
				|  | @@ -1609,6 +1675,7 @@ TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorSuccess) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    auto* processor = new TestAuthMetadataProcessor(true);
 | 
	
		
			
				|  |  |    StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
	
		
			
				|  | @@ -1624,6 +1691,7 @@ TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, SetPerCallCredentials) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1646,6 +1714,7 @@ TEST_P(SecureEnd2endTest, SetPerCallCredentials) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, OverridePerCallCredentials) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1677,6 +1746,7 @@ TEST_P(SecureEnd2endTest, OverridePerCallCredentials) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, AuthMetadataPluginKeyFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1694,6 +1764,7 @@ TEST_P(SecureEnd2endTest, AuthMetadataPluginKeyFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, AuthMetadataPluginValueFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1711,6 +1782,7 @@ TEST_P(SecureEnd2endTest, AuthMetadataPluginValueFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1732,6 +1804,7 @@ TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorSuccess) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    auto* processor = new TestAuthMetadataProcessor(false);
 | 
	
		
			
				|  |  |    StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
	
		
			
				|  | @@ -1757,6 +1830,7 @@ TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorSuccess) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    auto* processor = new TestAuthMetadataProcessor(false);
 | 
	
		
			
				|  |  |    StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
	
		
			
				|  | @@ -1772,6 +1846,7 @@ TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginFailure) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1793,6 +1868,7 @@ TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginFailure) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, CompositeCallCreds) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1821,6 +1897,7 @@ TEST_P(SecureEnd2endTest, CompositeCallCreds) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(SecureEnd2endTest, ClientAuthContext) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
		
			
				|  |  |    EchoResponse response;
 | 
	
	
		
			
				|  | @@ -1865,6 +1942,7 @@ class ResourceQuotaEnd2endTest : public End2endTest {
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_P(ResourceQuotaEnd2endTest, SimpleRequest) {
 | 
	
		
			
				|  |  | +  MAYBE_SKIP_TEST;
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    EchoRequest request;
 | 
	
	
		
			
				|  | @@ -1899,11 +1977,17 @@ std::vector<TestScenario> CreateTestScenarios(bool use_proxy,
 | 
	
		
			
				|  |  |      credentials_types.push_back(kInsecureCredentialsType);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // For now test callback server only with inproc
 | 
	
		
			
				|  |  | +  // Test callback with inproc or if the event-engine allows it
 | 
	
		
			
				|  |  |    GPR_ASSERT(!credentials_types.empty());
 | 
	
		
			
				|  |  |    for (const auto& cred : credentials_types) {
 | 
	
		
			
				|  |  |      scenarios.emplace_back(false, false, false, cred, false);
 | 
	
		
			
				|  |  |      scenarios.emplace_back(true, false, false, cred, false);
 | 
	
		
			
				|  |  | +    if (test_callback_server) {
 | 
	
		
			
				|  |  | +      // Note that these scenarios will be dynamically disabled if the event
 | 
	
		
			
				|  |  | +      // engine doesn't run in the background
 | 
	
		
			
				|  |  | +      scenarios.emplace_back(false, false, false, cred, true);
 | 
	
		
			
				|  |  | +      scenarios.emplace_back(true, false, false, cred, true);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if (use_proxy) {
 | 
	
		
			
				|  |  |        scenarios.emplace_back(false, true, false, cred, false);
 | 
	
		
			
				|  |  |        scenarios.emplace_back(true, true, false, cred, false);
 |