Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/base/tests/linux/net.rs
5394 views
1
// Copyright 2022 The ChromiumOS Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
use std::io::ErrorKind;
6
use std::time::Duration;
7
8
use base::AsRawDescriptor;
9
use base::UnixSeqpacket;
10
use base::UnixSeqpacketListener;
11
use base::UnlinkUnixSeqpacketListener;
12
use tempfile::tempdir;
13
14
#[test]
15
fn unix_seqpacket_path_not_exists() {
16
let res = UnixSeqpacket::connect("/path/not/exists");
17
assert!(res.is_err());
18
}
19
20
#[test]
21
fn unix_seqpacket_listener_path() {
22
let temp_dir = tempdir().expect("failed to create tempdir");
23
let socket_path = temp_dir.path().join("unix_seqpacket_listener_path");
24
let listener = UnlinkUnixSeqpacketListener(
25
UnixSeqpacketListener::bind(&socket_path).expect("failed to create UnixSeqpacketListener"),
26
);
27
let listener_path = listener.path().expect("failed to get socket listener path");
28
assert_eq!(socket_path, listener_path);
29
}
30
31
#[test]
32
fn unix_seqpacket_listener_from_fd() {
33
let temp_dir = tempdir().expect("failed to create tempdir");
34
let socket_path = temp_dir.path().join("unix_seqpacket_listener_from_fd");
35
let listener = UnlinkUnixSeqpacketListener(
36
UnixSeqpacketListener::bind(&socket_path).expect("failed to create UnixSeqpacketListener"),
37
);
38
// UnixSeqpacketListener should succeed on a valid listening descriptor.
39
// SAFETY: Safe because `listener` is valid and the return value is checked.
40
let good_dup = UnixSeqpacketListener::bind(format!("/proc/self/fd/{}", unsafe {
41
libc::dup(listener.as_raw_descriptor())
42
}));
43
let good_dup_path = good_dup
44
.expect("failed to create dup UnixSeqpacketListener")
45
.path();
46
// Path of socket created by descriptor should be hidden.
47
assert!(good_dup_path.is_err());
48
// UnixSeqpacketListener must fail on an existing non-listener socket.
49
let s1 = UnixSeqpacket::connect(socket_path.as_path()).expect("UnixSeqpacket::connect failed");
50
// SAFETY: Safe because `s1` is valid and the return value is checked.
51
let bad_dup = UnixSeqpacketListener::bind(format!("/proc/self/fd/{}", unsafe {
52
libc::dup(s1.as_raw_descriptor())
53
}));
54
assert!(bad_dup.is_err());
55
}
56
57
#[test]
58
fn unix_seqpacket_path_exists_pass() {
59
let temp_dir = tempdir().expect("failed to create tempdir");
60
let socket_path = temp_dir.path().join("path_to_socket");
61
let _listener = UnlinkUnixSeqpacketListener(
62
UnixSeqpacketListener::bind(&socket_path).expect("failed to create UnixSeqpacketListener"),
63
);
64
let _res =
65
UnixSeqpacket::connect(socket_path.as_path()).expect("UnixSeqpacket::connect failed");
66
}
67
68
#[test]
69
fn unix_seqpacket_path_listener_accept_with_timeout() {
70
let temp_dir = tempdir().expect("failed to create tempdir");
71
let socket_path = temp_dir.path().join("path_listerner_accept_with_timeout");
72
let listener = UnlinkUnixSeqpacketListener(
73
UnixSeqpacketListener::bind(&socket_path).expect("failed to create UnixSeqpacketListener"),
74
);
75
76
for d in [Duration::from_millis(10), Duration::ZERO] {
77
let _ = listener.accept_with_timeout(d).expect_err(&format!(
78
"UnixSeqpacket::accept_with_timeout {d:?} connected"
79
));
80
81
let s1 = UnixSeqpacket::connect(socket_path.as_path())
82
.unwrap_or_else(|_| panic!("UnixSeqpacket::connect {d:?} failed"));
83
84
let s2 = listener
85
.accept_with_timeout(d)
86
.unwrap_or_else(|_| panic!("UnixSeqpacket::accept {d:?} failed"));
87
88
let data1 = &[0, 1, 2, 3, 4];
89
let data2 = &[10, 11, 12, 13, 14];
90
s2.send(data2).expect("failed to send data2");
91
s1.send(data1).expect("failed to send data1");
92
let recv_data = &mut [0; 5];
93
s2.recv(recv_data).expect("failed to recv data");
94
assert_eq!(data1, recv_data);
95
s1.recv(recv_data).expect("failed to recv data");
96
assert_eq!(data2, recv_data);
97
}
98
}
99
100
#[test]
101
fn unix_seqpacket_path_listener_accept() {
102
let temp_dir = tempdir().expect("failed to create tempdir");
103
let socket_path = temp_dir.path().join("path_listerner_accept");
104
let listener = UnlinkUnixSeqpacketListener(
105
UnixSeqpacketListener::bind(&socket_path).expect("failed to create UnixSeqpacketListener"),
106
);
107
let s1 = UnixSeqpacket::connect(socket_path.as_path()).expect("UnixSeqpacket::connect failed");
108
109
let s2 = listener.accept().expect("UnixSeqpacket::accept failed");
110
111
let data1 = &[0, 1, 2, 3, 4];
112
let data2 = &[10, 11, 12, 13, 14];
113
s2.send(data2).expect("failed to send data2");
114
s1.send(data1).expect("failed to send data1");
115
let recv_data = &mut [0; 5];
116
s2.recv(recv_data).expect("failed to recv data");
117
assert_eq!(data1, recv_data);
118
s1.recv(recv_data).expect("failed to recv data");
119
assert_eq!(data2, recv_data);
120
}
121
122
#[test]
123
fn unix_seqpacket_zero_timeout() {
124
let (s1, _s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
125
// Timeouts less than a microsecond are too small and round to zero.
126
s1.set_read_timeout(Some(Duration::from_nanos(10)))
127
.expect_err("successfully set zero timeout");
128
}
129
130
#[test]
131
fn unix_seqpacket_read_timeout() {
132
let (s1, _s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
133
s1.set_read_timeout(Some(Duration::from_millis(1)))
134
.expect("failed to set read timeout for socket");
135
let _ = s1.recv(&mut [0]);
136
}
137
138
#[test]
139
fn unix_seqpacket_write_timeout() {
140
let (s1, _s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
141
s1.set_write_timeout(Some(Duration::from_millis(1)))
142
.expect("failed to set write timeout for socket");
143
}
144
145
#[test]
146
fn unix_seqpacket_send_recv() {
147
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
148
let data1 = &[0, 1, 2, 3, 4];
149
let data2 = &[10, 11, 12, 13, 14];
150
s2.send(data2).expect("failed to send data2");
151
s1.send(data1).expect("failed to send data1");
152
let recv_data = &mut [0; 5];
153
s2.recv(recv_data).expect("failed to recv data");
154
assert_eq!(data1, recv_data);
155
s1.recv(recv_data).expect("failed to recv data");
156
assert_eq!(data2, recv_data);
157
}
158
159
#[test]
160
fn unix_seqpacket_send_fragments() {
161
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
162
let data1 = &[0, 1, 2, 3, 4];
163
let data2 = &[10, 11, 12, 13, 14, 15, 16];
164
s1.send(data1).expect("failed to send data1");
165
s1.send(data2).expect("failed to send data2");
166
167
let recv_data = &mut [0; 32];
168
let size = s2.recv(recv_data).expect("failed to recv data");
169
assert_eq!(size, data1.len());
170
assert_eq!(data1, &recv_data[0..size]);
171
172
let size = s2.recv(recv_data).expect("failed to recv data");
173
assert_eq!(size, data2.len());
174
assert_eq!(data2, &recv_data[0..size]);
175
}
176
177
#[test]
178
fn unix_seqpacket_get_readable_bytes() {
179
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
180
assert_eq!(s1.get_readable_bytes().unwrap(), 0);
181
assert_eq!(s2.get_readable_bytes().unwrap(), 0);
182
let data1 = &[0, 1, 2, 3, 4];
183
s1.send(data1).expect("failed to send data");
184
185
assert_eq!(s1.get_readable_bytes().unwrap(), 0);
186
assert_eq!(s2.get_readable_bytes().unwrap(), data1.len());
187
188
let recv_data = &mut [0; 5];
189
s2.recv(recv_data).expect("failed to recv data");
190
assert_eq!(s1.get_readable_bytes().unwrap(), 0);
191
assert_eq!(s2.get_readable_bytes().unwrap(), 0);
192
}
193
194
#[test]
195
fn unix_seqpacket_next_packet_size() {
196
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
197
let data1 = &[0, 1, 2, 3, 4];
198
s1.send(data1).expect("failed to send data");
199
200
assert_eq!(s2.next_packet_size().unwrap(), 5);
201
s1.set_read_timeout(Some(Duration::from_micros(1)))
202
.expect("failed to set read timeout");
203
assert_eq!(
204
s1.next_packet_size().unwrap_err().kind(),
205
ErrorKind::WouldBlock
206
);
207
drop(s2);
208
assert_eq!(
209
s1.next_packet_size().unwrap_err().kind(),
210
ErrorKind::ConnectionReset
211
);
212
}
213
214
#[test]
215
fn unix_seqpacket_recv_to_vec() {
216
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
217
let data1 = &[0, 1, 2, 3, 4];
218
s1.send(data1).expect("failed to send data");
219
220
let recv_data = &mut vec![];
221
s2.recv_to_vec(recv_data).expect("failed to recv data");
222
assert_eq!(recv_data, &mut vec![0, 1, 2, 3, 4]);
223
}
224
225
#[test]
226
fn unix_seqpacket_recv_as_vec() {
227
let (s1, s2) = UnixSeqpacket::pair().expect("failed to create socket pair");
228
let data1 = &[0, 1, 2, 3, 4];
229
s1.send(data1).expect("failed to send data");
230
231
let recv_data = s2.recv_as_vec().expect("failed to recv data");
232
assert_eq!(recv_data, vec![0, 1, 2, 3, 4]);
233
}
234
235