Skip to content

Commit 657967a

Browse files
hyperpolymathclaude
andcommitted
fix(wharf): sweep .expect("TODO: handle error") — 91 sites cleared
Policy breakdown: - 3 production JSON handlers (yacht-agent): expect with invariant messages - 4 byte-slice operations (crypto): expect with invariant (fixed-size slices) - 2 path operations (xtask): converted to proper Result error handling - 82 test functions across 7 crates: converted to .unwrap() convention Tests: 49 passed; 0 failed Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 10d3a27 commit 657967a

9 files changed

Lines changed: 101 additions & 91 deletions

File tree

bin/yacht-agent/src/main.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ async fn mooring_init(
877877
status: yacht_status,
878878
};
879879

880-
Json(serde_json::to_value(response).expect("TODO: handle error"))
880+
Json(serde_json::to_value(response).expect("invariant: MooringInitResponse must be JSON-serializable (in-memory struct)"))
881881
}
882882

883883
/// Verify a layer against expected manifest
@@ -980,7 +980,7 @@ async fn mooring_verify(
980980
}
981981
};
982982

983-
Json(serde_json::to_value(response).expect("TODO: handle error"))
983+
Json(serde_json::to_value(response).expect("invariant: VerifyResponse must be JSON-serializable (in-memory struct)"))
984984
}
985985

986986
/// Commit transferred layers
@@ -1030,7 +1030,7 @@ async fn mooring_commit(
10301030
error: None,
10311031
};
10321032

1033-
Json(serde_json::to_value(response).expect("TODO: handle error"))
1033+
Json(serde_json::to_value(response).expect("invariant: CommitResponse must be JSON-serializable (in-memory struct)"))
10341034
}
10351035

10361036
// =============================================================================
@@ -1348,10 +1348,10 @@ mod tests {
13481348
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
13491349
.await
13501350
.expect("Failed to bind test listener");
1351-
let addr = listener.local_addr().expect("TODO: handle error");
1351+
let addr = listener.local_addr().unwrap();
13521352

13531353
tokio::spawn(async move {
1354-
axum::serve(listener, app).await.expect("TODO: handle error");
1354+
axum::serve(listener, app).await.unwrap();
13551355
});
13561356

13571357
// Give the server a moment to start
@@ -1416,11 +1416,11 @@ mod tests {
14161416

14171417
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
14181418
.await
1419-
.expect("TODO: handle error");
1420-
let addr = listener.local_addr().expect("TODO: handle error");
1419+
.unwrap();
1420+
let addr = listener.local_addr().unwrap();
14211421

14221422
tokio::spawn(async move {
1423-
axum::serve(listener, app).await.expect("TODO: handle error");
1423+
axum::serve(listener, app).await.unwrap();
14241424
});
14251425

14261426
tokio::time::sleep(std::time::Duration::from_millis(50)).await;
@@ -1430,7 +1430,7 @@ mod tests {
14301430
.expect("health request failed");
14311431

14321432
assert!(resp.status().is_success());
1433-
assert_eq!(resp.text().await.expect("TODO: handle error"), "OK");
1433+
assert_eq!(resp.text().await.unwrap(), "OK");
14341434
}
14351435

14361436
/// Test that metrics endpoint returns real counters
@@ -1446,11 +1446,11 @@ mod tests {
14461446

14471447
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
14481448
.await
1449-
.expect("TODO: handle error");
1450-
let addr = listener.local_addr().expect("TODO: handle error");
1449+
.unwrap();
1450+
let addr = listener.local_addr().unwrap();
14511451

14521452
tokio::spawn(async move {
1453-
axum::serve(listener, app).await.expect("TODO: handle error");
1453+
axum::serve(listener, app).await.unwrap();
14541454
});
14551455

14561456
tokio::time::sleep(std::time::Duration::from_millis(50)).await;
@@ -1459,7 +1459,7 @@ mod tests {
14591459
.await
14601460
.expect("metrics request failed");
14611461

1462-
let body = resp.text().await.expect("TODO: handle error");
1462+
let body = resp.text().await.unwrap();
14631463
assert!(body.contains("yacht_queries_total{status=\"allowed\"} 42"));
14641464
assert!(body.contains("yacht_queries_total{status=\"blocked\"} 3"));
14651465
}
@@ -1478,11 +1478,11 @@ mod tests {
14781478

14791479
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
14801480
.await
1481-
.expect("TODO: handle error");
1482-
let addr = listener.local_addr().expect("TODO: handle error");
1481+
.unwrap();
1482+
let addr = listener.local_addr().unwrap();
14831483

14841484
tokio::spawn(async move {
1485-
axum::serve(listener, app).await.expect("TODO: handle error");
1485+
axum::serve(listener, app).await.unwrap();
14861486
});
14871487

14881488
tokio::time::sleep(std::time::Duration::from_millis(50)).await;
@@ -1491,7 +1491,7 @@ mod tests {
14911491
.await
14921492
.expect("stats request failed");
14931493

1494-
let body: serde_json::Value = resp.json().await.expect("TODO: handle error");
1494+
let body: serde_json::Value = resp.json().await.unwrap();
14951495
assert_eq!(body["queries"]["allowed"], 10);
14961496
assert_eq!(body["queries"]["blocked"], 5);
14971497
assert_eq!(body["queries"]["audited"], 2);

crates/wharf-core/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ mod tests {
459459
#[test]
460460
fn test_config_serialization() {
461461
let config = YachtAgentConfig::default();
462-
let toml_str = toml::to_string(&config).expect("TODO: handle error");
462+
let toml_str = toml::to_string(&config).unwrap();
463463
assert!(toml_str.contains("[db_proxy]"));
464464
assert!(toml_str.contains("protocol"));
465465
}

crates/wharf-core/src/crypto.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ pub fn deserialize_keypair_raw(data: &[u8]) -> Result<HybridKeypair, CryptoError
231231
}
232232

233233
// Verify version
234-
let version = u32::from_le_bytes(data[4..8].try_into().expect("TODO: handle error"));
234+
let version = u32::from_le_bytes(data[4..8].try_into().expect("invariant: fixed slice [4..8] is exactly 4 bytes"));
235235
if version != KEYPAIR_VERSION {
236236
return Err(CryptoError::SerializationError(
237237
format!("Unsupported keypair version: {} (expected {})", version, KEYPAIR_VERSION),
@@ -256,7 +256,7 @@ pub fn deserialize_keypair_raw(data: &[u8]) -> Result<HybridKeypair, CryptoError
256256
if data.len() < offset + 4 {
257257
return Err(CryptoError::SerializationError("Truncated ML-DSA-87 secret key length".to_string()));
258258
}
259-
let mldsa_sk_len = u32::from_le_bytes(data[offset..offset + 4].try_into().expect("TODO: handle error")) as usize;
259+
let mldsa_sk_len = u32::from_le_bytes(data[offset..offset + 4].try_into().expect("invariant: fixed slice [offset..offset+4] is exactly 4 bytes")) as usize;
260260
offset += 4;
261261

262262
if data.len() < offset + mldsa_sk_len {
@@ -269,7 +269,7 @@ pub fn deserialize_keypair_raw(data: &[u8]) -> Result<HybridKeypair, CryptoError
269269
if data.len() < offset + 4 {
270270
return Err(CryptoError::SerializationError("Truncated ML-DSA-87 public key length".to_string()));
271271
}
272-
let mldsa_pk_len = u32::from_le_bytes(data[offset..offset + 4].try_into().expect("TODO: handle error")) as usize;
272+
let mldsa_pk_len = u32::from_le_bytes(data[offset..offset + 4].try_into().expect("invariant: fixed slice [offset..offset+4] is exactly 4 bytes")) as usize;
273273
offset += 4;
274274

275275
if data.len() < offset + mldsa_pk_len {
@@ -344,7 +344,7 @@ pub fn deserialize_keypair(data: &[u8], password: &[u8]) -> Result<HybridKeypair
344344
}
345345

346346
// Verify version
347-
let version = u32::from_le_bytes(data[4..8].try_into().expect("TODO: handle error"));
347+
let version = u32::from_le_bytes(data[4..8].try_into().expect("invariant: fixed slice [4..8] is exactly 4 bytes"));
348348
if version != KEYPAIR_VERSION {
349349
return Err(CryptoError::SerializationError(
350350
format!("Unsupported keypair version: {}", version),
@@ -697,15 +697,15 @@ mod tests {
697697

698698
#[test]
699699
fn test_hybrid_keypair_generation() {
700-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
700+
let keypair = generate_hybrid_keypair().unwrap();
701701
let pubkey = hybrid_public_key(&keypair);
702702
assert!(!pubkey.ed448.is_empty());
703703
assert!(!pubkey.mldsa87.is_empty());
704704
}
705705

706706
#[test]
707707
fn test_hybrid_sign_verify() {
708-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
708+
let keypair = generate_hybrid_keypair().unwrap();
709709
let pubkey = hybrid_public_key(&keypair);
710710
let message = b"test message for hybrid signing";
711711

@@ -714,12 +714,12 @@ mod tests {
714714
assert!(!sig.mldsa87_sig.is_empty());
715715

716716
// Full hybrid verification should succeed
717-
verify_hybrid(&pubkey, message, &sig).expect("TODO: handle error");
717+
verify_hybrid(&pubkey, message, &sig).unwrap();
718718
}
719719

720720
#[test]
721721
fn test_hybrid_verify_wrong_message() {
722-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
722+
let keypair = generate_hybrid_keypair().unwrap();
723723
let pubkey = hybrid_public_key(&keypair);
724724

725725
let sig = sign_hybrid(&keypair, b"original message");
@@ -734,10 +734,10 @@ mod tests {
734734
let nonce = secure_random_bytes(24);
735735
let plaintext = b"secret message";
736736

737-
let ciphertext = encrypt_xchacha20(&key, &nonce, plaintext).expect("TODO: handle error");
737+
let ciphertext = encrypt_xchacha20(&key, &nonce, plaintext).unwrap();
738738
assert_ne!(&ciphertext, plaintext);
739739

740-
let decrypted = decrypt_xchacha20(&key, &nonce, &ciphertext).expect("TODO: handle error");
740+
let decrypted = decrypt_xchacha20(&key, &nonce, &ciphertext).unwrap();
741741
assert_eq!(&decrypted, plaintext);
742742
}
743743

@@ -747,7 +747,7 @@ mod tests {
747747
let wrong_key = secure_random_bytes(32);
748748
let nonce = secure_random_bytes(24);
749749

750-
let ciphertext = encrypt_xchacha20(&key, &nonce, b"secret").expect("TODO: handle error");
750+
let ciphertext = encrypt_xchacha20(&key, &nonce, b"secret").unwrap();
751751
assert!(decrypt_xchacha20(&wrong_key, &nonce, &ciphertext).is_err());
752752
}
753753

@@ -757,15 +757,15 @@ mod tests {
757757
let salt = b"optional salt";
758758
let info = b"context info";
759759

760-
let key1 = derive_key_hkdf_sha3_256(ikm, Some(salt), info).expect("TODO: handle error");
760+
let key1 = derive_key_hkdf_sha3_256(ikm, Some(salt), info).unwrap();
761761
assert_eq!(key1.len(), 32);
762762

763763
// Same inputs should produce same output
764-
let key2 = derive_key_hkdf_sha3_256(ikm, Some(salt), info).expect("TODO: handle error");
764+
let key2 = derive_key_hkdf_sha3_256(ikm, Some(salt), info).unwrap();
765765
assert_eq!(key1, key2);
766766

767767
// Different info should produce different output
768-
let key3 = derive_key_hkdf_sha3_256(ikm, Some(salt), b"different").expect("TODO: handle error");
768+
let key3 = derive_key_hkdf_sha3_256(ikm, Some(salt), b"different").unwrap();
769769
assert_ne!(key1, key3);
770770
}
771771

@@ -784,7 +784,7 @@ mod tests {
784784
mldsa87_sig: vec![4, 5, 6],
785785
};
786786
let json = serialize_signature(&sig);
787-
let deserialized = deserialize_signature(&json).expect("TODO: handle error");
787+
let deserialized = deserialize_signature(&json).unwrap();
788788
assert_eq!(deserialized.ed448_sig, sig.ed448_sig);
789789
assert_eq!(deserialized.mldsa87_sig, sig.mldsa87_sig);
790790
}
@@ -796,18 +796,18 @@ mod tests {
796796
mldsa87: vec![40, 50, 60],
797797
};
798798
let json = serialize_public_key(&pk);
799-
let deserialized = deserialize_public_key(&json).expect("TODO: handle error");
799+
let deserialized = deserialize_public_key(&json).unwrap();
800800
assert_eq!(deserialized.ed448, pk.ed448);
801801
assert_eq!(deserialized.mldsa87, pk.mldsa87);
802802
}
803803

804804
#[test]
805805
fn test_keypair_serialization_roundtrip() {
806-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
806+
let keypair = generate_hybrid_keypair().unwrap();
807807
let pubkey_before = hybrid_public_key(&keypair);
808808

809-
let data = serialize_keypair_raw(&keypair).expect("TODO: handle error");
810-
let restored = deserialize_keypair_raw(&data).expect("TODO: handle error");
809+
let data = serialize_keypair_raw(&keypair).unwrap();
810+
let restored = deserialize_keypair_raw(&data).unwrap();
811811
let pubkey_after = hybrid_public_key(&restored);
812812

813813
// Public keys must match
@@ -817,17 +817,17 @@ mod tests {
817817
// Sign with restored key, verify with original pubkey
818818
let msg = b"roundtrip test message";
819819
let sig = sign_hybrid(&restored, msg);
820-
verify_hybrid(&pubkey_before, msg, &sig).expect("TODO: handle error");
820+
verify_hybrid(&pubkey_before, msg, &sig).unwrap();
821821
}
822822

823823
#[test]
824824
fn test_keypair_encrypted_roundtrip() {
825-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
825+
let keypair = generate_hybrid_keypair().unwrap();
826826
let pubkey_before = hybrid_public_key(&keypair);
827827
let password = b"test-password-wharf";
828828

829-
let encrypted = serialize_keypair(&keypair, password).expect("TODO: handle error");
830-
let restored = deserialize_keypair(&encrypted, password).expect("TODO: handle error");
829+
let encrypted = serialize_keypair(&keypair, password).unwrap();
830+
let restored = deserialize_keypair(&encrypted, password).unwrap();
831831
let pubkey_after = hybrid_public_key(&restored);
832832

833833
assert_eq!(pubkey_before.ed448, pubkey_after.ed448);
@@ -836,21 +836,21 @@ mod tests {
836836
// Verify signing still works
837837
let msg = b"encrypted roundtrip";
838838
let sig = sign_hybrid(&restored, msg);
839-
verify_hybrid(&pubkey_before, msg, &sig).expect("TODO: handle error");
839+
verify_hybrid(&pubkey_before, msg, &sig).unwrap();
840840
}
841841

842842
#[test]
843843
fn test_keypair_wrong_password() {
844-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
845-
let encrypted = serialize_keypair(&keypair, b"correct").expect("TODO: handle error");
844+
let keypair = generate_hybrid_keypair().unwrap();
845+
let encrypted = serialize_keypair(&keypair, b"correct").unwrap();
846846

847847
// Wrong password should fail decryption
848848
assert!(deserialize_keypair(&encrypted, b"wrong").is_err());
849849
}
850850

851851
#[test]
852852
fn test_mldsa87_only_sign_verify() {
853-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
853+
let keypair = generate_hybrid_keypair().unwrap();
854854
let pubkey = hybrid_public_key(&keypair);
855855
let msg = b"mldsa87-only test message";
856856

@@ -860,20 +860,20 @@ mod tests {
860860
assert!(!sig.mldsa87_sig.is_empty());
861861

862862
// Verification with same scheme should succeed
863-
verify_with_scheme(&pubkey, msg, &sig, SignatureScheme::MlDsa87Only).expect("TODO: handle error");
863+
verify_with_scheme(&pubkey, msg, &sig, SignatureScheme::MlDsa87Only).unwrap();
864864
}
865865

866866
#[test]
867867
fn test_mldsa87_only_wrong_message() {
868-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
868+
let keypair = generate_hybrid_keypair().unwrap();
869869
let pubkey = hybrid_public_key(&keypair);
870870
let sig = sign_with_scheme(&keypair, b"original", SignatureScheme::MlDsa87Only);
871871
assert!(verify_with_scheme(&pubkey, b"tampered", &sig, SignatureScheme::MlDsa87Only).is_err());
872872
}
873873

874874
#[test]
875875
fn test_hybrid_scheme_sign_verify() {
876-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
876+
let keypair = generate_hybrid_keypair().unwrap();
877877
let pubkey = hybrid_public_key(&keypair);
878878
let msg = b"hybrid scheme test";
879879

@@ -882,7 +882,7 @@ mod tests {
882882
assert!(!sig.ed448_sig.is_empty());
883883
assert!(!sig.mldsa87_sig.is_empty());
884884

885-
verify_with_scheme(&pubkey, msg, &sig, SignatureScheme::Hybrid).expect("TODO: handle error");
885+
verify_with_scheme(&pubkey, msg, &sig, SignatureScheme::Hybrid).unwrap();
886886
}
887887

888888
#[test]
@@ -892,18 +892,18 @@ mod tests {
892892

893893
#[test]
894894
fn test_keypair_persistence() {
895-
let dir = tempfile::tempdir().expect("TODO: handle error");
895+
let dir = tempfile::tempdir().unwrap();
896896
let key_path = dir.path().join("test.key");
897897

898898
// Generate, serialize, write
899-
let keypair = generate_hybrid_keypair().expect("TODO: handle error");
899+
let keypair = generate_hybrid_keypair().unwrap();
900900
let pubkey_original = hybrid_public_key(&keypair);
901-
let data = serialize_keypair_raw(&keypair).expect("TODO: handle error");
902-
std::fs::write(&key_path, &data).expect("TODO: handle error");
901+
let data = serialize_keypair_raw(&keypair).unwrap();
902+
std::fs::write(&key_path, &data).unwrap();
903903

904904
// Read, deserialize, verify
905-
let loaded_data = std::fs::read(&key_path).expect("TODO: handle error");
906-
let restored = deserialize_keypair_raw(&loaded_data).expect("TODO: handle error");
905+
let loaded_data = std::fs::read(&key_path).unwrap();
906+
let restored = deserialize_keypair_raw(&loaded_data).unwrap();
907907
let pubkey_restored = hybrid_public_key(&restored);
908908

909909
assert_eq!(pubkey_original.ed448, pubkey_restored.ed448);
@@ -912,6 +912,6 @@ mod tests {
912912
// Sign → verify across the persistence boundary
913913
let msg = b"persistence test";
914914
let sig = sign_hybrid(&restored, msg);
915-
verify_hybrid(&pubkey_original, msg, &sig).expect("TODO: handle error");
915+
verify_hybrid(&pubkey_original, msg, &sig).unwrap();
916916
}
917917
}

0 commit comments

Comments
 (0)