1cac7dca0Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd.
2cac7dca0Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3cac7dca0Sopenharmony_ci// you may not use this file except in compliance with the License.
4cac7dca0Sopenharmony_ci// You may obtain a copy of the License at
5cac7dca0Sopenharmony_ci//
6cac7dca0Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7cac7dca0Sopenharmony_ci//
8cac7dca0Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9cac7dca0Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10cac7dca0Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11cac7dca0Sopenharmony_ci// See the License for the specific language governing permissions and
12cac7dca0Sopenharmony_ci// limitations under the License.
13cac7dca0Sopenharmony_ci
14cac7dca0Sopenharmony_ciuse std::io::ErrorKind;
15cac7dca0Sopenharmony_ci
16cac7dca0Sopenharmony_ciuse ylong_io::UdpSocket;
17cac7dca0Sopenharmony_ci
18cac7dca0Sopenharmony_ci/// SDV test cases for `send()` and `recv()`.
19cac7dca0Sopenharmony_ci///
20cac7dca0Sopenharmony_ci/// # Brief
21cac7dca0Sopenharmony_ci/// 1. Create UdpSocket and connect to the remote address.
22cac7dca0Sopenharmony_ci/// 2. Sender sends message first.
23cac7dca0Sopenharmony_ci/// 3. Receiver receives message.
24cac7dca0Sopenharmony_ci/// 4. Check if the test results are correct.
25cac7dca0Sopenharmony_ci#[test]
26cac7dca0Sopenharmony_cifn sdv_send_recv() {
27cac7dca0Sopenharmony_ci    let sender_addr = "127.0.0.1:8081".parse().unwrap();
28cac7dca0Sopenharmony_ci    let receiver_addr = "127.0.0.1:8082".parse().unwrap();
29cac7dca0Sopenharmony_ci
30cac7dca0Sopenharmony_ci    let sender = match UdpSocket::bind(sender_addr) {
31cac7dca0Sopenharmony_ci        Ok(socket) => socket,
32cac7dca0Sopenharmony_ci        Err(e) => {
33cac7dca0Sopenharmony_ci            panic!("Bind Socket Failed {}", e);
34cac7dca0Sopenharmony_ci        }
35cac7dca0Sopenharmony_ci    };
36cac7dca0Sopenharmony_ci
37cac7dca0Sopenharmony_ci    let receiver = match UdpSocket::bind(receiver_addr) {
38cac7dca0Sopenharmony_ci        Ok(socket) => socket,
39cac7dca0Sopenharmony_ci        Err(e) => {
40cac7dca0Sopenharmony_ci            panic!("Bind Socket Failed {}", e);
41cac7dca0Sopenharmony_ci        }
42cac7dca0Sopenharmony_ci    };
43cac7dca0Sopenharmony_ci
44cac7dca0Sopenharmony_ci    let connected_sender = match sender.connect(receiver_addr) {
45cac7dca0Sopenharmony_ci        Ok(socket) => socket,
46cac7dca0Sopenharmony_ci        Err(e) => {
47cac7dca0Sopenharmony_ci            panic!("Connect Socket Failed {}", e);
48cac7dca0Sopenharmony_ci        }
49cac7dca0Sopenharmony_ci    };
50cac7dca0Sopenharmony_ci    let connected_receiver = match receiver.connect(sender_addr) {
51cac7dca0Sopenharmony_ci        Ok(socket) => socket,
52cac7dca0Sopenharmony_ci        Err(e) => {
53cac7dca0Sopenharmony_ci            panic!("Connect Socket Failed {}", e);
54cac7dca0Sopenharmony_ci        }
55cac7dca0Sopenharmony_ci    };
56cac7dca0Sopenharmony_ci
57cac7dca0Sopenharmony_ci    match connected_sender.send(b"Hello") {
58cac7dca0Sopenharmony_ci        Ok(n) => {
59cac7dca0Sopenharmony_ci            assert_eq!(n, "Hello".len());
60cac7dca0Sopenharmony_ci        }
61cac7dca0Sopenharmony_ci        Err(e) => {
62cac7dca0Sopenharmony_ci            panic!("Sender Send Failed {}", e);
63cac7dca0Sopenharmony_ci        }
64cac7dca0Sopenharmony_ci    }
65cac7dca0Sopenharmony_ci
66cac7dca0Sopenharmony_ci    let mut recv_buf = [0_u8; 12];
67cac7dca0Sopenharmony_ci    let len = loop {
68cac7dca0Sopenharmony_ci        match connected_receiver.recv(&mut recv_buf[..]) {
69cac7dca0Sopenharmony_ci            Ok(n) => break n,
70cac7dca0Sopenharmony_ci            Err(e) if e.kind() == ErrorKind::WouldBlock => {}
71cac7dca0Sopenharmony_ci            Err(e) => panic!("{:?}", e),
72cac7dca0Sopenharmony_ci        }
73cac7dca0Sopenharmony_ci    };
74cac7dca0Sopenharmony_ci
75cac7dca0Sopenharmony_ci    assert_eq!(&recv_buf[..len], b"Hello");
76cac7dca0Sopenharmony_ci}
77cac7dca0Sopenharmony_ci
78cac7dca0Sopenharmony_ci/// SDV test cases for `send_to()` and `recv_from()`.
79cac7dca0Sopenharmony_ci///
80cac7dca0Sopenharmony_ci/// # Brief
81cac7dca0Sopenharmony_ci/// 1. Create UdpSocket.
82cac7dca0Sopenharmony_ci/// 2. Sender sends message to the specified address.
83cac7dca0Sopenharmony_ci/// 3. Receiver receives message and return the address the message from.
84cac7dca0Sopenharmony_ci/// 4. Check if the test results are correct.
85cac7dca0Sopenharmony_ci#[test]
86cac7dca0Sopenharmony_cifn sdv_send_to_recv_from() {
87cac7dca0Sopenharmony_ci    let sender_addr = "127.0.0.1:8085".parse().unwrap();
88cac7dca0Sopenharmony_ci    let receiver_addr = "127.0.0.1:8086".parse().unwrap();
89cac7dca0Sopenharmony_ci
90cac7dca0Sopenharmony_ci    let sender = match UdpSocket::bind(sender_addr) {
91cac7dca0Sopenharmony_ci        Ok(socket) => socket,
92cac7dca0Sopenharmony_ci        Err(e) => {
93cac7dca0Sopenharmony_ci            panic!("Bind Socket Failed {}", e);
94cac7dca0Sopenharmony_ci        }
95cac7dca0Sopenharmony_ci    };
96cac7dca0Sopenharmony_ci
97cac7dca0Sopenharmony_ci    let receiver = match UdpSocket::bind(receiver_addr) {
98cac7dca0Sopenharmony_ci        Ok(socket) => socket,
99cac7dca0Sopenharmony_ci        Err(e) => {
100cac7dca0Sopenharmony_ci            panic!("Bind Socket Failed {}", e);
101cac7dca0Sopenharmony_ci        }
102cac7dca0Sopenharmony_ci    };
103cac7dca0Sopenharmony_ci
104cac7dca0Sopenharmony_ci    match sender.send_to(b"Hello", receiver_addr) {
105cac7dca0Sopenharmony_ci        Ok(n) => {
106cac7dca0Sopenharmony_ci            assert_eq!(n, "Hello".len());
107cac7dca0Sopenharmony_ci        }
108cac7dca0Sopenharmony_ci        Err(e) => {
109cac7dca0Sopenharmony_ci            panic!("Sender Send Failed {}", e);
110cac7dca0Sopenharmony_ci        }
111cac7dca0Sopenharmony_ci    }
112cac7dca0Sopenharmony_ci
113cac7dca0Sopenharmony_ci    let mut recv_buf = [0_u8; 12];
114cac7dca0Sopenharmony_ci    let (len, addr) = loop {
115cac7dca0Sopenharmony_ci        match receiver.recv_from(&mut recv_buf[..]) {
116cac7dca0Sopenharmony_ci            Ok(res) => break res,
117cac7dca0Sopenharmony_ci            Err(e) if e.kind() == ErrorKind::WouldBlock => {}
118cac7dca0Sopenharmony_ci            Err(e) => panic!("{:?}", e),
119cac7dca0Sopenharmony_ci        }
120cac7dca0Sopenharmony_ci    };
121cac7dca0Sopenharmony_ci    assert_eq!(&recv_buf[..len], b"Hello");
122cac7dca0Sopenharmony_ci    assert_eq!(addr, sender_addr);
123cac7dca0Sopenharmony_ci}
124