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