6363import java .util .List ;
6464import java .util .Map ;
6565import java .util .Queue ;
66+ import java .util .stream .Collectors ;
6667import java .util .stream .IntStream ;
68+ import java .util .stream .Stream ;
6769import org .junit .Test ;
6870import org .junit .runner .RunWith ;
6971import org .junit .runners .JUnit4 ;
@@ -111,6 +113,16 @@ public class ComputeEngineCredentialsTest extends BaseSerializationTest {
111113 + "iTElDRU5TRV8xIiwNCiAgICAgICAiTElDRU5TRV8yIg0KICAgIF0NCiAgfSwNCiAgImlhdCI6IDE1NjQ1MTU4OTY"
112114 + "sDQogICJpc3MiOiAiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwNCiAgInN1YiI6ICIxMTIxNzkwNjI3MjA"
113115 + "zOTEzMDU4ODUiDQp9.redacted" ;
116+ private static final String ACCESS_TOKEN = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
117+ private static final List <String > SCOPES = Arrays .asList ("foo" , "bar" );
118+ private static final String ACCESS_TOKEN_WITH_SCOPES = "1/MkSJoj1xsli0AccessTokenScoped_NKPY2" ;
119+ private static final Map <String , String > SCOPE_TO_ACCESS_TOKEN_MAP =
120+ Stream .of (
121+ new String [][] {
122+ {"default" , ACCESS_TOKEN },
123+ {SCOPES .toString ().replaceAll ("\\ s" , "" ), ACCESS_TOKEN_WITH_SCOPES },
124+ })
125+ .collect (Collectors .toMap (data -> data [0 ], data -> data [1 ]));
114126
115127 @ Test
116128 public void buildTokenUrlWithScopes_null_scopes () {
@@ -215,7 +227,7 @@ public void buildScoped_explicitUniverse() throws IOException {
215227 (ComputeEngineCredentials ) credentials .createScoped (Arrays .asList ("foo" ));
216228
217229 assertEquals ("some-universe" , scopedCredentials .getUniverseDomain ());
218- assertEquals ( true , scopedCredentials .isExplicitUniverseDomain ());
230+ assertTrue ( scopedCredentials .isExplicitUniverseDomain ());
219231 }
220232
221233 @ Test
@@ -228,6 +240,33 @@ public void createScoped_defaultScopes() {
228240 assertEquals ("foo" , scopes .toArray ()[0 ]);
229241 }
230242
243+ @ Test
244+ public void buildScoped_quotaProjectId () throws IOException {
245+ ComputeEngineCredentials credentials =
246+ ComputeEngineCredentials .newBuilder ()
247+ .setScopes (null )
248+ .setQuotaProjectId ("some-project-id" )
249+ .build ();
250+ ComputeEngineCredentials scopedCredentials =
251+ (ComputeEngineCredentials ) credentials .createScoped (Arrays .asList ("foo" ));
252+
253+ assertEquals ("some-project-id" , scopedCredentials .getQuotaProjectId ());
254+ }
255+
256+ @ Test
257+ public void buildDefaultScoped_explicitUniverse () throws IOException {
258+ ComputeEngineCredentials credentials =
259+ ComputeEngineCredentials .newBuilder ()
260+ .setScopes (null )
261+ .setUniverseDomain ("some-universe" )
262+ .build ();
263+ ComputeEngineCredentials scopedCredentials =
264+ (ComputeEngineCredentials ) credentials .createScoped (null , Arrays .asList ("foo" ));
265+
266+ assertEquals ("some-universe" , scopedCredentials .getUniverseDomain ());
267+ assertTrue (scopedCredentials .isExplicitUniverseDomain ());
268+ }
269+
231270 @ Test
232271 public void create_scoped_correctMargins () {
233272 GoogleCredentials credentials =
@@ -240,21 +279,37 @@ public void create_scoped_correctMargins() {
240279
241280 @ Test
242281 public void getRequestMetadata_hasAccessToken () throws IOException {
243- String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
244282 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
245- transportFactory .transport .setAccessToken (accessToken );
246283 ComputeEngineCredentials credentials =
247284 ComputeEngineCredentials .newBuilder ().setHttpTransportFactory (transportFactory ).build ();
248285 Map <String , List <String >> metadata = credentials .getRequestMetadata (CALL_URI );
249286
250- TestUtils .assertContainsBearerToken (metadata , accessToken );
287+ TestUtils .assertContainsBearerToken (metadata , ACCESS_TOKEN );
288+ }
289+
290+ @ Test
291+ public void getRequestMetadata_shouldInvalidateAccessTokenWhenScoped_newAccessTokenFromRefresh ()
292+ throws IOException {
293+ MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
294+ ComputeEngineCredentials credentials =
295+ ComputeEngineCredentials .newBuilder ().setHttpTransportFactory (transportFactory ).build ();
296+ Map <String , List <String >> metadata = credentials .getRequestMetadata (CALL_URI );
297+
298+ TestUtils .assertContainsBearerToken (metadata , ACCESS_TOKEN );
299+
300+ assertNotNull (credentials .getAccessToken ());
301+ ComputeEngineCredentials scopedCredentialCopy =
302+ (ComputeEngineCredentials ) credentials .createScoped (SCOPES );
303+ assertNull (scopedCredentialCopy .getAccessToken ());
304+ Map <String , List <String >> metadataForCopiedCredentials =
305+ scopedCredentialCopy .getRequestMetadata (CALL_URI );
306+ TestUtils .assertContainsBearerToken (metadataForCopiedCredentials , ACCESS_TOKEN_WITH_SCOPES );
307+ TestUtils .assertNotContainsBearerToken (metadataForCopiedCredentials , ACCESS_TOKEN );
251308 }
252309
253310 @ Test
254311 public void getRequestMetadata_missingServiceAccount_throws () {
255- String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
256312 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
257- transportFactory .transport .setAccessToken (accessToken );
258313 transportFactory .transport .setRequestStatusCode (HttpStatusCodes .STATUS_CODE_NOT_FOUND );
259314 ComputeEngineCredentials credentials =
260315 ComputeEngineCredentials .newBuilder ().setHttpTransportFactory (transportFactory ).build ();
@@ -271,9 +326,7 @@ public void getRequestMetadata_missingServiceAccount_throws() {
271326
272327 @ Test
273328 public void getRequestMetadata_serverError_throws () {
274- String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
275329 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
276- transportFactory .transport .setAccessToken (accessToken );
277330 transportFactory .transport .setRequestStatusCode (HttpStatusCodes .STATUS_CODE_SERVER_ERROR );
278331 ComputeEngineCredentials credentials =
279332 ComputeEngineCredentials .newBuilder ().setHttpTransportFactory (transportFactory ).build ();
@@ -481,11 +534,9 @@ public LowLevelHttpResponse execute() throws IOException {
481534 @ Test
482535 public void sign_sameAs () throws IOException {
483536 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
484- final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
485537 String defaultAccountEmail = "mail@mail.com" ;
486538 byte [] expectedSignature = {0xD , 0xE , 0xA , 0xD };
487539
488- transportFactory .transport .setAccessToken (accessToken );
489540 transportFactory .transport .setServiceAccountEmail (defaultAccountEmail );
490541 transportFactory .transport .setSignature (expectedSignature );
491542 ComputeEngineCredentials credentials =
@@ -497,10 +548,8 @@ public void sign_sameAs() throws IOException {
497548 @ Test
498549 public void sign_getAccountFails () throws IOException {
499550 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
500- final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
501551 byte [] expectedSignature = {0xD , 0xE , 0xA , 0xD };
502552
503- transportFactory .transport .setAccessToken (accessToken );
504553 transportFactory .transport .setSignature (expectedSignature );
505554 ComputeEngineCredentials credentials =
506555 ComputeEngineCredentials .newBuilder ().setHttpTransportFactory (transportFactory ).build ();
@@ -517,7 +566,6 @@ public void sign_getAccountFails() throws IOException {
517566 @ Test
518567 public void sign_accessDenied_throws () {
519568 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
520- final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
521569 String defaultAccountEmail = "mail@mail.com" ;
522570
523571 transportFactory .transport =
@@ -538,7 +586,7 @@ public LowLevelHttpResponse execute() throws IOException {
538586 }
539587 };
540588
541- transportFactory .transport .setAccessToken (accessToken );
589+ transportFactory .transport .setAccessToken (ACCESS_TOKEN );
542590 transportFactory .transport .setServiceAccountEmail (defaultAccountEmail );
543591
544592 ComputeEngineCredentials credentials =
@@ -558,7 +606,6 @@ public LowLevelHttpResponse execute() throws IOException {
558606 @ Test
559607 public void sign_serverError_throws () {
560608 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
561- final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
562609 String defaultAccountEmail = "mail@mail.com" ;
563610
564611 transportFactory .transport =
@@ -579,7 +626,7 @@ public LowLevelHttpResponse execute() throws IOException {
579626 }
580627 };
581628
582- transportFactory .transport .setAccessToken (accessToken );
629+ transportFactory .transport .setAccessToken (ACCESS_TOKEN );
583630 transportFactory .transport .setServiceAccountEmail (defaultAccountEmail );
584631
585632 ComputeEngineCredentials credentials =
@@ -808,7 +855,6 @@ public void getUniverseDomain_fromMetadata_non404error_throws() throws IOExcepti
808855 @ Test
809856 public void sign_emptyContent_throws () {
810857 MockMetadataServerTransportFactory transportFactory = new MockMetadataServerTransportFactory ();
811- String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
812858 String defaultAccountEmail = "mail@mail.com" ;
813859
814860 transportFactory .transport =
@@ -828,7 +874,7 @@ public LowLevelHttpResponse execute() throws IOException {
828874 }
829875 };
830876
831- transportFactory .transport .setAccessToken (accessToken );
877+ transportFactory .transport .setAccessToken (ACCESS_TOKEN );
832878 transportFactory .transport .setServiceAccountEmail (defaultAccountEmail );
833879
834880 ComputeEngineCredentials credentials =
@@ -930,7 +976,8 @@ public void idTokenWithAudience_license() throws IOException {
930976
931977 static class MockMetadataServerTransportFactory implements HttpTransportFactory {
932978
933- MockMetadataServerTransport transport = new MockMetadataServerTransport ();
979+ MockMetadataServerTransport transport =
980+ new MockMetadataServerTransport (SCOPE_TO_ACCESS_TOKEN_MAP );
934981
935982 @ Override
936983 public HttpTransport create () {
0 commit comments