blob: 5b855825f92a72545b8c4a1f5a769b7305f8b6a6 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Tests encoding and decoding functionality in the bindings package
//!
//! Test failure is defined as the function returning via panicking
//! and the result being caught in the test! macro. If a test function
//! returns without panicking, it is assumed to pass.
#[macro_use]
extern crate mojo;
use mojo::bindings::mojom::MojomMessageOption;
use mojo::system;
#[macro_use]
mod util;
use util::mojom_validation::*;
/// This macro is a wrapper for the tests! macro as it takes advantage of the
/// shared code between tests.
///
/// Given a test name, it will generate a test function. In this test function
/// we perform the following steps:
/// 1. Decode the header of the validation input.
/// 2. Decode the payload of the validation input, expecting a validation
/// error.
///
macro_rules! validation_tests {
($($name:ident => $req_type:ident;)*) => {
tests! {
$(
fn $name() {
let data = include_str!(concat!("../../interfaces/bindings/tests/data/validation/",
stringify!($name),
".data"));
let expected = include_str!(concat!("../../interfaces/bindings/tests/data/validation/",
stringify!($name),
".expected")).trim();
match util::parse_validation_test(data) {
Ok((data, num_handles)) => {
let mut mock_handles = Vec::with_capacity(num_handles);
for _ in 0..num_handles {
mock_handles.push(unsafe { system::acquire(0) });
}
match $req_type::decode_message(data, mock_handles) {
Ok(_) => panic!("Should not be valid!"),
Err(err) => assert_eq!(err.as_str(), expected),
}
},
Err(msg) => panic!("Error: {}", msg),
}
}
)*
}
}
}
validation_tests! {
conformance_empty => ConformanceTestInterfaceRequestOption;
conformance_mthd0_incomplete_struct => ConformanceTestInterfaceRequestOption;
conformance_mthd0_incomplete_struct_header => ConformanceTestInterfaceRequestOption;
conformance_mthd0_invalid_request_flags => ConformanceTestInterfaceRequestOption;
conformance_mthd0_invalid_request_flags2 => ConformanceTestInterfaceRequestOption;
conformance_mthd0_struct_num_bytes_huge => ConformanceTestInterfaceRequestOption;
conformance_mthd0_struct_num_bytes_less_than_min_requirement => ConformanceTestInterfaceRequestOption;
conformance_mthd0_struct_num_bytes_less_than_struct_header => ConformanceTestInterfaceRequestOption;
conformance_mthd10_null_keys => ConformanceTestInterfaceRequestOption;
conformance_mthd10_null_values => ConformanceTestInterfaceRequestOption;
conformance_mthd10_one_null_key => ConformanceTestInterfaceRequestOption;
conformance_mthd10_unequal_array_size => ConformanceTestInterfaceRequestOption;
conformance_mthd11_num_bytes_version_mismatch_1 => ConformanceTestInterfaceRequestOption;
conformance_mthd11_num_bytes_version_mismatch_2 => ConformanceTestInterfaceRequestOption;
conformance_mthd12_invalid_request_flags => ConformanceTestInterfaceRequestOption;
conformance_mthd14_unexpected_null_array_in_union => ConformanceTestInterfaceRequestOption;
conformance_mthd14_unexpected_null_map_in_union => ConformanceTestInterfaceRequestOption;
conformance_mthd14_unexpected_null_struct_in_union => ConformanceTestInterfaceRequestOption;
conformance_mthd14_unexpected_null_union_in_union => ConformanceTestInterfaceRequestOption;
conformance_mthd15_unexpected_null_union_in_array => ConformanceTestInterfaceRequestOption;
conformance_mthd1_misaligned_struct => ConformanceTestInterfaceRequestOption;
conformance_mthd1_struct_pointer_overflow => ConformanceTestInterfaceRequestOption;
conformance_mthd1_unexpected_null_struct => ConformanceTestInterfaceRequestOption;
conformance_mthd2_multiple_pointers_to_same_struct => ConformanceTestInterfaceRequestOption;
conformance_mthd2_overlapped_objects => ConformanceTestInterfaceRequestOption;
conformance_mthd2_wrong_layout_order => ConformanceTestInterfaceRequestOption;
conformance_mthd3_array_num_bytes_huge => ConformanceTestInterfaceRequestOption;
conformance_mthd3_array_num_bytes_less_than_array_header => ConformanceTestInterfaceRequestOption;
conformance_mthd3_array_num_bytes_less_than_necessary_size => ConformanceTestInterfaceRequestOption;
conformance_mthd3_array_pointer_overflow => ConformanceTestInterfaceRequestOption;
conformance_mthd3_incomplete_array => ConformanceTestInterfaceRequestOption;
conformance_mthd3_incomplete_array_header => ConformanceTestInterfaceRequestOption;
conformance_mthd3_misaligned_array => ConformanceTestInterfaceRequestOption;
conformance_mthd3_unexpected_null_array => ConformanceTestInterfaceRequestOption;
conformance_mthd4_multiple_pointers_to_same_array => ConformanceTestInterfaceRequestOption;
conformance_mthd4_overlapped_objects => ConformanceTestInterfaceRequestOption;
conformance_mthd4_wrong_layout_order => ConformanceTestInterfaceRequestOption;
conformance_mthd5_handle_out_of_range => ConformanceTestInterfaceRequestOption;
conformance_mthd5_multiple_handles_with_same_value_1 => ConformanceTestInterfaceRequestOption;
conformance_mthd5_multiple_handles_with_same_value_2 => ConformanceTestInterfaceRequestOption;
conformance_mthd5_unexpected_invalid_handle => ConformanceTestInterfaceRequestOption;
conformance_mthd5_wrong_handle_order => ConformanceTestInterfaceRequestOption;
conformance_mthd6_nested_array_num_bytes_less_than_necessary_size => ConformanceTestInterfaceRequestOption;
conformance_mthd7_unexpected_null_fixed_array => ConformanceTestInterfaceRequestOption;
conformance_mthd7_unmatched_array_elements => ConformanceTestInterfaceRequestOption;
conformance_mthd7_unmatched_array_elements_nested => ConformanceTestInterfaceRequestOption;
conformance_mthd8_array_num_bytes_overflow => ConformanceTestInterfaceRequestOption;
conformance_mthd8_unexpected_null_array => ConformanceTestInterfaceRequestOption;
conformance_mthd8_unexpected_null_string => ConformanceTestInterfaceRequestOption;
conformance_mthd9_unexpected_null_array => ConformanceTestInterfaceRequestOption;
boundscheck_msghdr_no_such_method => BoundsCheckTestInterfaceRequestOption;
conformance_msghdr_incomplete_struct => ConformanceTestInterfaceRequestOption;
conformance_msghdr_incomplete_struct_header => ConformanceTestInterfaceRequestOption;
conformance_msghdr_invalid_flag_combo => ConformanceTestInterfaceRequestOption;
conformance_msghdr_missing_request_id => ConformanceTestInterfaceRequestOption;
conformance_msghdr_no_such_method => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_huge => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_less_than_min_requirement => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_less_than_struct_header => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_version_mismatch_1 => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_version_mismatch_2 => ConformanceTestInterfaceRequestOption;
conformance_msghdr_num_bytes_version_mismatch_3 => ConformanceTestInterfaceRequestOption;
resp_boundscheck_msghdr_no_such_method => BoundsCheckTestInterfaceResponseOption;
resp_conformance_msghdr_invalid_response_flags1 => ConformanceTestInterfaceResponseOption;
resp_conformance_msghdr_invalid_response_flags2 => ConformanceTestInterfaceResponseOption;
resp_conformance_msghdr_no_such_method => ConformanceTestInterfaceResponseOption;
integration_intf_resp_mthd0_unexpected_array_header => IntegrationTestInterfaceResponseOption;
integration_intf_rqst_mthd0_unexpected_struct_header => IntegrationTestInterfaceRequestOption;
integration_msghdr_invalid_flags => IntegrationTestInterfaceRequestOption;
}