151 lines
4.9 KiB
Rust
151 lines
4.9 KiB
Rust
use gsio_node::ledger::{LedgerEntry, Ledger, SharedLedger};
|
|
use serde_json::json;
|
|
|
|
#[test]
|
|
fn test_ledger_entry_creation() {
|
|
// Create a new ledger entry
|
|
let data = json!({ "message": "Test entry" });
|
|
let previous_hash = "0".repeat(64);
|
|
let creator_node_id = "test-node-1".to_string();
|
|
|
|
let entry = LedgerEntry::new(data.clone(), previous_hash.clone(), creator_node_id.clone());
|
|
|
|
// Verify the entry fields
|
|
assert_eq!(entry.data, data);
|
|
assert_eq!(entry.previous_hash, previous_hash);
|
|
assert_eq!(entry.creator_node_id, creator_node_id);
|
|
assert!(!entry.hash.is_empty());
|
|
assert!(entry.signatures.is_empty());
|
|
|
|
// Verify the entry is valid
|
|
assert!(entry.is_valid());
|
|
}
|
|
|
|
#[test]
|
|
fn test_ledger_add_entry() {
|
|
// Create a new ledger
|
|
let node_id = "test-node-1".to_string();
|
|
let mut ledger = Ledger::new(node_id.clone());
|
|
|
|
// Add an entry to the ledger
|
|
let data = json!({ "message": "Test entry 1" });
|
|
let result = ledger.add_entry(data.clone());
|
|
|
|
// Verify the result
|
|
assert!(result.is_ok());
|
|
let entry = result.unwrap();
|
|
assert_eq!(entry.data, data);
|
|
assert_eq!(entry.creator_node_id, node_id);
|
|
|
|
// Verify the ledger state
|
|
let entries = ledger.get_entries();
|
|
assert_eq!(entries.len(), 1);
|
|
assert_eq!(entries[0].data, data);
|
|
}
|
|
|
|
#[test]
|
|
fn test_ledger_chain_integrity() {
|
|
// Create a new ledger
|
|
let node_id = "test-node-1".to_string();
|
|
let mut ledger = Ledger::new(node_id.clone());
|
|
|
|
// Add multiple entries to the ledger
|
|
let data1 = json!({ "message": "Test entry 1" });
|
|
let data2 = json!({ "message": "Test entry 2" });
|
|
let data3 = json!({ "message": "Test entry 3" });
|
|
|
|
let _entry1 = ledger.add_entry(data1.clone()).unwrap();
|
|
let _entry2 = ledger.add_entry(data2.clone()).unwrap();
|
|
let _entry3 = ledger.add_entry(data3.clone()).unwrap();
|
|
|
|
// Verify the chain integrity
|
|
let entries = ledger.get_entries();
|
|
assert_eq!(entries.len(), 3);
|
|
|
|
// First entry should have a previous hash of all zeros
|
|
assert_eq!(entries[0].previous_hash, "0".repeat(64));
|
|
|
|
// Each entry's hash should match the next entry's previous_hash
|
|
assert_eq!(entries[1].previous_hash, entries[0].hash);
|
|
assert_eq!(entries[2].previous_hash, entries[1].hash);
|
|
|
|
// All entries should be valid
|
|
for entry in entries {
|
|
assert!(entry.is_valid());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_shared_ledger() {
|
|
// Create a new shared ledger
|
|
let node_id = "test-node-1".to_string();
|
|
let shared_ledger = SharedLedger::new(node_id.clone());
|
|
|
|
// Add entries to the shared ledger
|
|
let data1 = json!({ "message": "Test entry 1" });
|
|
let data2 = json!({ "message": "Test entry 2" });
|
|
|
|
let _entry1 = shared_ledger.add_entry(data1.clone()).unwrap();
|
|
let _entry2 = shared_ledger.add_entry(data2.clone()).unwrap();
|
|
|
|
// Verify the entries
|
|
let entries = shared_ledger.get_entries();
|
|
assert_eq!(entries.len(), 2);
|
|
assert_eq!(entries[0].data, data1);
|
|
assert_eq!(entries[1].data, data2);
|
|
|
|
// Verify the last entry
|
|
let last_entry = shared_ledger.get_last_entry().unwrap();
|
|
assert_eq!(last_entry.data, data2);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pending_entries() {
|
|
// Create a new shared ledger
|
|
let node_id = "test-node-1".to_string();
|
|
let shared_ledger = SharedLedger::new(node_id.clone());
|
|
|
|
// Add an entry to the ledger
|
|
let data1 = json!({ "message": "Test entry 1" });
|
|
let entry1 = shared_ledger.add_entry(data1.clone()).unwrap();
|
|
|
|
// Create a pending entry that links to the first entry
|
|
let data2 = json!({ "message": "Test entry 2" });
|
|
let entry2 = LedgerEntry::new(data2.clone(), entry1.hash.clone(), "test-node-2".to_string());
|
|
|
|
// Add the pending entry
|
|
shared_ledger.add_pending_entry(entry2.clone());
|
|
|
|
// Process pending entries
|
|
let added_entries = shared_ledger.process_pending_entries();
|
|
|
|
// Verify the pending entry was added
|
|
assert_eq!(added_entries.len(), 1);
|
|
assert_eq!(added_entries[0].data, data2);
|
|
|
|
// Verify the ledger state
|
|
let entries = shared_ledger.get_entries();
|
|
assert_eq!(entries.len(), 2);
|
|
assert_eq!(entries[0].data, data1);
|
|
assert_eq!(entries[1].data, data2);
|
|
}
|
|
|
|
#[test]
|
|
fn test_known_nodes() {
|
|
// Create a new shared ledger
|
|
let node_id = "test-node-1".to_string();
|
|
let shared_ledger = SharedLedger::new(node_id.clone());
|
|
|
|
// Add known nodes
|
|
shared_ledger.add_known_node("test-node-2".to_string());
|
|
shared_ledger.add_known_node("test-node-3".to_string());
|
|
shared_ledger.add_known_node("test-node-2".to_string()); // Duplicate should be ignored
|
|
|
|
// Verify the known nodes
|
|
let known_nodes = shared_ledger.get_known_nodes();
|
|
assert_eq!(known_nodes.len(), 3); // Including the original node
|
|
assert!(known_nodes.contains(&node_id));
|
|
assert!(known_nodes.contains(&"test-node-2".to_string()));
|
|
assert!(known_nodes.contains(&"test-node-3".to_string()));
|
|
}
|