use bft_json_crdt::{ json_crdt::{BaseCrdt, SignedOp}, keypair::make_keypair, }; use side_node::{ bft_crdt::TransactionList, bitcoin, clients::websocket::Client, node::SideNode, utils, }; use tokio::sync::mpsc; #[tokio::test] async fn test_distribute_via_websockets() { let mut node1 = setup("alice").await; let mut node2 = setup("bob").await; assert_eq!(node1.current_sha(), node2.current_sha()); let transaction = utils::fake_generic_transaction_json("from_alice".to_string()); let signed_op = node1.add_transaction_local(transaction); node2.handle_incoming(signed_op); assert_eq!(node1.current_sha(), node2.current_sha()); let transaction = utils::fake_generic_transaction_json("from_alice2".to_string()); let signed_op = node1.add_transaction_local(transaction); node2.handle_incoming(signed_op); assert_eq!(node1.current_sha(), node2.current_sha()); let transaction = utils::fake_generic_transaction_json("from_alice3".to_string()); let signed_op = node1.add_transaction_local(transaction); node2.handle_incoming(signed_op); assert_eq!(node1.current_sha(), node2.current_sha()); } /// Wire everything up, ignoring things we are not using in the test async fn setup(_: &str) -> SideNode { // First, load up the keys and create a bft-bft-crdt let bft_crdt_keys = make_keypair(); let mnemonic_words = bitcoin::keys::make_mnemonic(); let keys = bitcoin::keys::get(mnemonic_words).unwrap(); let bitcoin_wallet = bitcoin::clients::electrum::create_wallet(keys).unwrap(); let crdt = BaseCrdt::::new(&bft_crdt_keys); // Channels for internal communication, and a tokio task for stdin input let (incoming_sender, incoming_receiver) = mpsc::channel::(32); let (_, stdin_receiver) = std::sync::mpsc::channel(); // Finally, create the node and return it let handle = Client::new(incoming_sender).await; let node = SideNode::new( crdt, bft_crdt_keys, bitcoin_wallet, incoming_receiver, stdin_receiver, handle, ); node }