1use crate::LoggingFixture;
6use async_trait::async_trait;
7use fidl::HandleBased;
8
9fn reverse<T>(value: (T, T)) -> (T, T) {
10 (value.1, value.0)
11}
12
13fn maybe_reverse<T>(really_do_it: bool, value: (T, T)) -> (T, T) {
14 if really_do_it {
15 (value.1, value.0)
16 } else {
17 (value.0, value.1)
18 }
19}
20
21pub enum CreateHandlePurpose {
22 PrimaryTestChannel,
23 PayloadChannel,
24}
25
26#[async_trait]
27pub trait Fixture: LoggingFixture {
28 async fn create_handles(&self, purpose: CreateHandlePurpose) -> (fidl::Channel, fidl::Channel);
29}
30
31#[derive(Clone, Copy)]
32enum AfterSend {
33 RemainOpen,
34 CloseSender,
35}
36
37async fn send_message(
38 fixture: &mut impl LoggingFixture,
39 channels: (fidl::Channel, fidl::Channel),
40 after_send: AfterSend,
41 mut out: Vec<(&[u8], &mut Vec<fidl::Handle>)>,
42) {
43 let channels = (
44 fidl::AsyncChannel::from_channel(channels.0),
45 fidl::AsyncChannel::from_channel(channels.1),
46 );
47 let num_handles_in: Vec<_> = out.iter().map(|(_, handles)| handles.len()).collect();
48 for (out_bytes, handles) in out.iter_mut() {
49 fixture.log(&format!(
50 "# send message from {:?} to {:?}: {:?}, {:?}",
51 channels.0, channels.1, out_bytes, handles
52 ));
53 assert_eq!(channels.0.write(out_bytes, *handles), Ok(()));
54 }
55 match after_send {
56 AfterSend::RemainOpen => (),
57 AfterSend::CloseSender => drop(channels.0),
58 }
59 for ((out_bytes, out_handles), num_handles_in) in out.iter_mut().zip(num_handles_in) {
60 let mut msg = fidl::MessageBufEtc::new();
61 channels.1.recv_etc_msg(&mut msg).await.unwrap();
64 let (bytes, handles) = msg.split_mut();
65 assert_eq!(bytes.as_slice(), *out_bytes);
66 assert_eq!(handles.len(), num_handles_in);
67 for i in 0..handles.len() {
68 std::mem::swap(&mut handles[i].handle, &mut out_handles[i]);
69 }
70 }
71}
72
73async fn send_channel(
74 fixture: &mut impl LoggingFixture,
75 first: (fidl::Channel, fidl::Channel),
76 second: (fidl::Channel, fidl::Channel),
77 after_send_first: AfterSend,
78 after_send_second: AfterSend,
79) {
80 let mut second_b = vec![second.1.into_handle()];
81 send_message(fixture, first, after_send_first, vec![(&[], &mut second_b)]).await;
82 send_message(
83 fixture,
84 (second.0, fidl::Channel::from_handle(second_b.into_iter().next().unwrap())),
85 after_send_second,
86 vec![(&[100, 101, 102, 103, 104], &mut vec![])],
87 )
88 .await;
89}
90
91pub async fn run(mut fixture: impl Fixture) {
92 fixture.log(&format!("# send message a->b"));
93 let channels = fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await;
94 send_message(&mut fixture, channels, AfterSend::RemainOpen, vec![(&[1, 2, 3], &mut vec![])])
95 .await;
96 fixture.log(&format!("# send message b->a"));
97 let channels = reverse(fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await);
98 send_message(&mut fixture, channels, AfterSend::RemainOpen, vec![(&[7, 8, 9], &mut vec![])])
99 .await;
100
101 fixture.log(&format!("# send message then close a->b"));
102 let channels = fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await;
103 send_message(&mut fixture, channels, AfterSend::CloseSender, vec![(&[1, 2, 3], &mut vec![])])
104 .await;
105 fixture.log(&format!("# send message then close b->a"));
106 let channels = reverse(fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await);
107 send_message(&mut fixture, channels, AfterSend::CloseSender, vec![(&[7, 8, 9], &mut vec![])])
108 .await;
109
110 for reverse_ab in [false, true].iter() {
111 for reverse_cd in [false, true].iter() {
112 for after_send_ab in [AfterSend::RemainOpen, AfterSend::CloseSender].iter() {
113 for after_send_cd in [AfterSend::RemainOpen, AfterSend::CloseSender].iter() {
114 fixture.log(&format!(
115 "# send channel {}{}; {}{}",
116 match after_send_ab {
117 AfterSend::RemainOpen => "",
118 AfterSend::CloseSender => "then close ",
119 },
120 match reverse_ab {
121 false => "a->b",
122 true => "b->a",
123 },
124 match after_send_cd {
125 AfterSend::RemainOpen => "",
126 AfterSend::CloseSender => "then close ",
127 },
128 match reverse_ab {
129 false => "c->d",
130 true => "d->c",
131 }
132 ));
133 let ab = fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await;
134 let cd = fixture.create_handles(CreateHandlePurpose::PayloadChannel).await;
135 send_channel(
136 &mut fixture,
137 maybe_reverse(*reverse_ab, ab),
138 maybe_reverse(*reverse_cd, cd),
139 *after_send_ab,
140 *after_send_cd,
141 )
142 .await;
143 }
144 }
145 }
146 }
147
148 let channels = fixture.create_handles(CreateHandlePurpose::PrimaryTestChannel).await;
150 send_message(
151 &mut fixture,
152 channels,
153 AfterSend::CloseSender,
154 vec![
155 (&[0], &mut vec![]),
156 (&[1], &mut vec![]),
157 (&[2], &mut vec![]),
158 (&[3], &mut vec![]),
159 (&[4], &mut vec![]),
160 (&[5], &mut vec![]),
161 (&[6], &mut vec![]),
162 (&[7], &mut vec![]),
163 (&[8], &mut vec![]),
164 (&[9], &mut vec![]),
165 (&[10], &mut vec![]),
166 (&[11], &mut vec![]),
167 (&[12], &mut vec![]),
168 (&[13], &mut vec![]),
169 (&[14], &mut vec![]),
170 (&[15], &mut vec![]),
171 (&[16], &mut vec![]),
172 (&[17], &mut vec![]),
173 (&[18], &mut vec![]),
174 (&[19], &mut vec![]),
175 (&[20], &mut vec![]),
176 (&[21], &mut vec![]),
177 (&[22], &mut vec![]),
178 (&[23], &mut vec![]),
179 (&[24], &mut vec![]),
180 (&[25], &mut vec![]),
181 (&[26], &mut vec![]),
182 (&[27], &mut vec![]),
183 (&[28], &mut vec![]),
184 (&[29], &mut vec![]),
185 (&[30], &mut vec![]),
186 (&[31], &mut vec![]),
187 (&[32], &mut vec![]),
188 (&[33], &mut vec![]),
189 (&[34], &mut vec![]),
190 (&[35], &mut vec![]),
191 (&[36], &mut vec![]),
192 (&[37], &mut vec![]),
193 (&[38], &mut vec![]),
194 (&[39], &mut vec![]),
195 (&[40], &mut vec![]),
196 (&[41], &mut vec![]),
197 (&[42], &mut vec![]),
198 (&[43], &mut vec![]),
199 (&[44], &mut vec![]),
200 (&[45], &mut vec![]),
201 (&[46], &mut vec![]),
202 (&[47], &mut vec![]),
203 (&[48], &mut vec![]),
204 (&[49], &mut vec![]),
205 (&[50], &mut vec![]),
206 (&[51], &mut vec![]),
207 (&[52], &mut vec![]),
208 (&[53], &mut vec![]),
209 (&[54], &mut vec![]),
210 (&[55], &mut vec![]),
211 (&[56], &mut vec![]),
212 (&[57], &mut vec![]),
213 (&[58], &mut vec![]),
214 (&[59], &mut vec![]),
215 (&[60], &mut vec![]),
216 (&[61], &mut vec![]),
217 (&[62], &mut vec![]),
218 (&[63], &mut vec![]),
219 (&[64], &mut vec![]),
220 (&[65], &mut vec![]),
221 (&[66], &mut vec![]),
222 (&[67], &mut vec![]),
223 (&[68], &mut vec![]),
224 (&[69], &mut vec![]),
225 (&[70], &mut vec![]),
226 (&[71], &mut vec![]),
227 (&[72], &mut vec![]),
228 (&[73], &mut vec![]),
229 (&[74], &mut vec![]),
230 (&[75], &mut vec![]),
231 (&[76], &mut vec![]),
232 (&[77], &mut vec![]),
233 (&[78], &mut vec![]),
234 (&[79], &mut vec![]),
235 (&[80], &mut vec![]),
236 (&[81], &mut vec![]),
237 (&[82], &mut vec![]),
238 (&[83], &mut vec![]),
239 (&[84], &mut vec![]),
240 (&[85], &mut vec![]),
241 (&[86], &mut vec![]),
242 (&[87], &mut vec![]),
243 (&[88], &mut vec![]),
244 (&[89], &mut vec![]),
245 (&[90], &mut vec![]),
246 (&[91], &mut vec![]),
247 (&[92], &mut vec![]),
248 (&[93], &mut vec![]),
249 (&[94], &mut vec![]),
250 (&[95], &mut vec![]),
251 (&[96], &mut vec![]),
252 (&[97], &mut vec![]),
253 (&[98], &mut vec![]),
254 (&[99], &mut vec![]),
255 (&[100], &mut vec![]),
256 (&[101], &mut vec![]),
257 (&[102], &mut vec![]),
258 (&[103], &mut vec![]),
259 (&[104], &mut vec![]),
260 (&[105], &mut vec![]),
261 (&[106], &mut vec![]),
262 (&[107], &mut vec![]),
263 (&[108], &mut vec![]),
264 (&[109], &mut vec![]),
265 (&[110], &mut vec![]),
266 (&[111], &mut vec![]),
267 (&[112], &mut vec![]),
268 (&[113], &mut vec![]),
269 (&[114], &mut vec![]),
270 (&[115], &mut vec![]),
271 (&[116], &mut vec![]),
272 (&[117], &mut vec![]),
273 (&[118], &mut vec![]),
274 (&[119], &mut vec![]),
275 (&[120], &mut vec![]),
276 (&[121], &mut vec![]),
277 (&[122], &mut vec![]),
278 (&[123], &mut vec![]),
279 (&[124], &mut vec![]),
280 (&[125], &mut vec![]),
281 (&[126], &mut vec![]),
282 (&[127], &mut vec![]),
283 (&[128], &mut vec![]),
284 (&[129], &mut vec![]),
285 (&[130], &mut vec![]),
286 (&[131], &mut vec![]),
287 (&[132], &mut vec![]),
288 (&[133], &mut vec![]),
289 (&[134], &mut vec![]),
290 (&[135], &mut vec![]),
291 (&[136], &mut vec![]),
292 (&[137], &mut vec![]),
293 (&[138], &mut vec![]),
294 (&[139], &mut vec![]),
295 (&[140], &mut vec![]),
296 (&[141], &mut vec![]),
297 (&[142], &mut vec![]),
298 (&[143], &mut vec![]),
299 (&[144], &mut vec![]),
300 (&[145], &mut vec![]),
301 (&[146], &mut vec![]),
302 (&[147], &mut vec![]),
303 (&[148], &mut vec![]),
304 (&[149], &mut vec![]),
305 (&[150], &mut vec![]),
306 (&[151], &mut vec![]),
307 (&[152], &mut vec![]),
308 (&[153], &mut vec![]),
309 (&[154], &mut vec![]),
310 (&[155], &mut vec![]),
311 (&[156], &mut vec![]),
312 (&[157], &mut vec![]),
313 (&[158], &mut vec![]),
314 (&[159], &mut vec![]),
315 (&[160], &mut vec![]),
316 (&[161], &mut vec![]),
317 (&[162], &mut vec![]),
318 (&[163], &mut vec![]),
319 (&[164], &mut vec![]),
320 (&[165], &mut vec![]),
321 (&[166], &mut vec![]),
322 (&[167], &mut vec![]),
323 (&[168], &mut vec![]),
324 (&[169], &mut vec![]),
325 (&[170], &mut vec![]),
326 (&[171], &mut vec![]),
327 (&[172], &mut vec![]),
328 (&[173], &mut vec![]),
329 (&[174], &mut vec![]),
330 (&[175], &mut vec![]),
331 (&[176], &mut vec![]),
332 (&[177], &mut vec![]),
333 (&[178], &mut vec![]),
334 (&[179], &mut vec![]),
335 (&[180], &mut vec![]),
336 (&[181], &mut vec![]),
337 (&[182], &mut vec![]),
338 (&[183], &mut vec![]),
339 (&[184], &mut vec![]),
340 (&[185], &mut vec![]),
341 (&[186], &mut vec![]),
342 (&[187], &mut vec![]),
343 (&[188], &mut vec![]),
344 (&[189], &mut vec![]),
345 (&[190], &mut vec![]),
346 (&[191], &mut vec![]),
347 (&[192], &mut vec![]),
348 (&[193], &mut vec![]),
349 (&[194], &mut vec![]),
350 (&[195], &mut vec![]),
351 (&[196], &mut vec![]),
352 (&[197], &mut vec![]),
353 (&[198], &mut vec![]),
354 (&[199], &mut vec![]),
355 (&[200], &mut vec![]),
356 (&[201], &mut vec![]),
357 (&[202], &mut vec![]),
358 (&[203], &mut vec![]),
359 (&[204], &mut vec![]),
360 (&[205], &mut vec![]),
361 (&[206], &mut vec![]),
362 (&[207], &mut vec![]),
363 (&[208], &mut vec![]),
364 (&[209], &mut vec![]),
365 (&[210], &mut vec![]),
366 (&[211], &mut vec![]),
367 (&[212], &mut vec![]),
368 (&[213], &mut vec![]),
369 (&[214], &mut vec![]),
370 (&[215], &mut vec![]),
371 (&[216], &mut vec![]),
372 (&[217], &mut vec![]),
373 (&[218], &mut vec![]),
374 (&[219], &mut vec![]),
375 (&[220], &mut vec![]),
376 (&[221], &mut vec![]),
377 (&[222], &mut vec![]),
378 (&[223], &mut vec![]),
379 (&[224], &mut vec![]),
380 (&[225], &mut vec![]),
381 (&[226], &mut vec![]),
382 (&[227], &mut vec![]),
383 (&[228], &mut vec![]),
384 (&[229], &mut vec![]),
385 (&[230], &mut vec![]),
386 (&[231], &mut vec![]),
387 (&[232], &mut vec![]),
388 (&[233], &mut vec![]),
389 (&[234], &mut vec![]),
390 (&[235], &mut vec![]),
391 (&[236], &mut vec![]),
392 (&[237], &mut vec![]),
393 (&[238], &mut vec![]),
394 (&[239], &mut vec![]),
395 (&[240], &mut vec![]),
396 (&[241], &mut vec![]),
397 (&[242], &mut vec![]),
398 (&[243], &mut vec![]),
399 (&[244], &mut vec![]),
400 (&[245], &mut vec![]),
401 (&[246], &mut vec![]),
402 (&[247], &mut vec![]),
403 (&[248], &mut vec![]),
404 (&[249], &mut vec![]),
405 (&[250], &mut vec![]),
406 (&[251], &mut vec![]),
407 (&[252], &mut vec![]),
408 (&[253], &mut vec![]),
409 (&[254], &mut vec![]),
410 (&[255], &mut vec![]),
411 ],
412 )
413 .await;
414}
415
416#[cfg(test)]
417mod test {
418 use super::*;
419
420 struct FidlFixture;
421
422 #[async_trait]
423 impl Fixture for FidlFixture {
424 async fn create_handles(&self, _: CreateHandlePurpose) -> (fidl::Channel, fidl::Channel) {
425 fidl::Channel::create()
426 }
427 }
428
429 impl LoggingFixture for FidlFixture {
430 fn log(&mut self, msg: &str) {
431 println!("{}", msg);
432 }
433 }
434
435 #[fuchsia_async::run_singlethreaded(test)]
436 async fn tests() {
437 run(FidlFixture).await
438 }
439}