1 #![allow(dead_code, non_snake_case)]
2 
3 use std::sync::Arc;
4 
5 use crate::protocol::{Argument, Message};
6 
7 use crate::rs::{client as client_rs, server as server_rs};
8 use crate::sys::{client as client_sys, server as server_sys};
9 
10 macro_rules! expand_test {
11     ($test_name:ident, $test_body:tt) => {
12         expand_test!(__list_expand, __no_panic, $test_name, $test_body);
13     };
14     (panic $test_name:ident, $test_body:tt) => {
15         expand_test!(__list_expand, __panic, $test_name, $test_body);
16     };
17     (__list_expand, $panic:tt, $test_name:ident, $test_body:tt) => {
18         expand_test!(__expand, $panic, $test_name, client_rs, server_rs, $test_body);
19         expand_test!(__expand, $panic, $test_name, client_sys, server_rs, $test_body);
20         expand_test!(__expand, $panic, $test_name, client_rs, server_sys, $test_body);
21         expand_test!(__expand, $panic, $test_name, client_sys, server_sys, $test_body);
22     };
23     (__expand, __panic, $test_name: ident, $client_backend: ty, $server_backend: ident, $test_body: tt) => {
24         concat_idents::concat_idents!(fn_name = $test_name, __, $client_backend, __, $server_backend {
25             #[test]
26             #[should_panic]
27             #[allow(unused_imports)]
28             fn fn_name() {
29                 let _ = env_logger::builder().is_test(true).try_init();
30                 use $client_backend as client_backend;
31                 use $server_backend as server_backend;
32                 $test_body
33             }
34         });
35     };
36     (__expand, __no_panic, $test_name: ident, $client_backend: ty, $server_backend: ident, $test_body: tt) => {
37         concat_idents::concat_idents!(fn_name = $test_name, __, $client_backend, __, $server_backend {
38             #[test]
39             #[allow(unused_imports)]
40             fn fn_name() {
41                 let _ = env_logger::builder().is_test(true).try_init();
42                 use $client_backend as client_backend;
43                 use $server_backend as server_backend;
44                 $test_body
45             }
46         });
47     };
48 }
49 
50 mod interfaces {
51     use crate as wayland_backend;
52     wayland_scanner::generate_interfaces!(
53         "../wayland-scanner/tests/scanner_assets/test-protocol.xml"
54     );
55 }
56 
57 mod destructors;
58 mod many_args;
59 mod object_args;
60 mod protocol_error;
61 mod server_created_objects;
62 mod sync;
63 
64 /*
65  * Assertion of Send/Sync for all relevant objects
66  */
67 
ensure_both<I: Send + Sync>()68 fn ensure_both<I: Send + Sync>() {}
69 
70 #[allow(dead_code)]
send_sync_client_rs()71 fn send_sync_client_rs() {
72     ensure_both::<client_rs::Backend>();
73     ensure_both::<client_rs::ObjectId>();
74 }
75 
76 #[allow(dead_code)]
send_sync_client_sys()77 fn send_sync_client_sys() {
78     ensure_both::<client_sys::Backend>();
79     ensure_both::<client_sys::ObjectId>();
80 }
81 
82 #[allow(dead_code)]
send_sync_server_rs()83 fn send_sync_server_rs() {
84     ensure_both::<server_rs::Backend<()>>();
85     ensure_both::<server_rs::ObjectId>();
86     ensure_both::<server_rs::GlobalId>();
87     ensure_both::<server_rs::ClientId>();
88 }
89 
90 #[allow(dead_code)]
send_sync_server_sys()91 fn send_sync_server_sys() {
92     ensure_both::<server_sys::Backend<()>>();
93     ensure_both::<server_sys::ObjectId>();
94     ensure_both::<server_sys::GlobalId>();
95     ensure_both::<server_sys::ClientId>();
96 }
97 
98 /*
99  * A "do nothing" data as a helper
100  */
101 struct DoNothingData;
102 
103 // Server Client Data
104 
105 impl<D> server_rs::ClientData<D> for DoNothingData {
initialized(&self, _: server_rs::ClientId)106     fn initialized(&self, _: server_rs::ClientId) {}
disconnected(&self, _: server_rs::ClientId, _: server_rs::DisconnectReason)107     fn disconnected(&self, _: server_rs::ClientId, _: server_rs::DisconnectReason) {}
108 }
109 
110 impl<D> server_sys::ClientData<D> for DoNothingData {
initialized(&self, _: server_sys::ClientId)111     fn initialized(&self, _: server_sys::ClientId) {}
disconnected(&self, _: server_sys::ClientId, _: server_rs::DisconnectReason)112     fn disconnected(&self, _: server_sys::ClientId, _: server_rs::DisconnectReason) {}
113 }
114 
115 // Server Global Handler
116 
117 impl<D> server_rs::GlobalHandler<D> for DoNothingData {
bind( self: Arc<Self>, _: &mut server_rs::Handle<D>, _: &mut D, _: server_rs::ClientId, _: server_rs::GlobalId, _: server_rs::ObjectId, ) -> Arc<dyn server_rs::ObjectData<D>>118     fn bind(
119         self: Arc<Self>,
120         _: &mut server_rs::Handle<D>,
121         _: &mut D,
122         _: server_rs::ClientId,
123         _: server_rs::GlobalId,
124         _: server_rs::ObjectId,
125     ) -> Arc<dyn server_rs::ObjectData<D>> {
126         self
127     }
128 }
129 
130 impl<D> server_sys::GlobalHandler<D> for DoNothingData {
bind( self: Arc<Self>, _: &mut server_sys::Handle<D>, _: &mut D, _: server_sys::ClientId, _: server_sys::GlobalId, _: server_sys::ObjectId, ) -> Arc<dyn server_sys::ObjectData<D>>131     fn bind(
132         self: Arc<Self>,
133         _: &mut server_sys::Handle<D>,
134         _: &mut D,
135         _: server_sys::ClientId,
136         _: server_sys::GlobalId,
137         _: server_sys::ObjectId,
138     ) -> Arc<dyn server_sys::ObjectData<D>> {
139         self
140     }
141 }
142 
143 // Server Object Data
144 
145 impl<D> server_rs::ObjectData<D> for DoNothingData {
request( self: Arc<Self>, _: &mut server_rs::Handle<D>, _: &mut D, _: server_rs::ClientId, _: Message<server_rs::ObjectId>, ) -> Option<Arc<dyn server_rs::ObjectData<D>>>146     fn request(
147         self: Arc<Self>,
148         _: &mut server_rs::Handle<D>,
149         _: &mut D,
150         _: server_rs::ClientId,
151         _: Message<server_rs::ObjectId>,
152     ) -> Option<Arc<dyn server_rs::ObjectData<D>>> {
153         None
154     }
155 
destroyed(&self, _: &mut D, _: server_rs::ClientId, _: server_rs::ObjectId)156     fn destroyed(&self, _: &mut D, _: server_rs::ClientId, _: server_rs::ObjectId) {}
157 }
158 
159 impl<D> server_sys::ObjectData<D> for DoNothingData {
request( self: Arc<Self>, _: &mut server_sys::Handle<D>, _: &mut D, _: server_sys::ClientId, _: Message<server_sys::ObjectId>, ) -> Option<Arc<dyn server_sys::ObjectData<D>>>160     fn request(
161         self: Arc<Self>,
162         _: &mut server_sys::Handle<D>,
163         _: &mut D,
164         _: server_sys::ClientId,
165         _: Message<server_sys::ObjectId>,
166     ) -> Option<Arc<dyn server_sys::ObjectData<D>>> {
167         None
168     }
169 
destroyed(&self, _: &mut D, _: server_sys::ClientId, _: server_sys::ObjectId)170     fn destroyed(&self, _: &mut D, _: server_sys::ClientId, _: server_sys::ObjectId) {}
171 }
172 
173 // Client Object Data
174 
175 impl client_rs::ObjectData for DoNothingData {
event( self: Arc<Self>, _: &mut client_rs::Handle, _: Message<client_rs::ObjectId>, ) -> Option<Arc<dyn client_rs::ObjectData>>176     fn event(
177         self: Arc<Self>,
178         _: &mut client_rs::Handle,
179         _: Message<client_rs::ObjectId>,
180     ) -> Option<Arc<dyn client_rs::ObjectData>> {
181         None
182     }
183 
destroyed(&self, _: client_rs::ObjectId)184     fn destroyed(&self, _: client_rs::ObjectId) {}
185 }
186 
187 impl client_sys::ObjectData for DoNothingData {
event( self: Arc<Self>, _: &mut client_sys::Handle, _: Message<client_sys::ObjectId>, ) -> Option<Arc<dyn client_sys::ObjectData>>188     fn event(
189         self: Arc<Self>,
190         _: &mut client_sys::Handle,
191         _: Message<client_sys::ObjectId>,
192     ) -> Option<Arc<dyn client_sys::ObjectData>> {
193         None
194     }
195 
destroyed(&self, _: client_sys::ObjectId)196     fn destroyed(&self, _: client_sys::ObjectId) {}
197 }
198