Merge #318
318: Alice spawns swaps outside the event loop r=thomaseizinger a=da-kami Instead of spawning the swap inside the event loop we send the swap back to the caller to be spawned. This means we no longer need the remote handle that was only used in the tests. This now properly logs the swap results in production. It also gives us more control over Alice's swap in the tests. Co-authored-by: Daniel Karzel <daniel@comit.network>pull/324/head
commit
105d855a4a
@ -1,19 +1,26 @@
|
|||||||
pub mod testutils;
|
pub mod testutils;
|
||||||
|
|
||||||
use swap::protocol::bob;
|
use swap::protocol::{alice, bob};
|
||||||
use testutils::SlowCancelConfig;
|
use testutils::SlowCancelConfig;
|
||||||
|
use tokio::join;
|
||||||
|
|
||||||
/// Run the following tests with RUST_MIN_STACK=10000000
|
/// Run the following tests with RUST_MIN_STACK=10000000
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn happy_path() {
|
async fn happy_path() {
|
||||||
testutils::setup_test(SlowCancelConfig, |mut ctx| async move {
|
testutils::setup_test(SlowCancelConfig, |mut ctx| async move {
|
||||||
let (bob_swap, _) = ctx.new_swap_as_bob().await;
|
let (bob_swap, _) = ctx.bob_swap().await;
|
||||||
|
let bob_swap = tokio::spawn(bob::run(bob_swap));
|
||||||
|
|
||||||
let bob_state = bob::run(bob_swap).await;
|
let alice_swap = ctx.alice_next_swap().await;
|
||||||
|
let alice_swap = tokio::spawn(alice::run(alice_swap));
|
||||||
|
|
||||||
ctx.assert_alice_redeemed().await;
|
let (bob_state, alice_state) = join!(bob_swap, alice_swap);
|
||||||
ctx.assert_bob_redeemed(bob_state.unwrap()).await;
|
|
||||||
|
ctx.assert_alice_redeemed(alice_state??).await;
|
||||||
|
ctx.assert_bob_redeemed(bob_state??).await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -1,27 +1,34 @@
|
|||||||
pub mod testutils;
|
pub mod testutils;
|
||||||
|
|
||||||
use swap::protocol::bob;
|
|
||||||
use swap::protocol::bob::BobState;
|
use swap::protocol::bob::BobState;
|
||||||
|
use swap::protocol::{alice, bob};
|
||||||
use testutils::bob_run_until::is_xmr_locked;
|
use testutils::bob_run_until::is_xmr_locked;
|
||||||
use testutils::SlowCancelConfig;
|
use testutils::SlowCancelConfig;
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn given_bob_restarts_after_xmr_is_locked_resume_swap() {
|
async fn given_bob_restarts_after_xmr_is_locked_resume_swap() {
|
||||||
testutils::setup_test(SlowCancelConfig, |mut ctx| async move {
|
testutils::setup_test(SlowCancelConfig, |mut ctx| async move {
|
||||||
let (bob_swap, bob_join_handle) = ctx.new_swap_as_bob().await;
|
let (bob_swap, bob_join_handle) = ctx.bob_swap().await;
|
||||||
|
let bob_swap = tokio::spawn(bob::run_until(bob_swap, is_xmr_locked));
|
||||||
|
|
||||||
let bob_state = bob::run_until(bob_swap, is_xmr_locked).await.unwrap();
|
let alice_swap = ctx.alice_next_swap().await;
|
||||||
|
let alice_swap = tokio::spawn(alice::run(alice_swap));
|
||||||
|
|
||||||
|
let bob_state = bob_swap.await??;
|
||||||
|
|
||||||
assert!(matches!(bob_state, BobState::XmrLocked { .. }));
|
assert!(matches!(bob_state, BobState::XmrLocked { .. }));
|
||||||
|
|
||||||
let (bob_swap, _) = ctx.stop_and_resume_bob_from_db(bob_join_handle).await;
|
let (bob_swap, _) = ctx.stop_and_resume_bob_from_db(bob_join_handle).await;
|
||||||
assert!(matches!(bob_swap.state, BobState::XmrLocked { .. }));
|
assert!(matches!(bob_swap.state, BobState::XmrLocked { .. }));
|
||||||
|
|
||||||
let bob_state = bob::run(bob_swap).await.unwrap();
|
let bob_state = bob::run(bob_swap).await?;
|
||||||
|
|
||||||
ctx.assert_bob_redeemed(bob_state).await;
|
ctx.assert_bob_redeemed(bob_state).await;
|
||||||
|
|
||||||
ctx.assert_alice_redeemed().await;
|
let alice_state = alice_swap.await??;
|
||||||
|
ctx.assert_alice_redeemed(alice_state).await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
pub mod testutils;
|
||||||
|
|
||||||
|
use swap::protocol::bob::BobState;
|
||||||
|
use swap::protocol::{alice, bob};
|
||||||
|
use testutils::bob_run_until::is_btc_locked;
|
||||||
|
use testutils::FastPunishConfig;
|
||||||
|
|
||||||
|
/// Bob locks Btc and Alice locks Xmr. Bob does not act; he fails to send Alice
|
||||||
|
/// the encsig and fail to refund or redeem. Alice punishes.
|
||||||
|
#[tokio::test]
|
||||||
|
async fn alice_punishes_if_bob_never_acts_after_fund() {
|
||||||
|
testutils::setup_test(FastPunishConfig, |mut ctx| async move {
|
||||||
|
let (bob_swap, bob_join_handle) = ctx.bob_swap().await;
|
||||||
|
let bob_swap = tokio::spawn(bob::run_until(bob_swap, is_btc_locked));
|
||||||
|
|
||||||
|
let alice_swap = ctx.alice_next_swap().await;
|
||||||
|
let alice_swap = tokio::spawn(alice::run(alice_swap));
|
||||||
|
|
||||||
|
let bob_state = bob_swap.await??;
|
||||||
|
assert!(matches!(bob_state, BobState::BtcLocked { .. }));
|
||||||
|
|
||||||
|
let alice_state = alice_swap.await??;
|
||||||
|
ctx.assert_alice_punished(alice_state).await;
|
||||||
|
|
||||||
|
// Restart Bob after Alice punished to ensure Bob transitions to
|
||||||
|
// punished and does not run indefinitely
|
||||||
|
let (bob_swap, _) = ctx.stop_and_resume_bob_from_db(bob_join_handle).await;
|
||||||
|
assert!(matches!(bob_swap.state, BobState::BtcLocked { .. }));
|
||||||
|
|
||||||
|
let bob_state = bob::run(bob_swap).await?;
|
||||||
|
|
||||||
|
ctx.assert_bob_punished(bob_state).await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
Loading…
Reference in New Issue