1 use std::{ffi::OsString, mem, thread, time::Duration};
2
3 use wayland_protocols::wlr::unstable::data_control::v1::server::zwlr_data_control_manager_v1::{
4 Request as ServerManagerRequest, ZwlrDataControlManagerV1 as ServerManager,
5 };
6 use wayland_server::{protocol::wl_seat::WlSeat as ServerSeat, Filter, Main};
7
8 use crate::{tests::TestServer, utils::*};
9
10 #[test]
is_primary_selection_supported_test()11 fn is_primary_selection_supported_test() {
12 let mut server = TestServer::new();
13 server.display
14 .create_global::<ServerSeat, _>(6, Filter::new(|_: (_, _), _, _| {}));
15 server.display.create_global::<ServerManager, _>(2,
16 Filter::new(|(manager, _): (Main<ServerManager>, _), _, _| {
17 manager.quick_assign(|_, request, _| match request {
18 ServerManagerRequest::GetDataDevice { id:
19 device,
20 .. } => {
21 device.primary_selection(None);
22 }
23 _ => unreachable!(),
24 });
25 }));
26
27 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
28 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
29
30 thread::sleep(Duration::from_millis(100));
31 server.answer();
32
33 thread::sleep(Duration::from_millis(100));
34 server.answer();
35
36 thread::sleep(Duration::from_millis(100));
37 server.answer();
38
39 let result = child.join().unwrap().unwrap();
40 assert_eq!(result, true);
41 }
42
43 #[test]
is_primary_selection_supported_primary_selection_unsupported()44 fn is_primary_selection_supported_primary_selection_unsupported() {
45 let mut server = TestServer::new();
46 server.display
47 .create_global::<ServerSeat, _>(6, Filter::new(|_: (_, _), _, _| {}));
48 server.display.create_global::<ServerManager, _>(2,
49 Filter::new(|(manager, _): (Main<ServerManager>, _), _, _| {
50 manager.quick_assign(|_, request, _| match request {
51 ServerManagerRequest::GetDataDevice { .. } => {
52 // Not sending primary_selection means it's not
53 // supported.
54 }
55 _ => unreachable!(),
56 });
57 }));
58
59 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
60 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
61
62 thread::sleep(Duration::from_millis(100));
63 server.answer();
64
65 thread::sleep(Duration::from_millis(100));
66 server.answer();
67
68 thread::sleep(Duration::from_millis(100));
69 server.answer();
70
71 let result = child.join().unwrap().unwrap();
72 assert_eq!(result, false);
73 }
74
75 #[test]
is_primary_selection_supported_data_control_v1()76 fn is_primary_selection_supported_data_control_v1() {
77 let mut server = TestServer::new();
78 server.display
79 .create_global::<ServerManager, _>(1, Filter::new(|_: (_, _), _, _| {}));
80
81 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
82 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
83
84 thread::sleep(Duration::from_millis(100));
85 server.answer();
86
87 thread::sleep(Duration::from_millis(100));
88 server.answer();
89
90 let result = child.join().unwrap().unwrap();
91 assert_eq!(result, false);
92 }
93
94 #[test]
is_primary_selection_supported_no_seats()95 fn is_primary_selection_supported_no_seats() {
96 let mut server = TestServer::new();
97 server.display
98 .create_global::<ServerManager, _>(2, Filter::new(|_: (_, _), _, _| {}));
99
100 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
101 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
102
103 thread::sleep(Duration::from_millis(100));
104 server.answer();
105
106 thread::sleep(Duration::from_millis(100));
107 server.answer();
108
109 let error = child.join().unwrap().unwrap_err();
110 if let PrimarySelectionCheckError::NoSeats = error {
111 // Pass
112 } else {
113 panic!("Invalid error: {:?}", error);
114 }
115 }
116
117 #[test]
supports_v2_seats()118 fn supports_v2_seats() {
119 let mut server = TestServer::new();
120 server.display
121 .create_global::<ServerSeat, _>(2, Filter::new(|_: (_, _), _, _| {}));
122 server.display.create_global::<ServerManager, _>(2,
123 Filter::new(|(manager, _): (Main<ServerManager>, _), _, _| {
124 manager.quick_assign(|_, _, _| {})
125 }));
126
127 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
128 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
129
130 thread::sleep(Duration::from_millis(100));
131 server.answer();
132
133 thread::sleep(Duration::from_millis(100));
134 server.answer();
135
136 thread::sleep(Duration::from_millis(100));
137 server.answer();
138
139 let res = child.join().unwrap();
140 if let Err(PrimarySelectionCheckError::NoSeats) = res {
141 panic!("Invalid error: {:?}", res);
142 }
143 }
144
145 #[test]
is_primary_selection_supported_no_data_control()146 fn is_primary_selection_supported_no_data_control() {
147 let mut server = TestServer::new();
148
149 let socket_name = mem::replace(&mut server.socket_name, OsString::new());
150 let child = thread::spawn(move || is_primary_selection_supported_internal(Some(socket_name)));
151
152 thread::sleep(Duration::from_millis(100));
153 server.answer();
154
155 thread::sleep(Duration::from_millis(100));
156 server.answer();
157
158 let error = child.join().unwrap().unwrap_err();
159 if let PrimarySelectionCheckError::MissingProtocol { name, version } = error {
160 assert_eq!(name, "zwlr_data_control_manager_v1");
161 assert_eq!(version, 1);
162 } else {
163 panic!("Invalid error: {:?}", error);
164 }
165 }
166