blob: eec4eaac833c93642096ef15d0ffaaaee062ae3f [file] [log] [blame]
#!/bin/bash
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -eu # Error checking
err_print() {
cleanup "${FAR_FILE}"
echo "Error on line $1"
}
trap 'err_print $LINENO' ERR
DEBUG_LINE() {
"$@"
}
function usage {
echo
echo "Usage: $0 far_tool"
echo "* far_tool: Path to the far tool."
echo
echo "Usage: $0 far_file"
echo "* far_file: Fuchsia archive to be tested."
echo
}
EXTRACTED_FAR_DIR_NAME=extracted_far_data
cleanup() {
EXTRACTED_FAR_DIR="$(dirname "$1")"/"$EXTRACTED_FAR_DIR_NAME"
rm -rf "${EXTRACTED_FAR_DIR:?}"
}
# Ensure far tool is present
FAR_BIN="$1"
if [ ! -x "$FAR_BIN" ]; then
echo "Error: Could not find file far tool in $FAR_BIN"
exit 1;
fi
# Path to far archive to test
FAR_FILE="$2"
if [ ! -f "$FAR_FILE" ]; then
echo "Error: Could not find far file in $FAR_FILE"
exit 1;
fi
echo "==== Testing FAR file ===="
echo "${FAR_FILE}"
echo
echo "==== Scanning FAR files ===="
echo
echo "Testing ${FAR_FILE}"
FAR_EXTRACTED_DIR=$(dirname "${FAR_FILE}")/$EXTRACTED_FAR_DIR_NAME/$(basename "${FAR_FILE}")/extracted
mkdir -p "$FAR_EXTRACTED_DIR"
$FAR_BIN extract --archive="${FAR_FILE}" --output="$FAR_EXTRACTED_DIR"
$FAR_BIN extract --archive="$FAR_EXTRACTED_DIR"/meta.far --output="$FAR_EXTRACTED_DIR"
FAR_EXTRACTED_META_DIR=$FAR_EXTRACTED_DIR/meta
FAR_EXTRACTED_META_DIR_CONTENTS=$FAR_EXTRACTED_DIR/meta/contents
sed 's/^/ /' "$FAR_EXTRACTED_META_DIR_CONTENTS"
# Check for shared libraries required to run a component
SHARED_LIB_ERR=0
if ! grep -q "ld.so.1" "$FAR_EXTRACTED_META_DIR_CONTENTS"; then
echo "**** Failed to find ld.so.1 mentioned in ${FAR_FILE} ****"
SHARED_LIB_ERR=1
fi
if ! grep -q "libc++.so" "$FAR_EXTRACTED_META_DIR_CONTENTS"; then
echo "**** Failed to find libc++.so mentioned in ${FAR_FILE} ****"
SHARED_LIB_ERR=1
fi
if ! grep -q "libfdio.so" "$FAR_EXTRACTED_META_DIR_CONTENTS"; then
echo "**** Failed to find libfdio.so mentioned in ${FAR_FILE} ****"
SHARED_LIB_ERR=1
fi
# Check for component manifest
COMPONENT_MANIFEST_ERR=0
NUM_CM_FILES=$(find "$FAR_EXTRACTED_META_DIR" -name "*.cm" | wc -l)
NUM_CMX_FILES=$(find "$FAR_EXTRACTED_META_DIR" -name "*.cmx" | wc -l)
if [ "$NUM_CM_FILES" -eq 0 ] && [ "$NUM_CMX_FILES" -eq 0 ]; then
echo "**** Failed to find component manifest in ${FAR_FILE} ****"
COMPONENT_MANIFEST_ERR=1
fi
cleanup "${FAR_FILE}"
if [ $SHARED_LIB_ERR -gt 0 ]; then
exit 1;
fi
if [ $COMPONENT_MANIFEST_ERR -gt 0 ]; then
exit 1;
fi
echo "Test for ${FAR_FILE} passed."