OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium 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 | |
5 //! Tests encoding and decoding functionality in the bindings package | |
6 //! | |
7 //! Test failure is defined as the function returning via panicking | |
8 //! and the result being caught in the test! macro. If a test function | |
9 //! returns without panicking, it is assumed to pass. | |
10 | |
11 #[macro_use] | |
12 extern crate mojo; | |
13 | |
14 use mojo::bindings::encoding::Context; | |
15 use mojo::bindings::message::MessageHeader; | |
16 use mojo::bindings::mojom::{MojomUnion, MojomPointer, MojomStruct, MojomInterfac
e}; | |
17 | |
18 use mojo::system; | |
19 use mojo::system::Handle; | |
20 | |
21 use std::collections::HashMap; | |
22 | |
23 #[macro_use] | |
24 mod util; | |
25 | |
26 use util::mojom_validation::*; | |
27 | |
28 /// This macro is a wrapper for the tests! macro as it takes advantage of the | |
29 /// shared code between tests. | |
30 /// | |
31 /// Given a test name, it will generate a test function. In this test function | |
32 /// we perform the following steps: | |
33 /// 1. Decode the header of the validation input. | |
34 /// 2. Verify the decoded header is what we expect. | |
35 /// 3. Decode the payload of the validation input. | |
36 /// 4. Verify the decoded payload is what we expect. | |
37 /// 5. Take the decoded payload and re-encode. | |
38 /// 6. Decode this re-encoded payload. | |
39 /// 7. Verify the re-decoded payload is what we expect. | |
40 /// | |
41 /// Each test should sufficiently verify the operation of the encoding and decod
ing | |
42 /// frameworks as we first verify the decoder works correctly on the "golden fil
es", | |
43 /// then verify that the encoder works by encoding the decoded output, and decod
ing | |
44 /// that once again. | |
45 macro_rules! encoding_tests { | |
46 ($($name:ident { MessageHeader => $header_cls:expr, $req_type:ident => $cls:
expr } )*) => { | |
47 tests! { | |
48 $( | |
49 fn $name() { | |
50 let data = include_str!(concat!("../../interfaces/bindings/tests
/data/validation/", | |
51 stringify!($name), | |
52 ".data")); | |
53 match util::parse_validation_test(data) { | |
54 Ok((mut data, num_handles)) => { | |
55 let mut mock_handles = Vec::with_capacity(num_handles); | |
56 for _ in 0..num_handles { | |
57 mock_handles.push(unsafe { system::acquire(0) }); | |
58 } | |
59 println!("{}: Decoding header", stringify!($name)); | |
60 let header = MessageHeader::deserialize(&mut data[..], V
ec::new()).expect("Should not error"); | |
61 let ctxt: Context = Default::default(); | |
62 let header_size = header.serialized_size(&ctxt); | |
63 let header_cls = $header_cls; | |
64 println!("{}: Verifying decoded header", stringify!($nam
e)); | |
65 header_cls(header); | |
66 let payload_buffer = &mut data[header_size..]; | |
67 let cls = $cls; | |
68 println!("{}: Decoding payload", stringify!($name)); | |
69 let decoded_payload = $req_type::deserialize(payload_buf
fer, mock_handles).expect("Should not error"); | |
70 println!("{}: Verifying decoded payload", stringify!($na
me)); | |
71 cls(&decoded_payload); | |
72 println!("{}: Re-encoding payload", stringify!($name)); | |
73 let (mut encoded_payload, handles) = decoded_payload.aut
o_serialize(); | |
74 println!("{}: Decoding payload again", stringify!($name)
); | |
75 let redecoded_payload = $req_type::deserialize(&mut enco
ded_payload[..], handles).expect("Should not error"); | |
76 println!("{}: Verifying decoded payload again", stringif
y!($name)); | |
77 cls(&redecoded_payload); | |
78 }, | |
79 Err(msg) => panic!("Error: {}", msg), | |
80 } | |
81 } | |
82 )* | |
83 } | |
84 } | |
85 } | |
86 | |
87 encoding_tests! { | |
88 conformance_mthd0_good { | |
89 MessageHeader => { | |
90 |header: MessageHeader| { | |
91 assert_eq!(header.version, 0); | |
92 assert_eq!(header.name, 0); | |
93 assert_eq!(header.flags, 0); | |
94 } | |
95 }, | |
96 ConformanceTestInterfaceMethod0Request => { | |
97 |payload: &ConformanceTestInterfaceMethod0Request| { | |
98 assert_eq!(payload.param0, -1.0); | |
99 } | |
100 } | |
101 } | |
102 conformance_mthd1_good { | |
103 MessageHeader => { | |
104 |header: MessageHeader| { | |
105 assert_eq!(header.version, 0); | |
106 assert_eq!(header.name, 1); | |
107 assert_eq!(header.flags, 0); | |
108 } | |
109 }, | |
110 ConformanceTestInterfaceMethod1Request => { | |
111 |payload: &ConformanceTestInterfaceMethod1Request| { | |
112 assert_eq!(payload.param0.i, 1234); | |
113 } | |
114 } | |
115 } | |
116 conformance_mthd2_good { | |
117 MessageHeader => { | |
118 |header: MessageHeader| { | |
119 assert_eq!(header.version, 0); | |
120 assert_eq!(header.name, 2); | |
121 assert_eq!(header.flags, 0); | |
122 } | |
123 }, | |
124 ConformanceTestInterfaceMethod2Request => { | |
125 |payload: &ConformanceTestInterfaceMethod2Request| { | |
126 assert_eq!(payload.param0.struct_a.i, 12345); | |
127 assert_eq!(payload.param1.i, 67890); | |
128 } | |
129 } | |
130 } | |
131 conformance_mthd3_good { | |
132 MessageHeader => { | |
133 |header: MessageHeader| { | |
134 assert_eq!(header.version, 0); | |
135 assert_eq!(header.name, 3); | |
136 assert_eq!(header.flags, 0); | |
137 } | |
138 }, | |
139 ConformanceTestInterfaceMethod3Request => { | |
140 |payload: &ConformanceTestInterfaceMethod3Request| { | |
141 assert_eq!(payload.param0, vec![true, false, true, false, | |
142 true, false, true, false, | |
143 true, true, true, true]); | |
144 } | |
145 } | |
146 } | |
147 conformance_mthd4_good { | |
148 MessageHeader => { | |
149 |header: MessageHeader| { | |
150 assert_eq!(header.version, 0); | |
151 assert_eq!(header.name, 4); | |
152 assert_eq!(header.flags, 0); | |
153 } | |
154 }, | |
155 ConformanceTestInterfaceMethod4Request => { | |
156 |payload: &ConformanceTestInterfaceMethod4Request| { | |
157 assert_eq!(payload.param0.data, vec![0, 1, 2]); | |
158 assert_eq!(payload.param1, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); | |
159 } | |
160 } | |
161 } | |
162 conformance_mthd5_good { | |
163 MessageHeader => { | |
164 |header: MessageHeader| { | |
165 assert_eq!(header.version, 0); | |
166 assert_eq!(header.name, 5); | |
167 assert_eq!(header.flags, 0); | |
168 } | |
169 }, | |
170 ConformanceTestInterfaceMethod5Request => { | |
171 |payload: &ConformanceTestInterfaceMethod5Request| { | |
172 assert_eq!(payload.param0.struct_d.message_pipes.len(), 2); | |
173 for h in payload.param0.struct_d.message_pipes.iter() { | |
174 assert_eq!(h.get_native_handle(), 0); | |
175 } | |
176 assert_eq!(payload.param0.data_pipe_consumer.get_native_handle()
, 0); | |
177 assert_eq!(payload.param1.get_native_handle(), 0); | |
178 } | |
179 } | |
180 } | |
181 conformance_mthd6_good { | |
182 MessageHeader => { | |
183 |header: MessageHeader| { | |
184 assert_eq!(header.version, 0); | |
185 assert_eq!(header.name, 6); | |
186 assert_eq!(header.flags, 0); | |
187 } | |
188 }, | |
189 ConformanceTestInterfaceMethod6Request => { | |
190 |payload: &ConformanceTestInterfaceMethod6Request| { | |
191 assert_eq!(payload.param0, vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8,
9]]); | |
192 } | |
193 } | |
194 } | |
195 conformance_mthd7_good { | |
196 MessageHeader => { | |
197 |header: MessageHeader| { | |
198 assert_eq!(header.version, 0); | |
199 assert_eq!(header.name, 7); | |
200 assert_eq!(header.flags, 0); | |
201 } | |
202 }, | |
203 ConformanceTestInterfaceMethod7Request => { | |
204 |payload: &ConformanceTestInterfaceMethod7Request| { | |
205 assert_eq!(payload.param0.fixed_size_array, [0, 1, 2]); | |
206 assert_eq!(payload.param1, [None, Some([0, 1, 2])]); | |
207 } | |
208 } | |
209 } | |
210 conformance_mthd8_good { | |
211 MessageHeader => { | |
212 |header: MessageHeader| { | |
213 assert_eq!(header.version, 0); | |
214 assert_eq!(header.name, 8); | |
215 assert_eq!(header.flags, 0); | |
216 } | |
217 }, | |
218 ConformanceTestInterfaceMethod8Request => { | |
219 |payload: &ConformanceTestInterfaceMethod8Request| { | |
220 assert_eq!(payload.param0, | |
221 vec![None, Some(vec![String::from_utf8(vec![0, 1, 2, 3, 4]).
unwrap()]), None]); | |
222 } | |
223 } | |
224 } | |
225 conformance_mthd9_good { | |
226 MessageHeader => { | |
227 |header: MessageHeader| { | |
228 assert_eq!(header.version, 0); | |
229 assert_eq!(header.name, 9); | |
230 assert_eq!(header.flags, 0); | |
231 } | |
232 }, | |
233 ConformanceTestInterfaceMethod9Request => { | |
234 |payload: &ConformanceTestInterfaceMethod9Request| { | |
235 assert!(payload.param0.is_some()); | |
236 if let Some(ref v) = payload.param0 { | |
237 assert_eq!(v.len(), 2); | |
238 assert_eq!(v[0].len(), 2); | |
239 assert_eq!(v[1].len(), 3); | |
240 assert!(v[0][0].is_some()); | |
241 assert!(v[0][1].is_none()); | |
242 assert!(v[1][0].is_some()); | |
243 assert!(v[1][1].is_none()); | |
244 assert!(v[1][2].is_some()); | |
245 assert_eq!(v[0][0].as_ref().unwrap().get_native_handle(), 0)
; | |
246 assert_eq!(v[1][0].as_ref().unwrap().get_native_handle(), 0)
; | |
247 assert_eq!(v[1][2].as_ref().unwrap().get_native_handle(), 0)
; | |
248 } | |
249 } | |
250 } | |
251 } | |
252 conformance_mthd9_good_null_array { | |
253 MessageHeader => { | |
254 |header: MessageHeader| { | |
255 assert_eq!(header.version, 0); | |
256 assert_eq!(header.name, 9); | |
257 assert_eq!(header.flags, 0); | |
258 } | |
259 }, | |
260 ConformanceTestInterfaceMethod9Request => { | |
261 |payload: &ConformanceTestInterfaceMethod9Request| { | |
262 assert!(payload.param0.is_none()); | |
263 } | |
264 } | |
265 } | |
266 conformance_mthd10_good { | |
267 MessageHeader => { | |
268 |header: MessageHeader| { | |
269 assert_eq!(header.version, 0); | |
270 assert_eq!(header.name, 10); | |
271 assert_eq!(header.flags, 0); | |
272 } | |
273 }, | |
274 ConformanceTestInterfaceMethod10Request => { | |
275 |payload: &ConformanceTestInterfaceMethod10Request| { | |
276 let mut map = HashMap::with_capacity(2); | |
277 map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); | |
278 map.insert(String::from_utf8(vec![5, 6, 7, 8, 9]).unwrap(), 2); | |
279 assert_eq!(payload.param0, map); | |
280 } | |
281 } | |
282 } | |
283 // Non-unique keys are strange... | |
284 // Right now, we handle them by silently overwriting. | |
285 // Maybe this will be an error in the future. | |
286 // The insert calls below reflect the duplicate keys that the | |
287 // test provides, and an example as to how overwriting happens. | |
288 conformance_mthd10_good_non_unique_keys { | |
289 MessageHeader => { | |
290 |header: MessageHeader| { | |
291 assert_eq!(header.version, 0); | |
292 assert_eq!(header.name, 10); | |
293 assert_eq!(header.flags, 0); | |
294 } | |
295 }, | |
296 ConformanceTestInterfaceMethod10Request => { | |
297 |payload: &ConformanceTestInterfaceMethod10Request| { | |
298 let mut map = HashMap::with_capacity(2); | |
299 map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); | |
300 map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 2); | |
301 assert_eq!(payload.param0, map); | |
302 } | |
303 } | |
304 } | |
305 conformance_mthd11_good_version0 { | |
306 MessageHeader => { | |
307 |header: MessageHeader| { | |
308 assert_eq!(header.version, 0); | |
309 assert_eq!(header.name, 11); | |
310 assert_eq!(header.flags, 0); | |
311 } | |
312 }, | |
313 ConformanceTestInterfaceMethod11Request => { | |
314 |payload: &ConformanceTestInterfaceMethod11Request| { | |
315 assert_eq!(payload.param0.i, 123); | |
316 assert_eq!(payload.param0.b, false); | |
317 assert!(payload.param0.struct_a.is_none()); | |
318 assert!(payload.param0.str.is_none()); | |
319 } | |
320 } | |
321 } | |
322 conformance_mthd11_good_version1 { | |
323 MessageHeader => { | |
324 |header: MessageHeader| { | |
325 assert_eq!(header.version, 0); | |
326 assert_eq!(header.name, 11); | |
327 assert_eq!(header.flags, 0); | |
328 } | |
329 }, | |
330 ConformanceTestInterfaceMethod11Request => { | |
331 |payload: &ConformanceTestInterfaceMethod11Request| { | |
332 assert_eq!(payload.param0.i, 123); | |
333 assert_eq!(payload.param0.b, false); | |
334 assert!(payload.param0.struct_a.is_none()); | |
335 assert!(payload.param0.str.is_none()); | |
336 } | |
337 } | |
338 } | |
339 conformance_mthd11_good_version2 { | |
340 MessageHeader => { | |
341 |header: MessageHeader| { | |
342 assert_eq!(header.version, 0); | |
343 assert_eq!(header.name, 11); | |
344 assert_eq!(header.flags, 0); | |
345 } | |
346 }, | |
347 ConformanceTestInterfaceMethod11Request => { | |
348 |payload: &ConformanceTestInterfaceMethod11Request| { | |
349 assert_eq!(payload.param0.i, 123); | |
350 assert_eq!(payload.param0.b, false); | |
351 assert!(payload.param0.struct_a.is_none()); | |
352 assert!(payload.param0.str.is_none()); | |
353 } | |
354 } | |
355 } | |
356 conformance_mthd11_good_version3 { | |
357 MessageHeader => { | |
358 |header: MessageHeader| { | |
359 assert_eq!(header.version, 0); | |
360 assert_eq!(header.name, 11); | |
361 assert_eq!(header.flags, 0); | |
362 } | |
363 }, | |
364 ConformanceTestInterfaceMethod11Request => { | |
365 |payload: &ConformanceTestInterfaceMethod11Request| { | |
366 assert_eq!(payload.param0.i, 123); | |
367 assert_eq!(payload.param0.b, true); | |
368 assert!(payload.param0.struct_a.is_none()); | |
369 assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]
).unwrap())); | |
370 } | |
371 } | |
372 } | |
373 conformance_mthd11_good_version_newer_than_known_1 { | |
374 MessageHeader => { | |
375 |header: MessageHeader| { | |
376 assert_eq!(header.version, 0); | |
377 assert_eq!(header.name, 11); | |
378 assert_eq!(header.flags, 0); | |
379 } | |
380 }, | |
381 ConformanceTestInterfaceMethod11Request => { | |
382 |payload: &ConformanceTestInterfaceMethod11Request| { | |
383 assert_eq!(payload.param0.i, 123); | |
384 assert_eq!(payload.param0.b, true); | |
385 assert!(payload.param0.struct_a.is_none()); | |
386 assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]
).unwrap())); | |
387 } | |
388 } | |
389 } | |
390 conformance_mthd11_good_version_newer_than_known_2 { | |
391 MessageHeader => { | |
392 |header: MessageHeader| { | |
393 assert_eq!(header.version, 0); | |
394 assert_eq!(header.name, 11); | |
395 assert_eq!(header.flags, 0); | |
396 } | |
397 }, | |
398 ConformanceTestInterfaceMethod11Request => { | |
399 |payload: &ConformanceTestInterfaceMethod11Request| { | |
400 assert_eq!(payload.param0.i, 123); | |
401 assert_eq!(payload.param0.b, true); | |
402 assert!(payload.param0.struct_a.is_none()); | |
403 assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]
).unwrap())); | |
404 } | |
405 } | |
406 } | |
407 conformance_mthd13_good_1 { | |
408 MessageHeader => { | |
409 |header: MessageHeader| { | |
410 assert_eq!(header.version, 0); | |
411 assert_eq!(header.name, 13); | |
412 assert_eq!(header.flags, 0); | |
413 } | |
414 }, | |
415 ConformanceTestInterfaceMethod13Request => { | |
416 |payload: &ConformanceTestInterfaceMethod13Request| { | |
417 assert!(payload.param0.is_none()); | |
418 assert_eq!(payload.param1, 65535); | |
419 assert!(payload.param2.is_none()); | |
420 } | |
421 } | |
422 } | |
423 conformance_mthd13_good_2 { | |
424 MessageHeader => { | |
425 |header: MessageHeader| { | |
426 assert_eq!(header.version, 0); | |
427 assert_eq!(header.name, 13); | |
428 assert_eq!(header.flags, 0); | |
429 } | |
430 }, | |
431 ConformanceTestInterfaceMethod13Request => { | |
432 |payload: &ConformanceTestInterfaceMethod13Request| { | |
433 assert!(payload.param0.is_some()); | |
434 assert_eq!(payload.param0.as_ref().unwrap().pipe().get_native_ha
ndle(), 0); | |
435 assert_eq!(payload.param1, 65535); | |
436 assert!(payload.param2.is_some()); | |
437 assert_eq!(payload.param2.as_ref().unwrap().pipe().get_native_ha
ndle(), 0); | |
438 } | |
439 } | |
440 } | |
441 conformance_mthd14_good_1 { | |
442 MessageHeader => { | |
443 |header: MessageHeader| { | |
444 assert_eq!(header.version, 0); | |
445 assert_eq!(header.name, 14); | |
446 assert_eq!(header.flags, 0); | |
447 } | |
448 }, | |
449 ConformanceTestInterfaceMethod14Request => { | |
450 |payload: &ConformanceTestInterfaceMethod14Request| { | |
451 match payload.param0 { | |
452 UnionA::a(ref val) => assert_eq!(*val, 54), | |
453 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
454 } | |
455 } | |
456 } | |
457 } | |
458 conformance_mthd14_good_array_in_union { | |
459 MessageHeader => { | |
460 |header: MessageHeader| { | |
461 assert_eq!(header.version, 0); | |
462 assert_eq!(header.name, 14); | |
463 assert_eq!(header.flags, 0); | |
464 } | |
465 }, | |
466 ConformanceTestInterfaceMethod14Request => { | |
467 |payload: &ConformanceTestInterfaceMethod14Request| { | |
468 match payload.param0 { | |
469 UnionA::d(ref val) => assert_eq!(*val, Some(vec![0, 1, 2])), | |
470 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
471 } | |
472 } | |
473 } | |
474 } | |
475 conformance_mthd14_good_map_in_union { | |
476 MessageHeader => { | |
477 |header: MessageHeader| { | |
478 assert_eq!(header.version, 0); | |
479 assert_eq!(header.name, 14); | |
480 assert_eq!(header.flags, 0); | |
481 } | |
482 }, | |
483 ConformanceTestInterfaceMethod14Request => { | |
484 |payload: &ConformanceTestInterfaceMethod14Request| { | |
485 let mut map = HashMap::with_capacity(2); | |
486 map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); | |
487 map.insert(String::from_utf8(vec![5, 6, 7, 8, 9]).unwrap(), 2); | |
488 match payload.param0 { | |
489 UnionA::e(ref val) => assert_eq!(*val, Some(map)), | |
490 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
491 } | |
492 } | |
493 } | |
494 } | |
495 conformance_mthd14_good_nested_union { | |
496 MessageHeader => { | |
497 |header: MessageHeader| { | |
498 assert_eq!(header.version, 0); | |
499 assert_eq!(header.name, 14); | |
500 assert_eq!(header.flags, 0); | |
501 } | |
502 }, | |
503 ConformanceTestInterfaceMethod14Request => { | |
504 |payload: &ConformanceTestInterfaceMethod14Request| { | |
505 match payload.param0 { | |
506 UnionA::f(ref val) => { | |
507 assert!(val.is_some()); | |
508 let inner = val.as_ref().unwrap(); | |
509 match *inner { | |
510 UnionB::b(inner_val) => assert_eq!(inner_val, 10), | |
511 _ => panic!("Incorrect inner union variant! Tag foun
d: {}", inner.get_tag()), | |
512 } | |
513 }, | |
514 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
515 } | |
516 } | |
517 } | |
518 } | |
519 conformance_mthd14_good_null_array_in_union { | |
520 MessageHeader => { | |
521 |header: MessageHeader| { | |
522 assert_eq!(header.version, 0); | |
523 assert_eq!(header.name, 14); | |
524 assert_eq!(header.flags, 0); | |
525 } | |
526 }, | |
527 ConformanceTestInterfaceMethod14Request => { | |
528 |payload: &ConformanceTestInterfaceMethod14Request| { | |
529 match payload.param0 { | |
530 UnionA::d(ref val) => assert_eq!(*val, None), | |
531 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
532 } | |
533 } | |
534 } | |
535 } | |
536 conformance_mthd14_good_null_map_in_union { | |
537 MessageHeader => { | |
538 |header: MessageHeader| { | |
539 assert_eq!(header.version, 0); | |
540 assert_eq!(header.name, 14); | |
541 assert_eq!(header.flags, 0); | |
542 } | |
543 }, | |
544 ConformanceTestInterfaceMethod14Request => { | |
545 |payload: &ConformanceTestInterfaceMethod14Request| { | |
546 match payload.param0 { | |
547 UnionA::e(ref val) => assert_eq!(*val, None), | |
548 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
549 } | |
550 } | |
551 } | |
552 } | |
553 conformance_mthd14_good_struct_in_union { | |
554 MessageHeader => { | |
555 |header: MessageHeader| { | |
556 assert_eq!(header.version, 0); | |
557 assert_eq!(header.name, 14); | |
558 assert_eq!(header.flags, 0); | |
559 } | |
560 }, | |
561 ConformanceTestInterfaceMethod14Request => { | |
562 |payload: &ConformanceTestInterfaceMethod14Request| { | |
563 match payload.param0 { | |
564 UnionA::c(ref val) => { | |
565 let struct_val = val.as_ref().unwrap(); | |
566 assert_eq!(struct_val.i, 20); | |
567 }, | |
568 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
569 } | |
570 } | |
571 } | |
572 } | |
573 conformance_mthd14_good_unknown_union_tag { | |
574 MessageHeader => { | |
575 |header: MessageHeader| { | |
576 assert_eq!(header.version, 0); | |
577 assert_eq!(header.name, 14); | |
578 assert_eq!(header.flags, 0); | |
579 } | |
580 }, | |
581 ConformanceTestInterfaceMethod14Request => { | |
582 |payload: &ConformanceTestInterfaceMethod14Request| { | |
583 match payload.param0 { | |
584 UnionA::_Unknown(ref val) => assert_eq!(*val, 54), | |
585 _ => panic!("Incorrect union variant! Tag found: {}", payloa
d.param0.get_tag()), | |
586 } | |
587 } | |
588 } | |
589 } | |
590 conformance_mthd15_good_union_in_array { | |
591 MessageHeader => { | |
592 |header: MessageHeader| { | |
593 assert_eq!(header.version, 0); | |
594 assert_eq!(header.name, 15); | |
595 assert_eq!(header.flags, 0); | |
596 } | |
597 }, | |
598 ConformanceTestInterfaceMethod15Request => { | |
599 |payload: &ConformanceTestInterfaceMethod15Request| { | |
600 assert_eq!(payload.param0.a, true); | |
601 assert_eq!(payload.param0.b, 22); | |
602 assert!(payload.param0.c.is_none()); | |
603 assert!(payload.param0.d.is_some()); | |
604 assert!(payload.param0.e.is_none()); | |
605 let array = payload.param0.d.as_ref().unwrap(); | |
606 assert_eq!(array.len(), 3); | |
607 for u in array.iter() { | |
608 match *u { | |
609 UnionA::b(ref val) => assert_eq!(*val, 10), | |
610 _ => panic!("Incorrect union variant! Tag found: {}", u.
get_tag()), | |
611 } | |
612 } | |
613 } | |
614 } | |
615 } | |
616 conformance_mthd15_good_union_in_map { | |
617 MessageHeader => { | |
618 |header: MessageHeader| { | |
619 assert_eq!(header.version, 0); | |
620 assert_eq!(header.name, 15); | |
621 assert_eq!(header.flags, 0); | |
622 } | |
623 }, | |
624 ConformanceTestInterfaceMethod15Request => { | |
625 |payload: &ConformanceTestInterfaceMethod15Request| { | |
626 assert_eq!(payload.param0.a, true); | |
627 assert_eq!(payload.param0.b, 22); | |
628 assert!(payload.param0.c.is_none()); | |
629 assert!(payload.param0.d.is_none()); | |
630 assert!(payload.param0.e.is_some()); | |
631 let map = payload.param0.e.as_ref().unwrap(); | |
632 assert_eq!(map.len(), 3); | |
633 let mut expect_keys = HashMap::with_capacity(3); | |
634 expect_keys.insert(8, false); | |
635 expect_keys.insert(7, false); | |
636 expect_keys.insert(1, false); | |
637 for (key, value) in map.iter() { | |
638 expect_keys.insert(*key, true); | |
639 match *value { | |
640 UnionA::b(ref val) => assert_eq!(*val, 10), | |
641 _ => panic!("Incorrect union variant! Tag found: {}", va
lue.get_tag()), | |
642 } | |
643 } | |
644 for (key, value) in expect_keys.iter() { | |
645 if *value == false { | |
646 panic!("Expected key `{}`, but not found!", *key); | |
647 } | |
648 } | |
649 } | |
650 } | |
651 } | |
652 conformance_mthd15_good_union_in_struct { | |
653 MessageHeader => { | |
654 |header: MessageHeader| { | |
655 assert_eq!(header.version, 0); | |
656 assert_eq!(header.name, 15); | |
657 assert_eq!(header.flags, 0); | |
658 } | |
659 }, | |
660 ConformanceTestInterfaceMethod15Request => { | |
661 |payload: &ConformanceTestInterfaceMethod15Request| { | |
662 assert_eq!(payload.param0.a, true); | |
663 assert_eq!(payload.param0.b, 22); | |
664 assert!(payload.param0.c.is_some()); | |
665 assert!(payload.param0.d.is_none()); | |
666 assert!(payload.param0.e.is_none()); | |
667 let union_val = payload.param0.c.as_ref().unwrap(); | |
668 match *union_val { | |
669 UnionA::b(ref val) => assert_eq!(*val, 54), | |
670 _ => panic!("Incorrect union variant! Tag found: {}", union_
val.get_tag()), | |
671 } | |
672 } | |
673 } | |
674 } | |
675 integration_intf_rqst_mthd0_good { | |
676 MessageHeader => { | |
677 |header: MessageHeader| { | |
678 assert_eq!(header.version, 1); | |
679 assert_eq!(header.name, 0); | |
680 assert_eq!(header.flags, 1); | |
681 assert_eq!(header.request_id, 7); | |
682 } | |
683 }, | |
684 IntegrationTestInterfaceMethod0Request => { | |
685 |payload: &IntegrationTestInterfaceMethod0Request| { | |
686 assert_eq!(payload.param0.a, -1); | |
687 } | |
688 } | |
689 } | |
690 integration_intf_resp_mthd0_good { | |
691 MessageHeader => { | |
692 |header: MessageHeader| { | |
693 assert_eq!(header.version, 1); | |
694 assert_eq!(header.name, 0); | |
695 assert_eq!(header.flags, 2); | |
696 assert_eq!(header.request_id, 1); | |
697 } | |
698 }, | |
699 IntegrationTestInterfaceMethod0Response => { | |
700 |payload: &IntegrationTestInterfaceMethod0Response| { | |
701 assert_eq!(payload.param0, vec![0]); | |
702 } | |
703 } | |
704 } | |
705 } | |
OLD | NEW |