@@ -14,6 +14,24 @@ import 'package:test/test.dart';
1414
1515import 'test_utils.dart' ;
1616
17+ http.Response ? _mockMetadataResponse (http.Request request) {
18+ if (request.url.host == 'metadata.google.internal' ) {
19+ if (request.url.path.contains ('universe_domain' )) {
20+ return http.Response (
21+ 'googleapis.com' ,
22+ 200 ,
23+ headers: {'Metadata-Flavor' : 'Google' },
24+ );
25+ }
26+ return http.Response (
27+ 'test@test.iam.gserviceaccount.com' ,
28+ 200 ,
29+ headers: {'Metadata-Flavor' : 'Google' },
30+ );
31+ }
32+ return null ;
33+ }
34+
1735void main () {
1836 final dataToSign = utf8.encode ('data to sign' );
1937
@@ -58,40 +76,38 @@ void main() {
5876
5977 test ('sign with impersonated client uses IAM API' , () async {
6078 var requestCount = 0 ;
61- final baseClient = mockClient (
62- expectAsync1 ((request) async {
63- requestCount++ ;
64-
65- if (requestCount == 1 ) {
66- // Initial generateAccessToken for impersonated client
67- final expireTime = DateTime .now ().toUtc ().add (
68- const Duration (hours: 1 ),
69- );
70- return http.Response (
71- jsonEncode ({
72- 'accessToken' : 'impersonated-token' ,
73- 'expireTime' : expireTime.toIso8601String (),
74- }),
75- 200 ,
76- headers: jsonContentType,
77- );
78- } else {
79- // signBlob request via ImpersonatedAuthClient.sign()
80- expect (request.method, equals ('POST' ));
81- expect (request.url.toString (), contains (':signBlob' ));
82-
83- return http.Response (
84- jsonEncode ({
85- 'signedBlob' : base64Encode ([1 , 2 , 3 , 4 , 5 ]),
86- 'keyId' : 'key-id' ,
87- }),
88- 200 ,
89- headers: jsonContentType,
90- );
91- }
92- }, count: 2 ),
93- expectClose: false ,
94- );
79+ final baseClient = mockClient ((request) async {
80+ final metadataResponse = _mockMetadataResponse (request);
81+ if (metadataResponse != null ) return metadataResponse;
82+
83+ requestCount++ ;
84+
85+ if (requestCount == 1 ) {
86+ // Initial generateAccessToken for impersonated client
87+ final expireTime = DateTime .now ().toUtc ().add (const Duration (hours: 1 ));
88+ return http.Response (
89+ jsonEncode ({
90+ 'accessToken' : 'impersonated-token' ,
91+ 'expireTime' : expireTime.toIso8601String (),
92+ }),
93+ 200 ,
94+ headers: jsonContentType,
95+ );
96+ } else {
97+ // signBlob request via ImpersonatedAuthClient.sign()
98+ expect (request.method, equals ('POST' ));
99+ expect (request.url.toString (), contains (':signBlob' ));
100+
101+ return http.Response (
102+ jsonEncode ({
103+ 'signedBlob' : base64Encode ([1 , 2 , 3 , 4 , 5 ]),
104+ 'keyId' : 'key-id' ,
105+ }),
106+ 200 ,
107+ headers: jsonContentType,
108+ );
109+ }
110+ }, expectClose: false );
95111
96112 final sourceCredentials = AccessCredentials (
97113 AccessToken (
@@ -120,40 +136,35 @@ void main() {
120136 test ('explicitly calling extension on impersonated client delegates to '
121137 'instance method' , () async {
122138 var requestCount = 0 ;
123- final baseClient = mockClient (
124- expectAsync1 ((request) async {
125- requestCount++ ;
126-
127- if (requestCount == 1 ) {
128- // Initial generateAccessToken for impersonated client
129- final expireTime = DateTime .now ().toUtc ().add (
130- const Duration (hours: 1 ),
131- );
132- return http.Response (
133- jsonEncode ({
134- 'accessToken' : 'impersonated-token' ,
135- 'expireTime' : expireTime.toIso8601String (),
136- }),
137- 200 ,
138- headers: jsonContentType,
139- );
140- } else {
141- // signBlob request via ImpersonatedAuthClient.sign()
142- expect (request.method, equals ('POST' ));
143- expect (request.url.toString (), contains (':signBlob' ));
144-
145- return http.Response (
146- jsonEncode ({
147- 'signedBlob' : base64Encode ([5 , 6 , 7 , 8 ]),
148- 'keyId' : 'key-id' ,
149- }),
150- 200 ,
151- headers: jsonContentType,
152- );
153- }
154- }, count: 2 ),
155- expectClose: false ,
156- );
139+ final baseClient = mockClient ((request) async {
140+ requestCount++ ;
141+
142+ if (requestCount == 1 ) {
143+ // Initial generateAccessToken for impersonated client
144+ final expireTime = DateTime .now ().toUtc ().add (const Duration (hours: 1 ));
145+ return http.Response (
146+ jsonEncode ({
147+ 'accessToken' : 'impersonated-token' ,
148+ 'expireTime' : expireTime.toIso8601String (),
149+ }),
150+ 200 ,
151+ headers: jsonContentType,
152+ );
153+ } else {
154+ // signBlob request via ImpersonatedAuthClient.sign()
155+ expect (request.method, equals ('POST' ));
156+ expect (request.url.toString (), contains (':signBlob' ));
157+
158+ return http.Response (
159+ jsonEncode ({
160+ 'signedBlob' : base64Encode ([5 , 6 , 7 , 8 ]),
161+ 'keyId' : 'key-id' ,
162+ }),
163+ 200 ,
164+ headers: jsonContentType,
165+ );
166+ }
167+ }, expectClose: false );
157168
158169 final sourceCredentials = AccessCredentials (
159170 AccessToken (
@@ -185,26 +196,26 @@ void main() {
185196 });
186197
187198 test ('sign without service account credentials uses IAM API' , () async {
188- final baseClient = mockClient (
189- expectAsync1 (( request) async {
190- // IAM signBlob request
191- expect (request.method, equals ( 'POST' ));
192- expect (request.url. toString (), contains ( ': signBlob' ));
193-
194- final body = jsonDecode (request.body) as Map < String , dynamic > ;
195- expect (body[ 'payload' ], equals ( base64Encode (dataToSign)));
196-
197- return http. Response (
198- jsonEncode ({
199- 'signedBlob' : base64Encode ([ 10 , 20 , 30 ]),
200- 'keyId' : 'key-id' ,
201- } ),
202- 200 ,
203- headers : jsonContentType ,
204- );
205- }) ,
206- expectClose : false ,
207- );
199+ final baseClient = mockClient ((request) async {
200+ final metadataResponse = _mockMetadataResponse ( request);
201+ if (metadataResponse != null ) return metadataResponse;
202+
203+ // IAM signBlob request
204+ expect (request.method, equals ( 'POST' ));
205+ expect (request.url. toString (), contains ( ':signBlob' )) ;
206+
207+ final body = jsonDecode (request.body) as Map < String , dynamic >;
208+ expect (body[ 'payload' ], equals ( base64Encode (dataToSign)));
209+
210+ return http. Response (
211+ jsonEncode ({
212+ 'signedBlob' : base64Encode ([ 10 , 20 , 30 ] ),
213+ 'keyId' : 'key-id' ,
214+ }) ,
215+ 200 ,
216+ headers : jsonContentType ,
217+ );
218+ }, expectClose : false );
208219
209220 final credentials = AccessCredentials (
210221 AccessToken (
@@ -225,22 +236,22 @@ void main() {
225236 }, testOn: 'vm' );
226237
227238 test ('sign with custom endpoint extracts universe domain' , () async {
228- final baseClient = mockClient (
229- expectAsync1 (( request) async {
230- // IAM signBlob request - verify custom universe domain is used
231- expect (request.url.host, equals ( 'iamcredentials.example.com' ));
232-
233- return http. Response (
234- jsonEncode ({
235- 'signedBlob' : base64Encode ([ 5 , 6 , 7 ]),
236- 'keyId' : 'key-id' ,
237- } ),
238- 200 ,
239- headers : jsonContentType ,
240- );
241- }) ,
242- expectClose : false ,
243- );
239+ final baseClient = mockClient ((request) async {
240+ final metadataResponse = _mockMetadataResponse ( request);
241+ if (metadataResponse != null ) return metadataResponse;
242+
243+ // IAM signBlob request - verify custom universe domain is used
244+ expect (request.url.host, equals ( 'iamcredentials.example.com' ));
245+
246+ return http. Response (
247+ jsonEncode ({
248+ 'signedBlob' : base64Encode ([ 5 , 6 , 7 ] ),
249+ 'keyId' : 'key-id' ,
250+ }) ,
251+ 200 ,
252+ headers : jsonContentType ,
253+ );
254+ }, expectClose : false );
244255
245256 final credentials = AccessCredentials (
246257 AccessToken (
0 commit comments