use ciborium::value::Value;
use tenuo::warrant::Warrant;
const VALID_ED25519_PUBKEY: [u8; 32] = [
0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b, 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a,
0x0e, 0xe1, 0x72, 0xf3, 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07, 0x51, 0x1a,
];
#[test]
fn test_unknown_warrant_type_fails_deserialization() {
let map = vec![
(Value::Integer(0.into()), Value::Integer(1.into())), (Value::Integer(1.into()), Value::Bytes(vec![0u8; 16])), (Value::Integer(2.into()), Value::Integer(99.into())), (Value::Integer(3.into()), Value::Map(vec![])), (
Value::Integer(4.into()),
Value::Array(vec![Value::Integer(1.into()), Value::Bytes(vec![0u8; 32])]),
), (
Value::Integer(5.into()),
Value::Array(vec![Value::Integer(1.into()), Value::Bytes(vec![0u8; 32])]),
), (Value::Integer(6.into()), Value::Integer(0.into())), (Value::Integer(7.into()), Value::Integer(0.into())), (Value::Integer(8.into()), Value::Integer(0.into())), ];
let payload = Value::Map(map);
let mut payload_bytes = Vec::new();
ciborium::ser::into_writer(&payload, &mut payload_bytes).unwrap();
let sig_bytes = vec![0u8; 64];
let env_ver = Value::Integer(1.into());
let payload_val = Value::Bytes(payload_bytes);
let sig_val = Value::Array(vec![Value::Integer(1.into()), Value::Bytes(sig_bytes)]);
let envelope = Value::Array(vec![env_ver, payload_val, sig_val]);
let mut envelope_bytes = Vec::new();
ciborium::ser::into_writer(&envelope, &mut envelope_bytes).unwrap();
let result: Result<Warrant, _> = ciborium::de::from_reader(&envelope_bytes[..]);
assert!(result.is_err());
let err = result.err().unwrap().to_string();
println!("Error: {}", err);
assert!(
err.contains("variant")
|| err.contains("unknown")
|| err.contains("invalid value")
|| err.contains("invalid warrant type")
);
}
#[test]
fn test_unknown_payload_field_fails_deserialization() {
let map = vec![
(Value::Integer(0.into()), Value::Integer(1.into())), (Value::Integer(1.into()), Value::Bytes(vec![0u8; 16])), (Value::Integer(2.into()), Value::Integer(0.into())), (Value::Integer(3.into()), Value::Map(vec![])), (
Value::Integer(4.into()),
Value::Array(vec![
Value::Integer(1.into()),
Value::Bytes(VALID_ED25519_PUBKEY.to_vec()),
]),
), (
Value::Integer(5.into()),
Value::Array(vec![
Value::Integer(1.into()),
Value::Bytes(VALID_ED25519_PUBKEY.to_vec()),
]),
), (Value::Integer(6.into()), Value::Integer(0.into())), (Value::Integer(7.into()), Value::Integer(0.into())), (Value::Integer(8.into()), Value::Integer(0.into())), (
Value::Integer(99.into()),
Value::Text("FutureData".to_string()),
),
];
let payload = Value::Map(map);
let mut payload_bytes = Vec::new();
ciborium::ser::into_writer(&payload, &mut payload_bytes).unwrap();
let sig_bytes = vec![0u8; 64];
let envelope = Value::Array(vec![
Value::Integer(1.into()),
Value::Bytes(payload_bytes),
Value::Array(vec![Value::Integer(1.into()), Value::Bytes(sig_bytes)]),
]);
let mut envelope_bytes = Vec::new();
ciborium::ser::into_writer(&envelope, &mut envelope_bytes).unwrap();
let result: Result<Warrant, _> = ciborium::de::from_reader(&envelope_bytes[..]);
assert!(result.is_err());
let err = result.err().unwrap().to_string();
println!("Error: {}", err);
assert!(err.contains("unknown payload field key 99"));
}