@@ -3,7 +3,8 @@ use crate::compute::{
3
3
errors:: ReplicateStatusCause ,
4
4
utils:: env_utils:: { TeeSessionEnvironmentVariable , get_env_var_or_error} ,
5
5
} ;
6
- use reqwest:: { Error , blocking:: Client , header:: AUTHORIZATION } ;
6
+ use log:: error;
7
+ use reqwest:: { blocking:: Client , header:: AUTHORIZATION } ;
7
8
use serde:: Serialize ;
8
9
9
10
/// Represents payload that can be sent to the worker API to report the outcome of the
@@ -137,19 +138,32 @@ impl WorkerApiClient {
137
138
authorization : & str ,
138
139
chain_task_id : & str ,
139
140
exit_cause : & ExitMessage ,
140
- ) -> Result < ( ) , Error > {
141
+ ) -> Result < ( ) , ReplicateStatusCause > {
141
142
let url = format ! ( "{}/compute/post/{}/exit" , self . base_url, chain_task_id) ;
142
- let response = self
143
+ match self
143
144
. client
144
145
. post ( & url)
145
146
. header ( AUTHORIZATION , authorization)
146
147
. json ( exit_cause)
147
- . send ( ) ?;
148
-
149
- if response. status ( ) . is_success ( ) {
150
- Ok ( ( ) )
151
- } else {
152
- Err ( response. error_for_status ( ) . unwrap_err ( ) )
148
+ . send ( )
149
+ {
150
+ Ok ( response) => {
151
+ if response. status ( ) . is_success ( ) {
152
+ Ok ( ( ) )
153
+ } else {
154
+ let status = response. status ( ) ;
155
+ let body = response. text ( ) . unwrap_or_default ( ) ;
156
+ error ! (
157
+ "Failed to send exit cause to worker: [status:{:?}, body:{:#?}]" ,
158
+ status, body
159
+ ) ;
160
+ Err ( ReplicateStatusCause :: PostComputeFailedUnknownIssue )
161
+ }
162
+ }
163
+ Err ( e) => {
164
+ error ! ( "An error occured while sending exit cause to worker: {}" , e) ;
165
+ Err ( ReplicateStatusCause :: PostComputeFailedUnknownIssue )
166
+ }
153
167
}
154
168
}
155
169
@@ -198,19 +212,35 @@ impl WorkerApiClient {
198
212
authorization : & str ,
199
213
chain_task_id : & str ,
200
214
computed_file : & ComputedFile ,
201
- ) -> Result < ( ) , Error > {
215
+ ) -> Result < ( ) , ReplicateStatusCause > {
202
216
let url = format ! ( "{}/compute/post/{}/computed" , self . base_url, chain_task_id) ;
203
- let response = self
217
+ match self
204
218
. client
205
219
. post ( & url)
206
220
. header ( AUTHORIZATION , authorization)
207
221
. json ( computed_file)
208
- . send ( ) ?;
209
-
210
- if response. status ( ) . is_success ( ) {
211
- Ok ( ( ) )
212
- } else {
213
- Err ( response. error_for_status ( ) . unwrap_err ( ) )
222
+ . send ( )
223
+ {
224
+ Ok ( response) => {
225
+ if response. status ( ) . is_success ( ) {
226
+ Ok ( ( ) )
227
+ } else {
228
+ let status = response. status ( ) ;
229
+ let body = response. text ( ) . unwrap_or_default ( ) ;
230
+ error ! (
231
+ "Failed to send computed file to worker: [status:{:?}, body:{:#?}]" ,
232
+ status, body
233
+ ) ;
234
+ Err ( ReplicateStatusCause :: PostComputeSendComputedFileFailed )
235
+ }
236
+ }
237
+ Err ( e) => {
238
+ error ! (
239
+ "An error occured while sending computed file to worker: {}" ,
240
+ e
241
+ ) ;
242
+ Err ( ReplicateStatusCause :: PostComputeSendComputedFileFailed )
243
+ }
214
244
}
215
245
}
216
246
}
@@ -219,13 +249,19 @@ impl WorkerApiClient {
219
249
mod tests {
220
250
use super :: * ;
221
251
use crate :: compute:: utils:: env_utils:: TeeSessionEnvironmentVariable :: * ;
252
+ use logtest:: Logger ;
253
+ use once_cell:: sync:: Lazy ;
222
254
use serde_json:: { json, to_string} ;
255
+ use serial_test:: serial;
256
+ use std:: sync:: Mutex ;
223
257
use temp_env:: with_vars;
224
258
use wiremock:: {
225
259
Mock , MockServer , ResponseTemplate ,
226
260
matchers:: { body_json, header, method, path} ,
227
261
} ;
228
262
263
+ static TEST_LOGGER : Lazy < Mutex < Logger > > = Lazy :: new ( || Mutex :: new ( Logger :: start ( ) ) ) ;
264
+
229
265
const CHALLENGE : & str = "challenge" ;
230
266
const CHAIN_TASK_ID : & str = "0x123456789abcdef" ;
231
267
@@ -313,7 +349,12 @@ mod tests {
313
349
}
314
350
315
351
#[ tokio:: test]
352
+ #[ serial]
316
353
async fn should_not_send_exit_cause ( ) {
354
+ {
355
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
356
+ while logger. pop ( ) . is_some ( ) { }
357
+ }
317
358
let mock_server = MockServer :: start ( ) . await ;
318
359
let server_url = mock_server. uri ( ) ;
319
360
@@ -340,8 +381,22 @@ mod tests {
340
381
assert ! ( result. is_err( ) ) ;
341
382
342
383
if let Err ( error) = result {
343
- assert_eq ! ( error. status( ) . unwrap( ) , 404 ) ;
384
+ assert_eq ! (
385
+ error,
386
+ ReplicateStatusCause :: PostComputeFailedUnknownIssue ,
387
+ "Expected PostComputeFailedUnknownIssue, got: {:?}" ,
388
+ error
389
+ ) ;
344
390
}
391
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
392
+ let mut found = false ;
393
+ while let Some ( rec) = logger. pop ( ) {
394
+ if rec. args ( ) . contains ( "status:404" ) {
395
+ found = true ;
396
+ break ;
397
+ }
398
+ }
399
+ assert ! ( found, "Expected log to contain HTTP 404 status" ) ;
345
400
}
346
401
// endregion
347
402
@@ -381,7 +436,12 @@ mod tests {
381
436
}
382
437
383
438
#[ tokio:: test]
439
+ #[ serial]
384
440
async fn should_fail_send_computed_file_on_server_error ( ) {
441
+ {
442
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
443
+ while logger. pop ( ) . is_some ( ) { }
444
+ }
385
445
let mock_server = MockServer :: start ( ) . await ;
386
446
let server_uri = mock_server. uri ( ) ;
387
447
@@ -412,12 +472,31 @@ mod tests {
412
472
413
473
assert ! ( result. is_err( ) ) ;
414
474
if let Err ( error) = result {
415
- assert_eq ! ( error. status( ) . unwrap( ) , 500 ) ;
475
+ assert_eq ! (
476
+ error,
477
+ ReplicateStatusCause :: PostComputeSendComputedFileFailed ,
478
+ "Expected PostComputeSendComputedFileFailed, got: {:?}" ,
479
+ error
480
+ ) ;
481
+ }
482
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
483
+ let mut found = false ;
484
+ while let Some ( rec) = logger. pop ( ) {
485
+ if rec. args ( ) . contains ( "status:500" ) {
486
+ found = true ;
487
+ break ;
488
+ }
416
489
}
490
+ assert ! ( found, "Expected log to contain HTTP 500 status" ) ;
417
491
}
418
492
419
493
#[ tokio:: test]
494
+ #[ serial]
420
495
async fn should_handle_invalid_chain_task_id_in_url ( ) {
496
+ {
497
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
498
+ while logger. pop ( ) . is_some ( ) { }
499
+ }
421
500
let mock_server = MockServer :: start ( ) . await ;
422
501
let server_uri = mock_server. uri ( ) ;
423
502
@@ -436,8 +515,22 @@ mod tests {
436
515
437
516
assert ! ( result. is_err( ) , "Should fail with invalid chain task ID" ) ;
438
517
if let Err ( error) = result {
439
- assert_eq ! ( error. status( ) . unwrap( ) , 404 ) ;
518
+ assert_eq ! (
519
+ error,
520
+ ReplicateStatusCause :: PostComputeSendComputedFileFailed ,
521
+ "Expected PostComputeSendComputedFileFailed, got: {:?}" ,
522
+ error
523
+ ) ;
524
+ }
525
+ let mut logger = TEST_LOGGER . lock ( ) . unwrap ( ) ;
526
+ let mut found = false ;
527
+ while let Some ( rec) = logger. pop ( ) {
528
+ if rec. args ( ) . contains ( "status:404" ) {
529
+ found = true ;
530
+ break ;
531
+ }
440
532
}
533
+ assert ! ( found, "Expected log to contain HTTP 404 status" ) ;
441
534
}
442
535
443
536
#[ tokio:: test]
0 commit comments