summaryrefslogtreecommitdiff
path: root/monoio/tests/udp.rs
blob: f3ac7aab094d2d8ebea16dcb55a7c7bc0130266f (plain)
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
#[cfg(unix)]
use monoio::net::udp::UdpSocket;

#[cfg(unix)]
#[monoio::test_all]
async fn connect() {
    const MSG: &str = "foo bar baz";

    let passive = UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive_addr = passive.local_addr().unwrap();

    let active = UdpSocket::bind("127.0.0.1:0").unwrap();
    let active_addr = active.local_addr().unwrap();

    active.connect(passive_addr).await.unwrap();
    active.send(MSG).await.0.unwrap();

    let (res, buffer) = passive.recv(Vec::with_capacity(20)).await;
    res.unwrap();
    assert_eq!(MSG.as_bytes(), &buffer);
    assert_eq!(active.local_addr().unwrap(), active_addr);
    assert_eq!(active.peer_addr().unwrap(), passive_addr);
}

#[cfg(unix)]
#[monoio::test_all]
async fn send_to() {
    const MSG: &str = "foo bar baz";

    macro_rules! must_success {
        ($r: expr, $expect_addr: expr) => {
            let res = $r;
            assert_eq!(res.0.unwrap().1, $expect_addr);
            assert_eq!(res.1, MSG.as_bytes());
        };
    }

    let passive1 = UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive1_addr = passive1.local_addr().unwrap();

    let passive01 = std::net::UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive01_addr = passive01.local_addr().unwrap();

    let passive2 = UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive2_addr = passive2.local_addr().unwrap();

    let passive3 = UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive3_addr = passive3.local_addr().unwrap();

    let active = UdpSocket::bind("127.0.0.1:0").unwrap();
    let active_addr = active.local_addr().unwrap();

    active.send_to(MSG, passive01_addr).await.0.unwrap();
    active.send_to(MSG, passive1_addr).await.0.unwrap();
    active.send_to(MSG, passive2_addr).await.0.unwrap();
    active.send_to(MSG, passive3_addr).await.0.unwrap();

    must_success!(passive1.recv_from(vec![0; 20]).await, active_addr);
    must_success!(passive2.recv_from(vec![0; 20]).await, active_addr);
    must_success!(passive3.recv_from(vec![0; 20]).await, active_addr);
}

#[cfg(unix)]
#[monoio::test_all(timer_enabled = true)]
async fn rw_able() {
    const MSG: &str = "foo bar baz";

    let passive = UdpSocket::bind("127.0.0.1:0").unwrap();
    let passive_addr = passive.local_addr().unwrap();

    let active = UdpSocket::bind("127.0.0.1:0").unwrap();

    assert!(active.writable(false).await.is_ok());
    monoio::select! {
        _ = monoio::time::sleep(std::time::Duration::from_millis(50)) => {},
        _ = passive.readable(false) => {
            panic!("unexpected readable");
        }
    }

    active.connect(passive_addr).await.unwrap();
    active.send(MSG).await.0.unwrap();
    assert!(passive.readable(false).await.is_ok());
}

#[cfg(unix)]
#[monoio::test_all(timer_enabled = true)]
async fn cancel_recv_from() {
    let passive = UdpSocket::bind("127.0.0.1:0").unwrap();
    let canceller = monoio::io::Canceller::new();
    let recv = passive.cancelable_recv_from(vec![0; 20], canceller.handle());
    monoio::pin!(recv);

    monoio::select! {
        _ = monoio::time::sleep(std::time::Duration::from_millis(50)) => {
            canceller.cancel();
            assert!(recv.await.0.is_err());
        },
        _ = &mut recv => {
            panic!("unexpected readable");
        }
    }
}