Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/base/tests/linux/tube.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::time;
6
7
use base::deserialize_with_descriptors;
8
use base::EventContext;
9
use base::EventToken;
10
use base::FromRawDescriptor;
11
use base::ReadNotifier;
12
use base::SafeDescriptor;
13
use base::SerializeDescriptors;
14
use base::Tube;
15
use base::UnixSeqpacket;
16
17
#[derive(EventToken, Debug, Eq, PartialEq, Copy, Clone)]
18
enum Token {
19
ReceivedData,
20
}
21
22
const EVENT_WAIT_TIME: time::Duration = time::Duration::from_secs(10);
23
24
#[test]
25
fn test_serialize_tube_pair() {
26
let (tube_send, tube_recv) = Tube::pair().unwrap();
27
28
// Serialize the Tube
29
let msg_serialize = SerializeDescriptors::new(&tube_send);
30
let serialized = serde_json::to_vec(&msg_serialize).unwrap();
31
let msg_descriptors = msg_serialize.into_descriptors();
32
33
// Deserialize the Tube
34
let msg_descriptors_safe = msg_descriptors.into_iter().map(|v|
35
// SAFETY: Safe because `v` is a valid descriptor
36
unsafe { SafeDescriptor::from_raw_descriptor(v) });
37
let tube_deserialized: Tube =
38
deserialize_with_descriptors(|| serde_json::from_slice(&serialized), msg_descriptors_safe)
39
.unwrap();
40
41
// Send a message through deserialized Tube
42
tube_deserialized.send(&"hi".to_string()).unwrap();
43
44
// Wait for the message to arrive
45
let event_ctx: EventContext<Token> =
46
EventContext::build_with(&[(tube_recv.get_read_notifier(), Token::ReceivedData)]).unwrap();
47
let events = event_ctx.wait_timeout(EVENT_WAIT_TIME).unwrap();
48
let tokens: Vec<Token> = events
49
.iter()
50
.filter(|e| e.is_readable)
51
.map(|e| e.token)
52
.collect();
53
assert_eq!(tokens, vec! {Token::ReceivedData});
54
55
assert_eq!(tube_recv.recv::<String>().unwrap(), "hi");
56
}
57
58
#[test]
59
fn test_send_recv_from_seqpacket() {
60
let (sock_send, sock_recv) = UnixSeqpacket::pair().unwrap();
61
let tube_send = Tube::try_from(sock_send).unwrap();
62
let tube_recv = Tube::try_from(sock_recv).unwrap();
63
64
tube_send.send(&"hi".to_string()).unwrap();
65
66
// Wait for the message to arrive
67
let event_ctx: EventContext<Token> =
68
EventContext::build_with(&[(tube_recv.get_read_notifier(), Token::ReceivedData)]).unwrap();
69
let events = event_ctx.wait_timeout(EVENT_WAIT_TIME).unwrap();
70
let tokens: Vec<Token> = events
71
.iter()
72
.filter(|e| e.is_readable)
73
.map(|e| e.token)
74
.collect();
75
assert_eq!(tokens, vec! {Token::ReceivedData});
76
77
assert_eq!(tube_recv.recv::<String>().unwrap(), "hi");
78
}
79
80