blob: d0b6fbfae554191684a43696f112a6c8eb406c97 [file] [log] [blame]
#!/usr/bin/env bash
set -e
source "${FUCHSIA_DIR}/tools/devshell/lib/prebuilt.sh"
if [ ! -x "${FUCHSIA_BUILD_DIR}" ]; then
echo "error: did you fx exec? missing \$FUCHSIA_BUILD_DIR" 1>&2
exit 1
fi
FIDLGEN_HLCPP="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_hlcpp"
if [ ! -x "${FIDLGEN_HLCPP}" ]; then
echo "error: fidlgen_hlcpp missing; maybe fx clean-build?" 1>&2
fi
FIDLGEN_LLCPP="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_llcpp"
if [ ! -x "${FIDLGEN_LLCPP}" ]; then
echo "error: fidlgen_llcpp missing; maybe fx clean-build?" 1>&2
exit 1
fi
FIDLGEN_GO="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_go"
if [ ! -x "${FIDLGEN_GO}" ]; then
echo "error: fidlgen_go missing; maybe fx clean-build?" 1>&2
exit 1
fi
FIDLGEN_RUST="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_rust"
if [ ! -x "${FIDLGEN_RUST}" ]; then
echo "error: fidlgen_rust missing; maybe fx clean-build?" 1>&2
exit 1
fi
FIDLGEN_LIBFUZZER="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_libfuzzer"
if [ ! -x "${FIDLGEN_LIBFUZZER}" ]; then
echo "error: fidlgen_libfuzzer missing; maybe fx clean-build?" 1>&2
exit 1
fi
FIDLGEN_SYZ="${FUCHSIA_BUILD_DIR}/host_x64/fidlgen_syzkaller"
if [ ! -x "${FIDLGEN_SYZ}" ]; then
echo "error: fidlgen_syzkaller missing; maybe fx clean-build?" 1>&2
exit 1
fi
EXAMPLE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
EXAMPLE_DIR="$( echo $EXAMPLE_DIR | sed -e "s+${FUCHSIA_DIR}/++" )"
GOLDENS_DIR="${EXAMPLE_DIR}/../goldens"
FIDLC_IR_DIR="${FUCHSIA_DIR}/zircon/tools/fidl/goldens"
GOLDENS=()
# base all paths in FUCHSIA_DIR
cd "${FUCHSIA_DIR}"
# fresh regen
find "${GOLDENS_DIR}" -type f -not -name 'BUILD.gn' -exec rm {} \;
for src_path in `find "${FIDLC_IR_DIR}" -name '*.test.json.golden'`; do
src_name="$( basename "${src_path}" | sed -e 's/\.json\.golden$//g' )"
# TODO(fxb/45006): Skipping due to issue with representation of binary
# operators.
if [ "constants.test" = "${src_name}" ]; then
continue
fi
json_name="${src_name}.json"
cpp_header_name=${json_name}.h
cpp_test_header_name=${json_name}_test_base.h
cpp_source_name=${json_name}.cc
llcpp_header_name=${json_name}.llcpp.h
llcpp_source_name=${json_name}.llcpp.cc
libfuzzer_header_name=${json_name}.libfuzzer.h
libfuzzer_source_name=${json_name}.libfuzzer.cc
go_impl_name=${json_name}.go
rust_name=${json_name}.rs
syzkaller_name=${json_name}.syz.txt
GOLDENS+=(
"$json_name",
"${cpp_header_name}.golden",
"${cpp_test_header_name}.golden",
"${cpp_source_name}.golden",
"${llcpp_header_name}.golden",
"${llcpp_source_name}.golden",
"${go_impl_name}.golden",
"${rust_name}.golden",
)
echo -e "\033[1mexample: ${src_name}\033[0m"
echo " json ir: ${src_name} > ${json_name}"
cp "${src_path}" "${GOLDENS_DIR}/${json_name}"
echo " cpp: ${json_name} > ${cpp_header_name}, ${cpp_source_name}, and ${cpp_test_header_name}"
${FIDLGEN_HLCPP} \
-json "${GOLDENS_DIR}/${json_name}" \
-output-base "${GOLDENS_DIR}/${json_name}" \
-include-base "${GOLDENS_DIR}" \
-clang-format-path "${PREBUILT_CLANG_DIR}/bin/clang-format"
mv "${GOLDENS_DIR}/${cpp_header_name}" "${GOLDENS_DIR}/${cpp_header_name}.golden"
mv "${GOLDENS_DIR}/${cpp_source_name}" "${GOLDENS_DIR}/${cpp_source_name}.golden"
mv "${GOLDENS_DIR}/${cpp_test_header_name}" "${GOLDENS_DIR}/${cpp_test_header_name}.golden"
echo " llcpp: ${json_name} > ${llcpp_header_name} and ${llcpp_source_name}"
${FIDLGEN_LLCPP} \
-json "${GOLDENS_DIR}/${json_name}" \
-header "${GOLDENS_DIR}/${llcpp_header_name}" \
-source "${GOLDENS_DIR}/${llcpp_source_name}" \
-include-base "${GOLDENS_DIR}" \
-clang-format-path "${PREBUILT_CLANG_DIR}/bin/clang-format"
mv "${GOLDENS_DIR}/${llcpp_header_name}" "${GOLDENS_DIR}/${llcpp_header_name}.golden"
mv "${GOLDENS_DIR}/${llcpp_source_name}" "${GOLDENS_DIR}/${llcpp_source_name}.golden"
# libfuzzer expects at least one nonempty protocol definition or it will fail.
# Add sources that contain a protocol with at least one method.
# Remove libfuzzer golden files from a source that (no longer) contains a golden file.
# The regex \[[^]] means a literal [ followed by anything except ].
if tr -d '[:space:]' < "${src_path}" | grep -q '"methods":\[[^]]' ; then
GOLDENS+=(
"${libfuzzer_header_name}.golden",
"${libfuzzer_source_name}.golden",
)
echo " libfuzzer: ${json_name} > ${libfuzzer_header_name}, and ${libfuzzer_source_name}"
${FIDLGEN_LIBFUZZER} \
-json "${GOLDENS_DIR}/${json_name}" \
-output-base "${GOLDENS_DIR}/${json_name}" \
-include-base "${GOLDENS_DIR}" \
-clang-format-path "${PREBUILT_CLANG_DIR}/bin/clang-format"
mv "${GOLDENS_DIR}/${cpp_header_name}" "${GOLDENS_DIR}/${libfuzzer_header_name}.golden"
mv "${GOLDENS_DIR}/${cpp_source_name}" "${GOLDENS_DIR}/${libfuzzer_source_name}.golden"
else
if [[ -f "${GOLDENS_DIR}/${libfuzzer_header_name}.golden" ]]; then
rm "${GOLDENS_DIR}/${libfuzzer_header_name}.golden"
fi
if [[ -f "${GOLDENS_DIR}/${libfuzzer_source_name}.golden" ]]; then
rm "${GOLDENS_DIR}/${libfuzzer_source_name}.golden"
fi
fi
echo " go: ${json_name} > ${go_impl_name}"
${FIDLGEN_GO} \
-json "${GOLDENS_DIR}/${json_name}" \
-output-impl "${GOLDENS_DIR}/${go_impl_name}.golden"
echo " rust: ${json_name} > ${rust_name}"
${FIDLGEN_RUST} \
-json "${GOLDENS_DIR}/${json_name}" \
-output-filename "${GOLDENS_DIR}/${rust_name}.golden" \
-rustfmt "${PREBUILT_RUST_DIR}/bin/rustfmt"
# TODO(fxb/45007): Syzkaller does not support enum member references in struct
# defaults.
if [ "struct_default_value_enum_library_reference.test" = "${src_name}" ]; then
continue
fi
GOLDENS+=(
"${syzkaller_name}.golden",
)
echo " syzkaller: ${json_name} > ${syzkaller_name}"
${FIDLGEN_SYZ} \
-json "${GOLDENS_DIR}/${json_name}" \
-output-syz "${GOLDENS_DIR}/${syzkaller_name}.golden"
done
> "${GOLDENS_DIR}/goldens.txt"
printf "%s\n" "${GOLDENS[@]//,}" | sort >> "${GOLDENS_DIR}/goldens.txt"
> "${GOLDENS_DIR}/OWNERS"
find "${EXAMPLE_DIR}/../.." \
"tools/fidl/fidlgen_"{go,hlcpp,rust,libfuzzer,syzkaller} \
-name 'OWNERS' -exec cat {} \; \
| grep -v -e "^#" | awk 'NF' | sort -u > "${GOLDENS_DIR}/OWNERS"
echo "" >> "${GOLDENS_DIR}/OWNERS"
echo "# COMPONENT: FIDL>Testing" >> "${GOLDENS_DIR}/OWNERS"