mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-03 00:31:50 +00:00
Add tests for ExecutionRequests decoding errors (#6832)
N/A Cover all error cases for decoding JsonExecutionRequests
This commit is contained in:
@@ -991,3 +991,154 @@ impl TryFrom<JsonClientVersionV1> for ClientVersionV1 {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use ssz::Encode;
|
||||
use types::{
|
||||
ConsolidationRequest, DepositRequest, MainnetEthSpec, PublicKeyBytes, RequestType,
|
||||
SignatureBytes, WithdrawalRequest,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
|
||||
fn create_request_string<T: Encode>(prefix: u8, request_bytes: &T) -> String {
|
||||
format!(
|
||||
"0x{:02x}{}",
|
||||
prefix,
|
||||
hex::encode(request_bytes.as_ssz_bytes())
|
||||
)
|
||||
}
|
||||
|
||||
/// Tests all error conditions except ssz decoding errors
|
||||
///
|
||||
/// ***
|
||||
/// Elements of the list MUST be ordered by request_type in ascending order.
|
||||
/// Elements with empty request_data MUST be excluded from the list.
|
||||
/// If any element is out of order, has a length of 1-byte or shorter,
|
||||
/// or more than one element has the same type byte, client software MUST return -32602: Invalid params error.
|
||||
/// ***
|
||||
#[test]
|
||||
fn test_invalid_execution_requests() {
|
||||
let deposit_request = DepositRequest {
|
||||
pubkey: PublicKeyBytes::empty(),
|
||||
withdrawal_credentials: Hash256::random(),
|
||||
amount: 32,
|
||||
signature: SignatureBytes::empty(),
|
||||
index: 0,
|
||||
};
|
||||
|
||||
let consolidation_request = ConsolidationRequest {
|
||||
source_address: Address::random(),
|
||||
source_pubkey: PublicKeyBytes::empty(),
|
||||
target_pubkey: PublicKeyBytes::empty(),
|
||||
};
|
||||
|
||||
let withdrawal_request = WithdrawalRequest {
|
||||
amount: 32,
|
||||
source_address: Address::random(),
|
||||
validator_pubkey: PublicKeyBytes::empty(),
|
||||
};
|
||||
|
||||
// First check a valid request with all requests
|
||||
assert!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
|
||||
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
|
||||
]))
|
||||
.is_ok()
|
||||
);
|
||||
|
||||
// Single requests
|
||||
assert!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
]))
|
||||
.is_ok()
|
||||
);
|
||||
|
||||
assert!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
|
||||
]))
|
||||
.is_ok()
|
||||
);
|
||||
|
||||
assert!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
|
||||
]))
|
||||
.is_ok()
|
||||
);
|
||||
|
||||
// Out of order
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::InvalidOrdering
|
||||
));
|
||||
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
|
||||
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::InvalidOrdering
|
||||
));
|
||||
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::InvalidOrdering
|
||||
));
|
||||
|
||||
// Multiple requests of same type
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::InvalidOrdering
|
||||
));
|
||||
|
||||
// Invalid prefix
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(42, &deposit_request),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::InvalidPrefix(42)
|
||||
));
|
||||
|
||||
// Prefix followed by no data
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
create_request_string(
|
||||
RequestType::Consolidation.to_u8(),
|
||||
&Vec::<ConsolidationRequest>::new()
|
||||
),
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::EmptyRequest(1)
|
||||
));
|
||||
// Empty request
|
||||
assert!(matches!(
|
||||
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
|
||||
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
|
||||
"0x".to_string()
|
||||
]))
|
||||
.unwrap_err(),
|
||||
RequestsError::EmptyRequest(1)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user