Skip to content

Commit 0495650

Browse files
committed
Merge branch 'main' into feature/add-sconification
2 parents 98f6cb7 + 3d69879 commit 0495650

File tree

4 files changed

+182
-24
lines changed

4 files changed

+182
-24
lines changed

Cargo.lock

Lines changed: 62 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ walkdir = "2.5.0"
1818
zip = "4.0.0"
1919

2020
[dev-dependencies]
21+
logtest = "2.0.0"
2122
mockall = "0.13.1"
23+
once_cell = "1.21.3"
24+
serial_test = "3.2.0"
2225
temp-env = "0.3.6"
2326
tempfile = "3.20.0"
2427
tokio = "1.45.0"

src/api/worker_api.rs

Lines changed: 113 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use crate::compute::{
33
errors::ReplicateStatusCause,
44
utils::env_utils::{TeeSessionEnvironmentVariable, get_env_var_or_error},
55
};
6-
use reqwest::{Error, blocking::Client, header::AUTHORIZATION};
6+
use log::error;
7+
use reqwest::{blocking::Client, header::AUTHORIZATION};
78
use serde::Serialize;
89

910
/// Represents payload that can be sent to the worker API to report the outcome of the
@@ -137,19 +138,32 @@ impl WorkerApiClient {
137138
authorization: &str,
138139
chain_task_id: &str,
139140
exit_cause: &ExitMessage,
140-
) -> Result<(), Error> {
141+
) -> Result<(), ReplicateStatusCause> {
141142
let url = format!("{}/compute/post/{}/exit", self.base_url, chain_task_id);
142-
let response = self
143+
match self
143144
.client
144145
.post(&url)
145146
.header(AUTHORIZATION, authorization)
146147
.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+
}
153167
}
154168
}
155169

@@ -198,19 +212,35 @@ impl WorkerApiClient {
198212
authorization: &str,
199213
chain_task_id: &str,
200214
computed_file: &ComputedFile,
201-
) -> Result<(), Error> {
215+
) -> Result<(), ReplicateStatusCause> {
202216
let url = format!("{}/compute/post/{}/computed", self.base_url, chain_task_id);
203-
let response = self
217+
match self
204218
.client
205219
.post(&url)
206220
.header(AUTHORIZATION, authorization)
207221
.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+
}
214244
}
215245
}
216246
}
@@ -219,13 +249,19 @@ impl WorkerApiClient {
219249
mod tests {
220250
use super::*;
221251
use crate::compute::utils::env_utils::TeeSessionEnvironmentVariable::*;
252+
use logtest::Logger;
253+
use once_cell::sync::Lazy;
222254
use serde_json::{json, to_string};
255+
use serial_test::serial;
256+
use std::sync::Mutex;
223257
use temp_env::with_vars;
224258
use wiremock::{
225259
Mock, MockServer, ResponseTemplate,
226260
matchers::{body_json, header, method, path},
227261
};
228262

263+
static TEST_LOGGER: Lazy<Mutex<Logger>> = Lazy::new(|| Mutex::new(Logger::start()));
264+
229265
const CHALLENGE: &str = "challenge";
230266
const CHAIN_TASK_ID: &str = "0x123456789abcdef";
231267

@@ -313,7 +349,12 @@ mod tests {
313349
}
314350

315351
#[tokio::test]
352+
#[serial]
316353
async fn should_not_send_exit_cause() {
354+
{
355+
let mut logger = TEST_LOGGER.lock().unwrap();
356+
while logger.pop().is_some() {}
357+
}
317358
let mock_server = MockServer::start().await;
318359
let server_url = mock_server.uri();
319360

@@ -340,8 +381,22 @@ mod tests {
340381
assert!(result.is_err());
341382

342383
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+
);
344390
}
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");
345400
}
346401
// endregion
347402

@@ -381,7 +436,12 @@ mod tests {
381436
}
382437

383438
#[tokio::test]
439+
#[serial]
384440
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+
}
385445
let mock_server = MockServer::start().await;
386446
let server_uri = mock_server.uri();
387447

@@ -412,12 +472,31 @@ mod tests {
412472

413473
assert!(result.is_err());
414474
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+
}
416489
}
490+
assert!(found, "Expected log to contain HTTP 500 status");
417491
}
418492

419493
#[tokio::test]
494+
#[serial]
420495
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+
}
421500
let mock_server = MockServer::start().await;
422501
let server_uri = mock_server.uri();
423502

@@ -436,8 +515,22 @@ mod tests {
436515

437516
assert!(result.is_err(), "Should fail with invalid chain task ID");
438517
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+
}
440532
}
533+
assert!(found, "Expected log to contain HTTP 404 status");
441534
}
442535

443536
#[tokio::test]

src/compute/app_runner.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub trait PostComputeRunnerInterface {
2424
authorization: &str,
2525
chain_task_id: &str,
2626
exit_message: &ExitMessage,
27-
) -> Result<(), reqwest::Error>;
27+
) -> Result<(), ReplicateStatusCause>;
2828
fn send_computed_file(&self, computed_file: &ComputedFile) -> Result<(), ReplicateStatusCause>;
2929
}
3030

@@ -91,7 +91,7 @@ impl PostComputeRunnerInterface for DefaultPostComputeRunner {
9191
authorization: &str,
9292
chain_task_id: &str,
9393
exit_message: &ExitMessage,
94-
) -> Result<(), reqwest::Error> {
94+
) -> Result<(), ReplicateStatusCause> {
9595
self.worker_api_client
9696
.send_exit_cause_for_post_compute_stage(authorization, chain_task_id, exit_message)
9797
}
@@ -313,11 +313,11 @@ mod tests {
313313
_authorization: &str,
314314
_chain_task_id: &str,
315315
_exit_message: &ExitMessage,
316-
) -> Result<(), reqwest::Error> {
316+
) -> Result<(), ReplicateStatusCause> {
317317
if self.send_exit_cause_success {
318318
Ok(())
319319
} else {
320-
Err(reqwest::blocking::get("invalid_url").unwrap_err())
320+
Err(ReplicateStatusCause::PostComputeFailedUnknownIssue)
321321
}
322322
}
323323

0 commit comments

Comments
 (0)