use rand::rngs::OsRng;
use rust_bottle::*;
#[test]
fn test_bottle_creation() {
let message = b"Hello, Bottle!";
let bottle = Bottle::new(message.to_vec());
assert_eq!(bottle.message(), message);
}
#[test]
fn test_bottle_encryption() {
let message = b"Secret message";
let mut bottle = Bottle::new(message.to_vec());
let (public_key, private_key) = generate_test_keypair();
let rng = &mut OsRng;
bottle.encrypt(rng, &public_key).unwrap();
assert!(bottle.is_encrypted());
let opener = Opener::new();
let decrypted = opener.open(&bottle, Some(&private_key)).unwrap();
assert_eq!(decrypted, message);
}
#[test]
fn test_bottle_signing() {
let message = b"Signed message";
let mut bottle = Bottle::new(message.to_vec());
let (public_key, signer) = generate_test_signing_keypair();
let rng = &mut OsRng;
bottle.sign(rng, &*signer, &public_key).unwrap();
let opener = Opener::new();
let info = opener.open_info(&bottle).unwrap();
assert!(info.is_signed_by(&public_key));
}
#[test]
fn test_bottle_encryption_and_signing() {
let message = b"Encrypted and signed message";
let mut bottle = Bottle::new(message.to_vec());
let (enc_pub, enc_priv) = generate_test_keypair();
let (sig_pub, signer) = generate_test_signing_keypair();
let rng = &mut OsRng;
bottle.encrypt(rng, &enc_pub).unwrap();
bottle.sign(rng, &*signer, &sig_pub).unwrap();
let opener = Opener::new();
let decrypted = opener.open(&bottle, Some(&enc_priv)).unwrap();
assert_eq!(decrypted, message);
let info = opener.open_info(&bottle).unwrap();
assert!(info.is_signed_by(&sig_pub));
}
#[test]
fn test_bottle_layered_encryption() {
let message = b"Multi-layer encrypted";
let mut bottle = Bottle::new(message.to_vec());
let (pub1, _priv1) = generate_test_keypair();
let (pub2, _priv2) = generate_test_keypair();
let rng = &mut OsRng;
bottle.encrypt(rng, &pub1).unwrap();
bottle.encrypt(rng, &pub2).unwrap();
assert!(bottle.encryption_count() == 2);
let opener = Opener::new();
let info = opener.open_info(&bottle).unwrap();
assert!(info.is_encrypted);
assert_eq!(info.recipients.len(), 2);
}
#[test]
fn test_bottle_serialization() {
let message = b"Serializable message";
let bottle = Bottle::new(message.to_vec());
let serialized = bottle.to_bytes().unwrap();
let deserialized = Bottle::from_bytes(&serialized).unwrap();
assert_eq!(bottle.message(), deserialized.message());
}
#[test]
fn test_bottle_with_metadata() {
let message = b"Message with metadata";
let mut bottle = Bottle::new(message.to_vec());
bottle.set_metadata("key1", "value1");
bottle.set_metadata("key2", "value2");
assert_eq!(bottle.metadata("key1"), Some("value1"));
assert_eq!(bottle.metadata("key2"), Some("value2"));
}
fn generate_test_keypair() -> (Vec<u8>, Vec<u8>) {
let rng = &mut OsRng;
let key = X25519Key::generate(rng);
(key.public_key_bytes(), key.private_key_bytes())
}
fn generate_test_signing_keypair() -> (Vec<u8>, Box<dyn Sign>) {
let rng = &mut OsRng;
let key = Ed25519Key::generate(rng);
let pub_key = key.public_key_bytes();
(pub_key, Box::new(key))
}