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