use traceforge::thread;
use traceforge::*;
use thread::ThreadId;
use SchedulePolicy::*;
const TEST_RUNS: u32 = 10;
fn program1() {
let actor_m = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
});
let actor_a = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let b: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(m, 3);
traceforge::send_msg(b, 5);
});
let actor_b = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _a: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(m, 4);
});
traceforge::send_msg(actor_m.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_b.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_a.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), 0);
traceforge::send_msg(actor_m.thread().id(), 1);
traceforge::send_msg(actor_m.thread().id(), 2);
}
#[test]
fn sem1_comp_bag() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Bag)
.build(),
program1,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 24); }
}
#[test]
fn sem1_comp_fifo() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::FIFO)
.build(),
program1,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 12); }
}
#[test]
fn sem1_comp_causal() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program1,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 6); }
}
#[test]
fn sem1_comp_mailbox() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Mailbox)
.build(),
program1,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 6); }
}
fn program2() {
let actor_m = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
});
let actor_a = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _b: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(m, 3);
});
let actor_b = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _a: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
traceforge::send_msg(m, 4);
});
traceforge::send_msg(actor_m.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_b.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_a.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), 0);
traceforge::send_msg(actor_m.thread().id(), 1);
traceforge::send_msg(actor_m.thread().id(), 2);
}
#[test]
fn sem2_comp_bag() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Bag)
.build(),
program2,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 24); }
}
#[test]
fn sem2_comp_fifo() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::FIFO)
.build(),
program2,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 12); }
}
#[test]
fn sem2_comp_causal() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program2,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 12); }
}
#[test]
fn sem2_comp_mailbox() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program2,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 12); }
}
fn program3() {
let actor_a = thread::spawn(move || {
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
});
traceforge::send_msg(actor_a.thread().id(), 1);
traceforge::send_msg(actor_a.thread().id(), 2);
traceforge::send_msg(actor_a.thread().id(), 3);
}
#[test]
fn sem3_comp_bag() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Bag)
.build(),
program3,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 6); }
}
#[test]
fn sem3_comp_fifo() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::FIFO)
.build(),
program3,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 1); }
}
#[test]
fn sem3_comp_causal() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program3,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 1); }
}
#[test]
fn sem3_comp_mailbox() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Mailbox)
.build(),
program3,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 1); }
}
fn program4() {
let actor_m = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
});
let actor_a = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _b: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
});
let actor_b = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let a: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
traceforge::send_msg(a, 3);
traceforge::send_msg(m, 4);
});
traceforge::send_msg(actor_m.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_b.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_a.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_m.thread().id(), 1);
traceforge::send_msg(actor_a.thread().id(), 2);
}
#[test]
fn mailbox1_mb() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Mailbox)
.build(),
program4,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 3);
}
}
#[test]
fn mailbox1_cd() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program4,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs, 4);
}
}
fn program5() {
let actor_m = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let z: i32 = traceforge::recv_msg_block();
let t: i32 = traceforge::recv_msg_block();
if z > t {
traceforge::send_msg(tmain, 5);
}
});
let actor_a = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let _b: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let x: i32 = traceforge::recv_msg_block();
let y: i32 = traceforge::recv_msg_block();
if x < y {
traceforge::send_msg(tmain, 5);
}
});
let actor_b = thread::spawn(move || {
let tmain: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let m: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
let a: ThreadId = traceforge::recv_msg_block();
traceforge::send_msg(tmain, 0);
traceforge::send_msg(a, 3);
traceforge::send_msg(m, 4);
});
traceforge::send_msg(actor_m.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_a.thread().id(), actor_b.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), thread::current().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_m.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_b.thread().id(), actor_a.thread().id());
let _: i32 = traceforge::recv_msg_block();
traceforge::send_msg(actor_m.thread().id(), 1);
traceforge::send_msg(actor_a.thread().id(), 2);
let _: i32 = traceforge::recv_msg_block();
let _: i32 = traceforge::recv_msg_block();
traceforge::assert(false);
}
#[test]
fn mailbox2_mb() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Mailbox)
.with_verbose(1)
.build(),
program5,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs + stats.block, 3); }
}
#[test]
#[should_panic(expected = "assertion failed")]
fn mailbox2_cd() {
for _i in 0..TEST_RUNS {
let stats = traceforge::verify(
Config::builder()
.with_policy(Arbitrary)
.with_cons_type(ConsType::Causal)
.build(),
program5,
);
println!("Number of executions explored {}", stats.execs);
println!("Number of blocked executions explored {}", stats.block);
assert_eq!(stats.execs + stats.block, 5); }
}