1717package io .grpc .xds .internal .security ;
1818
1919import static com .google .common .truth .Truth .assertThat ;
20+ import static io .grpc .xds .internal .security .CommonTlsContextTestsUtil .buildUpstreamTlsContext ;
21+ import static org .mockito .ArgumentMatchers .any ;
2022import static org .mockito .ArgumentMatchers .eq ;
21- import static org .mockito .Mockito .any ;
2223import static org .mockito .Mockito .doReturn ;
2324import static org .mockito .Mockito .doThrow ;
2425import static org .mockito .Mockito .mock ;
2526import static org .mockito .Mockito .never ;
27+ import static org .mockito .Mockito .reset ;
2628import static org .mockito .Mockito .times ;
2729import static org .mockito .Mockito .verify ;
2830
31+ import io .envoyproxy .envoy .extensions .transport_sockets .tls .v3 .CertificateValidationContext ;
2932import io .grpc .xds .EnvoyServerProtoData ;
3033import io .grpc .xds .TlsContextManager ;
3134import io .netty .handler .ssl .SslContext ;
@@ -47,14 +50,17 @@ public class SslContextProviderSupplierTest {
4750 @ Rule public final MockitoRule mocks = MockitoJUnit .rule ();
4851
4952 @ Mock private TlsContextManager mockTlsContextManager ;
53+ @ Mock private Executor mockExecutor ;
5054 private SslContextProviderSupplier supplier ;
5155 private SslContextProvider mockSslContextProvider ;
5256 private EnvoyServerProtoData .UpstreamTlsContext upstreamTlsContext ;
5357 private SslContextProvider .Callback mockCallback ;
5458
55- private void prepareSupplier () {
56- upstreamTlsContext =
57- CommonTlsContextTestsUtil .buildUpstreamTlsContext ("google_cloud_private_spiffe" , true );
59+ private void prepareSupplier (boolean createUpstreamTlsContext ) {
60+ if (createUpstreamTlsContext ) {
61+ upstreamTlsContext =
62+ buildUpstreamTlsContext ("google_cloud_private_spiffe" , true );
63+ }
5864 mockSslContextProvider = mock (SslContextProvider .class );
5965 doReturn (mockSslContextProvider )
6066 .when (mockTlsContextManager )
@@ -64,14 +70,13 @@ private void prepareSupplier() {
6470
6571 private void callUpdateSslContext () {
6672 mockCallback = mock (SslContextProvider .Callback .class );
67- Executor mockExecutor = mock (Executor .class );
6873 doReturn (mockExecutor ).when (mockCallback ).getExecutor ();
6974 supplier .updateSslContext (mockCallback );
7075 }
7176
7277 @ Test
7378 public void get_updateSecret () {
74- prepareSupplier ();
79+ prepareSupplier (true );
7580 callUpdateSslContext ();
7681 verify (mockTlsContextManager , times (2 ))
7782 .findOrCreateClientSslContextProvider (eq (upstreamTlsContext ));
@@ -95,11 +100,12 @@ public void get_updateSecret() {
95100
96101 @ Test
97102 public void get_onException () {
98- prepareSupplier ();
103+ prepareSupplier (true );
99104 callUpdateSslContext ();
100105 ArgumentCaptor <SslContextProvider .Callback > callbackCaptor =
101106 ArgumentCaptor .forClass (SslContextProvider .Callback .class );
102- verify (mockSslContextProvider , times (1 )).addCallback (callbackCaptor .capture ());
107+ verify (mockSslContextProvider , times (1 ))
108+ .addCallback (callbackCaptor .capture ());
103109 SslContextProvider .Callback capturedCallback = callbackCaptor .getValue ();
104110 assertThat (capturedCallback ).isNotNull ();
105111 Exception exception = new Exception ("test" );
@@ -109,9 +115,71 @@ public void get_onException() {
109115 .releaseClientSslContextProvider (eq (mockSslContextProvider ));
110116 }
111117
118+ @ Test
119+ public void systemRootCertsWithMtls_callbackExecutedFromProvider () {
120+ upstreamTlsContext =
121+ CommonTlsContextTestsUtil .buildNewUpstreamTlsContextForCertProviderInstance (
122+ "gcp_id" ,
123+ "cert-default" ,
124+ null ,
125+ "root-default" ,
126+ null ,
127+ CertificateValidationContext .newBuilder ()
128+ .setSystemRootCerts (
129+ CertificateValidationContext .SystemRootCerts .getDefaultInstance ())
130+ .build ());
131+ prepareSupplier (false );
132+
133+ callUpdateSslContext ();
134+
135+ verify (mockTlsContextManager , times (2 ))
136+ .findOrCreateClientSslContextProvider (eq (upstreamTlsContext ));
137+ verify (mockTlsContextManager , times (0 ))
138+ .releaseClientSslContextProvider (any (SslContextProvider .class ));
139+ ArgumentCaptor <SslContextProvider .Callback > callbackCaptor =
140+ ArgumentCaptor .forClass (SslContextProvider .Callback .class );
141+ verify (mockSslContextProvider , times (1 )).addCallback (callbackCaptor .capture ());
142+ SslContextProvider .Callback capturedCallback = callbackCaptor .getValue ();
143+ assertThat (capturedCallback ).isNotNull ();
144+ SslContext mockSslContext = mock (SslContext .class );
145+ capturedCallback .updateSslContext (mockSslContext );
146+ verify (mockCallback , times (1 )).updateSslContext (eq (mockSslContext ));
147+ verify (mockTlsContextManager , times (1 ))
148+ .releaseClientSslContextProvider (eq (mockSslContextProvider ));
149+ SslContextProvider .Callback mockCallback = mock (SslContextProvider .Callback .class );
150+ supplier .updateSslContext (mockCallback );
151+ verify (mockTlsContextManager , times (3 ))
152+ .findOrCreateClientSslContextProvider (eq (upstreamTlsContext ));
153+ }
154+
155+ @ Test
156+ public void systemRootCertsWithRegularTls_callbackExecutedFromSupplier () {
157+ upstreamTlsContext =
158+ CommonTlsContextTestsUtil .buildNewUpstreamTlsContextForCertProviderInstance (
159+ null ,
160+ null ,
161+ null ,
162+ "root-default" ,
163+ null ,
164+ CertificateValidationContext .newBuilder ()
165+ .setSystemRootCerts (
166+ CertificateValidationContext .SystemRootCerts .getDefaultInstance ())
167+ .build ());
168+ supplier = new SslContextProviderSupplier (upstreamTlsContext , mockTlsContextManager );
169+ reset (mockTlsContextManager );
170+
171+ callUpdateSslContext ();
172+ ArgumentCaptor <Runnable > runnableArgumentCaptor = ArgumentCaptor .forClass (Runnable .class );
173+ verify (mockExecutor ).execute (runnableArgumentCaptor .capture ());
174+ runnableArgumentCaptor .getValue ().run ();
175+ verify (mockCallback , times (1 )).updateSslContext (any (SslContext .class ));
176+ verify (mockTlsContextManager , times (1 ))
177+ .releaseClientSslContextProvider (eq (mockSslContextProvider ));
178+ }
179+
112180 @ Test
113181 public void testClose () {
114- prepareSupplier ();
182+ prepareSupplier (true );
115183 callUpdateSslContext ();
116184 supplier .close ();
117185 verify (mockTlsContextManager , times (1 ))
@@ -125,7 +193,7 @@ public void testClose() {
125193
126194 @ Test
127195 public void testClose_nullSslContextProvider () {
128- prepareSupplier ();
196+ prepareSupplier (true );
129197 doThrow (new NullPointerException ()).when (mockTlsContextManager )
130198 .releaseClientSslContextProvider (null );
131199 supplier .close ();
0 commit comments