GIDL is a code generation tool to create Golden FIDL Tests. It generates code that tests whether FIDL bindings correctly encode and decode FIDL to/from the wire format. Standard .fidl files define the FIDL data structures, and .gidl files use those data structures and define the expected bytes for the wire-format. The gidl tool reads theses .gidl files, and outputs conformance tests that verifies the FIDL definitions match their expected wire-format bytes.
GIDL supports multiple languages, and will generate a conformance test for each supported language.
The input files for GIDL are at <//tools/fidl/gidl-conformance-suite/>. That directory contains a .gidl file and multiple .fidl files.
To re-generate all of GIDL's conformance tests:
fx build tools/gidl fx exec $FUCHSIA_DIR/tools/fidl/gidl-conformance-suite/regen.sh
After generating the conformance tests, you must run them to validate that the conformance test passes. This is dependent on the language:
Go: regen.sh outputs the Go language bindings for the .fidl files to <third_party/go/src/syscall/zx/fidl/conformance/impl.go>, and outputs the conformance test to <third_party/go/src/syscall/zx/fidl/fidl_test/conformance_test.go>. To run the Go conformance test:
fx run-test go_fidl_tests -- -test.v -test.run ‘TestAllSuccessCases’
C++: regen.sh outputs the C++ bindings to <sdk/lib/fidl/cpp/conformance.fidl.h> & .cc, and outputs the C++ conformance test to <sdk/lib/fidl/cpp/conformance_test.cc>. To run this:
fx build host_x64/fidl_cpp_host_conformance_test fx run-host-tests fidl_cpp_host_conformance_test
fx build sdk/lib/fidl/cpp:conformance_test fx serve fx run-test fidl_tests # includes //sdk/lib/fidl/cpp:conformance_test
There are three kinds of tests which can be expressed. We describe them below.
A success test case captures a value (optionally with handles), and its wire format representation.
Here is an example:
// Assuming the following FIDL definition:
//
// struct OneStringOfMaxLengthFive {
// string:5 the_string;
// };
success("OneStringOfMaxLengthFive-empty") {
value = OneStringOfMaxLengthFive {
the_string: "",
}
bytes = {
0, 0, 0, 0, 0, 0, 0, 0, // length
255, 255, 255, 255, 255, 255, 255, 255, // alloc present
}
}
From this description, the following must be verified:
GIDL does not currently output conformance tests for fails_to_encode cases.
A fails_to_encode test case captures a value (optionally with handles), which fails to encode (e.g. constraints not met).
Here is an example:
fails_to_encode("OneStringOfMaxLengthFive-too-long") {
value = OneStringOfMaxLengthFive {
the_string: "bonjour", // 6 characters
}
err = FIDL_STRING_TOO_LONG
}
From this description, the following must be verified:
GIDL does not currently output conformance tests for fails_to_decode cases.
A fails_to_decode test case captures bytes encoding (optionally with handles), which fails to decode (e.g. incorrect wire encoding).
Here is an example:
fails_to_decode("OneStringOfMaxLengthFive-wrong-length") {
bytes = {
1, 0, 0, 0, 0, 0, 0, 0, // length
255, 255, 255, 255, 255, 255, 255, 255, // alloc present
// one character missing
}
err = FIDL_STRING_INCORRECT_SIZE
}
From this description, the following must be verified: