5656import com .google .common .truth .Truth ;
5757import io .grpc .ManagedChannel ;
5858import io .grpc .ManagedChannelBuilder ;
59+ import io .grpc .TlsChannelCredentials ;
5960import io .grpc .alts .ComputeEngineChannelBuilder ;
6061import java .io .IOException ;
62+ import java .io .InputStream ;
6163import java .security .GeneralSecurityException ;
6264import java .time .Duration ;
6365import java .util .ArrayList ;
8385
8486class InstantiatingGrpcChannelProviderTest extends AbstractMtlsTransportChannelTest {
8587 private static final String DEFAULT_ENDPOINT = "test.googleapis.com:443" ;
88+ private static final String DEFAULT_MTLS_ENDPOINT = "test.mtls.googleapis.com:443" ;
8689 private static final String API_KEY_HEADER_VALUE = "fake_api_key_2" ;
8790 private static final String API_KEY_AUTH_HEADER_KEY = "x-goog-api-key" ;
8891 private static String originalOSName ;
@@ -129,6 +132,35 @@ void testEndpointBadPort() {
129132 () -> InstantiatingGrpcChannelProvider .newBuilder ().setEndpoint ("localhost:abcd" ));
130133 }
131134
135+ @ Test
136+ void testMtlsEndpoint () {
137+ InstantiatingGrpcChannelProvider .Builder builder =
138+ InstantiatingGrpcChannelProvider .newBuilder ();
139+ builder .setMtlsEndpoint (DEFAULT_MTLS_ENDPOINT );
140+ assertEquals (builder .getMtlsEndpoint (), DEFAULT_MTLS_ENDPOINT );
141+
142+ InstantiatingGrpcChannelProvider provider = builder .build ();
143+ assertEquals (provider .getMtlsEndpoint (), DEFAULT_MTLS_ENDPOINT );
144+ }
145+
146+ @ Test
147+ void testMtlsEndpointNoPort () {
148+ assertThrows (
149+ IllegalArgumentException .class ,
150+ () ->
151+ InstantiatingGrpcChannelProvider .newBuilder ()
152+ .setMtlsEndpoint ("test.mtls.googleapis.com" ));
153+ }
154+
155+ @ Test
156+ void testMtlsEndpointBadPort () {
157+ assertThrows (
158+ IllegalArgumentException .class ,
159+ () ->
160+ InstantiatingGrpcChannelProvider .newBuilder ()
161+ .setEndpoint ("test.mtls.googleapis.com:abcd" ));
162+ }
163+
132164 @ Test
133165 void testKeepAlive () {
134166 final long millis = 15 ;
@@ -230,6 +262,7 @@ void testToBuilder() {
230262 InstantiatingGrpcChannelProvider .newBuilder ()
231263 .setProcessorCount (2 )
232264 .setEndpoint ("fake.endpoint:443" )
265+ .setMtlsEndpoint ("fake.endpoint:443" )
233266 .setMaxInboundMessageSize (12345678 )
234267 .setMaxInboundMetadataSize (4096 )
235268 .setKeepAliveTimeDuration (keepaliveTime )
@@ -243,6 +276,7 @@ void testToBuilder() {
243276 InstantiatingGrpcChannelProvider .Builder builder = provider .toBuilder ();
244277
245278 assertThat (builder .getEndpoint ()).isEqualTo ("fake.endpoint:443" );
279+ assertThat (builder .getMtlsEndpoint ()).isEqualTo ("fake.endpoint:443" );
246280 assertThat (builder .getMaxInboundMessageSize ()).isEqualTo (12345678 );
247281 assertThat (builder .getMaxInboundMetadataSize ()).isEqualTo (4096 );
248282 assertThat (builder .getKeepAliveTimeDuration ()).isEqualTo (keepaliveTime );
@@ -980,6 +1014,142 @@ private FixedHeaderProvider getHeaderProviderWithApiKeyHeader() {
9801014 return FixedHeaderProvider .create (header );
9811015 }
9821016
1017+ @ Test
1018+ void isGoogleS2AEnabled_envVarNotSet_returnsFalse () {
1019+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1020+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1021+ .thenReturn ("false" );
1022+ InstantiatingGrpcChannelProvider provider =
1023+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1024+ Truth .assertThat (provider .isGoogleS2AEnabled ()).isFalse ();
1025+ }
1026+
1027+ @ Test
1028+ void isGoogleS2AEnabled_envVarNotSet_returnsTrue () {
1029+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1030+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1031+ .thenReturn ("true" );
1032+ InstantiatingGrpcChannelProvider provider =
1033+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1034+ Truth .assertThat (provider .isGoogleS2AEnabled ()).isFalse ();
1035+ }
1036+
1037+ @ Test
1038+ void shouldUseS2A_envVarNotSet_returnsFalse () {
1039+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1040+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1041+ .thenReturn ("false" );
1042+ InstantiatingGrpcChannelProvider provider =
1043+ InstantiatingGrpcChannelProvider .newBuilder ()
1044+ .setEndpoint (DEFAULT_MTLS_ENDPOINT )
1045+ .setMtlsEndpoint (DEFAULT_MTLS_ENDPOINT )
1046+ .setEnvProvider (envProvider )
1047+ .build ();
1048+ Truth .assertThat (provider .shouldUseS2A ()).isFalse ();
1049+ }
1050+
1051+ @ Test
1052+ void shouldUseS2A_mtlsEndpointNotSet_returnsFalse () {
1053+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1054+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1055+ .thenReturn ("true" );
1056+ InstantiatingGrpcChannelProvider provider =
1057+ InstantiatingGrpcChannelProvider .newBuilder ()
1058+ .setEndpoint (DEFAULT_ENDPOINT )
1059+ .setEnvProvider (envProvider )
1060+ .build ();
1061+ Truth .assertThat (provider .shouldUseS2A ()).isFalse ();
1062+ }
1063+
1064+ @ Test
1065+ void shouldUseS2A_endpointOverrideIsSet_returnsFalse () {
1066+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1067+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1068+ .thenReturn ("true" );
1069+ InstantiatingGrpcChannelProvider provider =
1070+ InstantiatingGrpcChannelProvider .newBuilder ()
1071+ .setEndpoint (DEFAULT_ENDPOINT )
1072+ .setMtlsEndpoint (DEFAULT_MTLS_ENDPOINT )
1073+ .setEnvProvider (envProvider )
1074+ .build ();
1075+ Truth .assertThat (provider .shouldUseS2A ()).isFalse ();
1076+ }
1077+
1078+ @ Test
1079+ void shouldUseS2A_nonGDUUniverse_returnsFalse () {
1080+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1081+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1082+ .thenReturn ("true" );
1083+ InstantiatingGrpcChannelProvider provider =
1084+ InstantiatingGrpcChannelProvider .newBuilder ()
1085+ .setEndpoint ("test.mtls.abcd.com:443" )
1086+ .setMtlsEndpoint ("test.mtls.abcd.com:443" )
1087+ .setEnvProvider (envProvider )
1088+ .build ();
1089+ Truth .assertThat (provider .shouldUseS2A ()).isFalse ();
1090+ }
1091+
1092+ @ Test
1093+ void shouldUseS2A_returnsTrue () {
1094+ EnvironmentProvider envProvider = Mockito .mock (EnvironmentProvider .class );
1095+ Mockito .when (envProvider .getenv (InstantiatingGrpcChannelProvider .S2A_ENV_ENABLE_USE_S2A ))
1096+ .thenReturn ("true" );
1097+ InstantiatingGrpcChannelProvider provider =
1098+ InstantiatingGrpcChannelProvider .newBuilder ()
1099+ .setEndpoint (DEFAULT_MTLS_ENDPOINT )
1100+ .setMtlsEndpoint (DEFAULT_MTLS_ENDPOINT )
1101+ .setEnvProvider (envProvider )
1102+ .build ();
1103+ Truth .assertThat (provider .shouldUseS2A ()).isTrue ();
1104+ }
1105+
1106+ @ Test
1107+ void createMtlsToS2AChannelCredentials_missingAllFiles_throws () throws IOException {
1108+ InstantiatingGrpcChannelProvider provider =
1109+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1110+ assertThat (provider .createMtlsToS2AChannelCredentials (null , null , null )).isNull ();
1111+ }
1112+
1113+ @ Test
1114+ void createMtlsToS2AChannelCredentials_missingRootFile_throws () throws IOException {
1115+ InstantiatingGrpcChannelProvider provider =
1116+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1117+ InputStream privateKey = this .getClass ().getClassLoader ().getResourceAsStream ("client_key.pem" );
1118+ InputStream certChain = this .getClass ().getClassLoader ().getResourceAsStream ("client_cert.pem" );
1119+ assertThat (provider .createMtlsToS2AChannelCredentials (null , privateKey , certChain )).isNull ();
1120+ }
1121+
1122+ @ Test
1123+ void createMtlsToS2AChannelCredentials_missingKeyFile_throws () throws IOException {
1124+ InstantiatingGrpcChannelProvider provider =
1125+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1126+ InputStream trustBundle = this .getClass ().getClassLoader ().getResourceAsStream ("root_cert.pem" );
1127+ InputStream certChain = this .getClass ().getClassLoader ().getResourceAsStream ("client_cert.pem" );
1128+ assertThat (provider .createMtlsToS2AChannelCredentials (trustBundle , null , certChain )).isNull ();
1129+ }
1130+
1131+ @ Test
1132+ void createMtlsToS2AChannelCredentials_missingCertChainFile_throws () throws IOException {
1133+ InstantiatingGrpcChannelProvider provider =
1134+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1135+ InputStream trustBundle = this .getClass ().getClassLoader ().getResourceAsStream ("root_cert.pem" );
1136+ InputStream privateKey = this .getClass ().getClassLoader ().getResourceAsStream ("client_key.pem" );
1137+ assertThat (provider .createMtlsToS2AChannelCredentials (trustBundle , privateKey , null )).isNull ();
1138+ }
1139+
1140+ @ Test
1141+ void createMtlsToS2AChannelCredentials_success () throws IOException {
1142+ InstantiatingGrpcChannelProvider provider =
1143+ InstantiatingGrpcChannelProvider .newBuilder ().build ();
1144+ InputStream trustBundle = this .getClass ().getClassLoader ().getResourceAsStream ("root_cert.pem" );
1145+ InputStream privateKey = this .getClass ().getClassLoader ().getResourceAsStream ("client_key.pem" );
1146+ InputStream certChain = this .getClass ().getClassLoader ().getResourceAsStream ("client_cert.pem" );
1147+ assertThat (trustBundle ).isNotNull ();
1148+ assertEquals (
1149+ provider .createMtlsToS2AChannelCredentials (trustBundle , privateKey , certChain ).getClass (),
1150+ TlsChannelCredentials .class );
1151+ }
1152+
9831153 private static class FakeLogHandler extends Handler {
9841154
9851155 List <LogRecord > records = new ArrayList <>();
0 commit comments