fidl_handle_tests/
channel.rs

1// Copyright 2020 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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        // other channel should eventually receive the message, but we allow that propagation
62        // need not be instant
63        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    // Verify a very large send (just bytes to simplify the test for now)
149    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}