@@ -146,6 +146,13 @@ def test_get_cred_info(self):
146146147147 }
148148
149+ def test_universe_domain_matching_source (self ):
150+ source_credentials = service_account .Credentials (
151+ SIGNER ,
"[email protected] " ,
TOKEN_URI ,
universe_domain = "foo.bar" 152+ )
153+ credentials = self .make_credentials (source_credentials = source_credentials )
154+ assert credentials .universe_domain == "foo.bar"
155+
149156 def test__make_copy_get_cred_info (self ):
150157 credentials = self .make_credentials ()
151158 credentials ._cred_file_path = "/path/to/file"
@@ -231,6 +238,38 @@ def test_refresh_success(self, use_data_bytes, mock_donor_credentials):
231238 == ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE
232239 )
233240
241+ @pytest .mark .parametrize ("use_data_bytes" , [True , False ])
242+ def test_refresh_success_nonGdu (self , use_data_bytes , mock_donor_credentials ):
243+ source_credentials = service_account .Credentials (
244+ SIGNER ,
"[email protected] " ,
TOKEN_URI ,
universe_domain = "foo.bar" 245+ )
246+ credentials = self .make_credentials (
247+ lifetime = None , source_credentials = source_credentials
248+ )
249+ token = "token"
250+
251+ expire_time = (
252+ _helpers .utcnow ().replace (microsecond = 0 ) + datetime .timedelta (seconds = 500 )
253+ ).isoformat ("T" ) + "Z"
254+ response_body = {"accessToken" : token , "expireTime" : expire_time }
255+
256+ request = self .make_request (
257+ data = json .dumps (response_body ),
258+ status = http_client .OK ,
259+ use_data_bytes = use_data_bytes ,
260+ )
261+
262+ credentials .refresh (request )
263+
264+ assert credentials .valid
265+ assert not credentials .expired
266+ # Confirm override endpoint used.
267+ request_kwargs = request .call_args [1 ]
268+ assert (
269+ request_kwargs ["url" ]
270+ == "https://iamcredentials.foo.bar/v1/projects/-/serviceAccounts/[email protected] :generateAccessToken" 271+ )
272+
234273 @pytest .mark .parametrize ("use_data_bytes" , [True , False ])
235274 def test_refresh_success_iam_endpoint_override (
236275 self , use_data_bytes , mock_donor_credentials
@@ -397,6 +436,38 @@ def test_service_account_email(self):
397436
398437 def test_sign_bytes (self , mock_donor_credentials , mock_authorizedsession_sign ):
399438 credentials = self .make_credentials (lifetime = None )
439+ expected_url = "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/[email protected] :signBlob" 440+ self ._sign_bytes_helper (
441+ credentials ,
442+ mock_donor_credentials ,
443+ mock_authorizedsession_sign ,
444+ expected_url ,
445+ )
446+
447+ def test_sign_bytes_nonGdu (
448+ self , mock_donor_credentials , mock_authorizedsession_sign
449+ ):
450+ source_credentials = service_account .Credentials (
451+ SIGNER ,
"[email protected] " ,
TOKEN_URI ,
universe_domain = "foo.bar" 452+ )
453+ credentials = self .make_credentials (
454+ lifetime = None , source_credentials = source_credentials
455+ )
456+ expected_url = "https://iamcredentials.foo.bar/v1/projects/-/serviceAccounts/[email protected] :signBlob" 457+ self ._sign_bytes_helper (
458+ credentials ,
459+ mock_donor_credentials ,
460+ mock_authorizedsession_sign ,
461+ expected_url ,
462+ )
463+
464+ def _sign_bytes_helper (
465+ self ,
466+ credentials ,
467+ mock_donor_credentials ,
468+ mock_authorizedsession_sign ,
469+ expected_url ,
470+ ):
400471 token = "token"
401472
402473 expire_time = (
@@ -412,11 +483,19 @@ def test_sign_bytes(self, mock_donor_credentials, mock_authorizedsession_sign):
412483 request .return_value = response
413484
414485 credentials .refresh (request )
415-
416486 assert credentials .valid
417487 assert not credentials .expired
418488
419489 signature = credentials .sign_bytes (b"signed bytes" )
490+ mock_authorizedsession_sign .assert_called_with (
491+ mock .ANY ,
492+ "POST" ,
493+ expected_url ,
494+ None ,
495+ json = {"payload" : "c2lnbmVkIGJ5dGVz" , "delegates" : []},
496+ headers = {"Content-Type" : "application/json" },
497+ )
498+
420499 assert signature == b"signature"
421500
422501 def test_sign_bytes_failure (self ):
@@ -563,6 +642,45 @@ def test_id_token_from_credential(
563642 self , mock_donor_credentials , mock_authorizedsession_idtoken
564643 ):
565644 credentials = self .make_credentials (lifetime = None )
645+ target_credentials = self .make_credentials (lifetime = None )
646+ expected_url = "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/[email protected] :generateIdToken" 647+ self ._test_id_token_helper (
648+ credentials ,
649+ target_credentials ,
650+ mock_donor_credentials ,
651+ mock_authorizedsession_idtoken ,
652+ expected_url ,
653+ )
654+
655+ def test_id_token_from_credential_nonGdu (
656+ self , mock_donor_credentials , mock_authorizedsession_idtoken
657+ ):
658+ source_credentials = service_account .Credentials (
659+ SIGNER ,
"[email protected] " ,
TOKEN_URI ,
universe_domain = "foo.bar" 660+ )
661+ credentials = self .make_credentials (
662+ lifetime = None , source_credentials = source_credentials
663+ )
664+ target_credentials = self .make_credentials (
665+ lifetime = None , source_credentials = source_credentials
666+ )
667+ expected_url = "https://iamcredentials.foo.bar/v1/projects/-/serviceAccounts/[email protected] :generateIdToken" 668+ self ._test_id_token_helper (
669+ credentials ,
670+ target_credentials ,
671+ mock_donor_credentials ,
672+ mock_authorizedsession_idtoken ,
673+ expected_url ,
674+ )
675+
676+ def _test_id_token_helper (
677+ self ,
678+ credentials ,
679+ target_credentials ,
680+ mock_donor_credentials ,
681+ mock_authorizedsession_idtoken ,
682+ expected_url ,
683+ ):
566684 token = "token"
567685 target_audience = "https://foo.bar"
568686
@@ -580,17 +698,19 @@ def test_id_token_from_credential(
580698 assert credentials .valid
581699 assert not credentials .expired
582700
583- new_credentials = self .make_credentials (lifetime = None )
584-
585701 id_creds = impersonated_credentials .IDTokenCredentials (
586702 credentials , target_audience = target_audience , include_email = True
587703 )
588- id_creds = id_creds .from_credentials (target_credentials = new_credentials )
704+ id_creds = id_creds .from_credentials (target_credentials = target_credentials )
589705 id_creds .refresh (request )
590706
707+ args = mock_authorizedsession_idtoken .call_args .args
708+
709+ assert args [2 ] == expected_url
710+
591711 assert id_creds .token == ID_TOKEN_DATA
592712 assert id_creds ._include_email is True
593- assert id_creds ._target_credentials is new_credentials
713+ assert id_creds ._target_credentials is target_credentials
594714
595715 def test_id_token_with_target_audience (
596716 self , mock_donor_credentials , mock_authorizedsession_idtoken
0 commit comments