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::{IoSlice, IoSliceMut, Read, Write};
15cac7dca0Sopenharmony_ciuse std::net::SocketAddr;
16cac7dca0Sopenharmony_ciuse std::{io, net, thread};
17cac7dca0Sopenharmony_ci
18cac7dca0Sopenharmony_ciuse ylong_io::TcpListener;
19cac7dca0Sopenharmony_ci
20cac7dca0Sopenharmony_ci/// SDV for TcpStream read and write
21cac7dca0Sopenharmony_ci///
22cac7dca0Sopenharmony_ci/// # Brief
23cac7dca0Sopenharmony_ci/// 1. Create a Tcp server
24cac7dca0Sopenharmony_ci/// 2. Write `hello` to client
25cac7dca0Sopenharmony_ci/// 3. Read `hello` from client
26cac7dca0Sopenharmony_ci#[test]
27cac7dca0Sopenharmony_cifn sdv_tcp_server() {
28cac7dca0Sopenharmony_ci    let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
29cac7dca0Sopenharmony_ci    let server = TcpListener::bind(addr).unwrap();
30cac7dca0Sopenharmony_ci    let addr = server.local_addr().unwrap();
31cac7dca0Sopenharmony_ci
32cac7dca0Sopenharmony_ci    let thread = thread::spawn(move || {
33cac7dca0Sopenharmony_ci        let (mut stream, _) = loop {
34cac7dca0Sopenharmony_ci            let stream = server.accept();
35cac7dca0Sopenharmony_ci            match stream {
36cac7dca0Sopenharmony_ci                Ok(stream) => break stream,
37cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => continue,
38cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp accept failed: {e:?}"),
39cac7dca0Sopenharmony_ci            }
40cac7dca0Sopenharmony_ci        };
41cac7dca0Sopenharmony_ci        let mut ret = stream.write(b"hello");
42cac7dca0Sopenharmony_ci        loop {
43cac7dca0Sopenharmony_ci            match &ret {
44cac7dca0Sopenharmony_ci                Ok(n) => {
45cac7dca0Sopenharmony_ci                    assert_eq!(*n, 5);
46cac7dca0Sopenharmony_ci                    break;
47cac7dca0Sopenharmony_ci                }
48cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
49cac7dca0Sopenharmony_ci                    ret = stream.write(b"hello");
50cac7dca0Sopenharmony_ci                }
51cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp write failed: {e:?}"),
52cac7dca0Sopenharmony_ci            }
53cac7dca0Sopenharmony_ci        }
54cac7dca0Sopenharmony_ci
55cac7dca0Sopenharmony_ci        let mut read_stream = stream.try_clone().unwrap();
56cac7dca0Sopenharmony_ci
57cac7dca0Sopenharmony_ci        let mut buf = [0; 5];
58cac7dca0Sopenharmony_ci        loop {
59cac7dca0Sopenharmony_ci            let ret = read_stream.read(&mut buf);
60cac7dca0Sopenharmony_ci            match &ret {
61cac7dca0Sopenharmony_ci                Ok(n) => {
62cac7dca0Sopenharmony_ci                    assert_eq!(*n, 5);
63cac7dca0Sopenharmony_ci                    assert_eq!(&buf, b"hello");
64cac7dca0Sopenharmony_ci                    break;
65cac7dca0Sopenharmony_ci                }
66cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => continue,
67cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp write failed: {e:?}"),
68cac7dca0Sopenharmony_ci            }
69cac7dca0Sopenharmony_ci        }
70cac7dca0Sopenharmony_ci    });
71cac7dca0Sopenharmony_ci
72cac7dca0Sopenharmony_ci    let mut client = loop {
73cac7dca0Sopenharmony_ci        let tcp = net::TcpStream::connect(addr);
74cac7dca0Sopenharmony_ci        match tcp {
75cac7dca0Sopenharmony_ci            Err(_) => continue,
76cac7dca0Sopenharmony_ci            Ok(stream) => break stream,
77cac7dca0Sopenharmony_ci        }
78cac7dca0Sopenharmony_ci    };
79cac7dca0Sopenharmony_ci    let mut buf = [0; 5];
80cac7dca0Sopenharmony_ci    let ret = client.read(&mut buf).unwrap();
81cac7dca0Sopenharmony_ci    assert_eq!(ret, 5);
82cac7dca0Sopenharmony_ci    assert_eq!(&buf, b"hello");
83cac7dca0Sopenharmony_ci
84cac7dca0Sopenharmony_ci    let ret = client.write(&buf).unwrap();
85cac7dca0Sopenharmony_ci    assert_eq!(ret, 5);
86cac7dca0Sopenharmony_ci
87cac7dca0Sopenharmony_ci    thread.join().unwrap();
88cac7dca0Sopenharmony_ci}
89cac7dca0Sopenharmony_ci
90cac7dca0Sopenharmony_ci/// SDV for TcpStream read_vectored and write_vectored
91cac7dca0Sopenharmony_ci///
92cac7dca0Sopenharmony_ci/// # Brief
93cac7dca0Sopenharmony_ci/// 1. Create a Tcp server
94cac7dca0Sopenharmony_ci/// 2. Write `hello` to client
95cac7dca0Sopenharmony_ci/// 3. Read `hello` from client
96cac7dca0Sopenharmony_ci#[test]
97cac7dca0Sopenharmony_cifn sdv_tcp_server_vectored() {
98cac7dca0Sopenharmony_ci    let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
99cac7dca0Sopenharmony_ci    let server = TcpListener::bind(addr).unwrap();
100cac7dca0Sopenharmony_ci    let addr = server.local_addr().unwrap();
101cac7dca0Sopenharmony_ci
102cac7dca0Sopenharmony_ci    let thread = thread::spawn(move || {
103cac7dca0Sopenharmony_ci        let (mut stream, _) = loop {
104cac7dca0Sopenharmony_ci            let stream = server.accept();
105cac7dca0Sopenharmony_ci            match stream {
106cac7dca0Sopenharmony_ci                Ok(stream) => break stream,
107cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => continue,
108cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp accept failed: {e:?}"),
109cac7dca0Sopenharmony_ci            }
110cac7dca0Sopenharmony_ci        };
111cac7dca0Sopenharmony_ci        let vec = b"hello";
112cac7dca0Sopenharmony_ci        let slice = IoSlice::new(vec);
113cac7dca0Sopenharmony_ci        let mut ret = stream.write_vectored(&[slice]);
114cac7dca0Sopenharmony_ci        loop {
115cac7dca0Sopenharmony_ci            match &ret {
116cac7dca0Sopenharmony_ci                Ok(n) => {
117cac7dca0Sopenharmony_ci                    assert_eq!(*n, 5);
118cac7dca0Sopenharmony_ci                    break;
119cac7dca0Sopenharmony_ci                }
120cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
121cac7dca0Sopenharmony_ci                    ret = stream.write(b"hello");
122cac7dca0Sopenharmony_ci                    stream.flush().unwrap();
123cac7dca0Sopenharmony_ci                }
124cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp write failed: {e:?}"),
125cac7dca0Sopenharmony_ci            }
126cac7dca0Sopenharmony_ci        }
127cac7dca0Sopenharmony_ci
128cac7dca0Sopenharmony_ci        let mut read_stream = stream.try_clone().unwrap();
129cac7dca0Sopenharmony_ci
130cac7dca0Sopenharmony_ci        loop {
131cac7dca0Sopenharmony_ci            let mut buf = [0; 5];
132cac7dca0Sopenharmony_ci            let slice = IoSliceMut::new(&mut buf);
133cac7dca0Sopenharmony_ci            let ret = read_stream.read_vectored(&mut [slice]);
134cac7dca0Sopenharmony_ci            match &ret {
135cac7dca0Sopenharmony_ci                Ok(n) => {
136cac7dca0Sopenharmony_ci                    assert_eq!(*n, 5);
137cac7dca0Sopenharmony_ci                    assert_eq!(&buf, b"hello");
138cac7dca0Sopenharmony_ci                    break;
139cac7dca0Sopenharmony_ci                }
140cac7dca0Sopenharmony_ci                Err(e) if e.kind() == io::ErrorKind::WouldBlock => continue,
141cac7dca0Sopenharmony_ci                Err(e) => panic!("tcp write failed: {e:?}"),
142cac7dca0Sopenharmony_ci            }
143cac7dca0Sopenharmony_ci        }
144cac7dca0Sopenharmony_ci    });
145cac7dca0Sopenharmony_ci
146cac7dca0Sopenharmony_ci    let mut client = loop {
147cac7dca0Sopenharmony_ci        let tcp = net::TcpStream::connect(addr);
148cac7dca0Sopenharmony_ci        match tcp {
149cac7dca0Sopenharmony_ci            Err(_) => continue,
150cac7dca0Sopenharmony_ci            Ok(stream) => break stream,
151cac7dca0Sopenharmony_ci        }
152cac7dca0Sopenharmony_ci    };
153cac7dca0Sopenharmony_ci    let mut buf = [0; 5];
154cac7dca0Sopenharmony_ci    let ret = client.read(&mut buf).unwrap();
155cac7dca0Sopenharmony_ci    assert_eq!(ret, 5);
156cac7dca0Sopenharmony_ci    assert_eq!(&buf, b"hello");
157cac7dca0Sopenharmony_ci
158cac7dca0Sopenharmony_ci    let ret = client.write(&buf).unwrap();
159cac7dca0Sopenharmony_ci    assert_eq!(ret, 5);
160cac7dca0Sopenharmony_ci
161cac7dca0Sopenharmony_ci    thread.join().unwrap();
162cac7dca0Sopenharmony_ci}
163