1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
extern crate mdl;
use mdl::Signaler;
use mdl::SignalerAsync;
use mdl::SigType;
use std::sync::{Arc, Mutex};
use std::{thread, time};
#[test]
fn one_signal_test() {
let sig = SignalerAsync::new();
sig.signal_loop();
let counter = Arc::new(Mutex::new(0));
// one thread for receive signals
let sig1 = sig.clone();
let c1 = counter.clone();
let t1: thread::JoinHandle<_> =
thread::spawn(move || {
let _ = sig1.subscribe("signal", Box::new(move |_sig| {
*c1.lock().unwrap() += 1;
}));
});
// waiting for threads to finish
t1.join().unwrap();
// one thread for emit signals
let sig2 = sig.clone();
let t2: thread::JoinHandle<_> =
thread::spawn(move || {
sig2.emit(SigType::Update, "signal").unwrap();
sig2.emit(SigType::Update, "signal:2").unwrap();
sig2.emit(SigType::Update, "signal:2:3").unwrap();
});
// waiting for threads to finish
t2.join().unwrap();
let ten_millis = time::Duration::from_millis(10);
thread::sleep(ten_millis);
assert_eq!(*counter.lock().unwrap(), 3);
}
#[test]
fn two_signal_test() {
let sig = SignalerAsync::new();
sig.signal_loop();
let counter = Arc::new(Mutex::new(0));
let counter2 = Arc::new(Mutex::new(0));
// one thread for receive signals
let sig1 = sig.clone();
let c1 = counter.clone();
let c2 = counter2.clone();
let t1: thread::JoinHandle<_> =
thread::spawn(move || {
let _ = sig1.subscribe("signal", Box::new(move |_sig| {
*c1.lock().unwrap() += 1;
}));
let _ = sig1.subscribe("others", Box::new(move |_sig| {
*c2.lock().unwrap() += 1;
}));
});
// waiting for threads to finish
t1.join().unwrap();
// one thread for emit signals
let sig2 = sig.clone();
let t2: thread::JoinHandle<_> =
thread::spawn(move || {
sig2.emit(SigType::Update, "signal").unwrap();
sig2.emit(SigType::Update, "others:2:3").unwrap();
sig2.emit(SigType::Update, "signal:2").unwrap();
sig2.emit(SigType::Update, "signal:2:3").unwrap();
});
// waiting for threads to finish
t2.join().unwrap();
let ten_millis = time::Duration::from_millis(10);
thread::sleep(ten_millis);
assert_eq!(*counter.lock().unwrap(), 3);
assert_eq!(*counter2.lock().unwrap(), 1);
}
#[test]
fn unsubscribe_test() {
let sig = SignalerAsync::new();
sig.signal_loop();
let counter = Arc::new(Mutex::new(0));
// one thread for receive signals
let sig1 = sig.clone();
let c1 = counter.clone();
let t1: thread::JoinHandle<_> =
thread::spawn(move || {
let sig2 = sig1.clone();
let _ = sig1.subscribe("unsub", Box::new(move |_sig| {
*c1.lock().unwrap() += 1;
sig2.unsubscribe(1);
}));
});
// waiting for threads to finish
t1.join().unwrap();
// one thread for emit signals
let sig2 = sig.clone();
let t2: thread::JoinHandle<_> =
thread::spawn(move || {
sig2.emit(SigType::Update, "unsub").unwrap();
sig2.emit(SigType::Update, "unsub:2").unwrap();
sig2.emit(SigType::Update, "unsub:2:3").unwrap();
});
// waiting for threads to finish
t2.join().unwrap();
let ten_millis = time::Duration::from_millis(10);
thread::sleep(ten_millis);
assert_eq!(*counter.lock().unwrap(), 1);
}
|