Skip to content

Commit 8130b3b

Browse files
apollo_storage: add error handling tests for storage reader server
1 parent 8182a63 commit 8130b3b

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

crates/apollo_storage/src/storage_reader_server_test.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ impl StorageReaderServerHandler<TestRequest, TestResponse> for TestHandler {
4545
}
4646
}
4747

48+
#[derive(Clone)]
49+
struct ErrorHandler;
50+
51+
#[async_trait]
52+
impl StorageReaderServerHandler<TestRequest, TestResponse> for ErrorHandler {
53+
async fn handle_request(
54+
_storage_reader: &StorageReader,
55+
_request: TestRequest,
56+
) -> Result<TestResponse, StorageError> {
57+
Err(StorageError::DBInconsistency { msg: "Test error".to_string() })
58+
}
59+
}
60+
4861
#[tokio::test]
4962
async fn test_endpoint_successful_query() {
5063
let ((reader, mut writer), _temp_dir) = get_test_storage();
@@ -123,6 +136,66 @@ async fn test_endpoint_query_nonexistent_block() {
123136
assert!(!test_response.found);
124137
}
125138

139+
#[tokio::test]
140+
async fn test_endpoint_handler_error() {
141+
let ((reader, _writer), _temp_dir) = get_test_storage();
142+
143+
let socket = SocketAddr::from((TEST_SERVER_IP, 8083));
144+
let config = ServerConfig::new(socket, true);
145+
146+
let server =
147+
StorageReaderServer::<ErrorHandler, TestRequest, TestResponse>::new(reader.clone(), config);
148+
let app = server.app();
149+
150+
let request = TestRequest { block_number: 0 };
151+
let response = app
152+
.oneshot(
153+
Request::builder()
154+
.method("POST")
155+
.uri("/storage/query")
156+
.header("content-type", "application/json")
157+
.body(Body::from(serde_json::to_string(&request).unwrap()))
158+
.unwrap(),
159+
)
160+
.await
161+
.unwrap();
162+
163+
assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR);
164+
165+
let body = to_bytes(response).await;
166+
let error_message = String::from_utf8(body.to_vec()).unwrap();
167+
assert!(error_message.contains("Storage error"));
168+
assert!(error_message.contains("Test error"));
169+
}
170+
171+
#[tokio::test]
172+
async fn test_endpoint_invalid_json() {
173+
let ((reader, _writer), _temp_dir) = get_test_storage();
174+
175+
let socket = SocketAddr::from((TEST_SERVER_IP, 8084));
176+
let config = ServerConfig::new(socket, true);
177+
178+
let server =
179+
StorageReaderServer::<TestHandler, TestRequest, TestResponse>::new(reader.clone(), config);
180+
let app = server.app();
181+
182+
// Test with invalid JSON
183+
let response = app
184+
.oneshot(
185+
Request::builder()
186+
.method("POST")
187+
.uri("/storage/query")
188+
.header("content-type", "application/json")
189+
.body(Body::from("invalid json"))
190+
.unwrap(),
191+
)
192+
.await
193+
.unwrap();
194+
195+
// Should return error status code
196+
assert!(!response.status().is_success());
197+
}
198+
126199
// Helper function to convert response body to bytes
127200
async fn to_bytes(res: Response) -> Bytes {
128201
res.into_body().collect().await.unwrap().to_bytes()

0 commit comments

Comments
 (0)