diff options
Diffstat (limited to 'rules/apex/bazel_apexer_wrapper_test.sh')
-rwxr-xr-x | rules/apex/bazel_apexer_wrapper_test.sh | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/rules/apex/bazel_apexer_wrapper_test.sh b/rules/apex/bazel_apexer_wrapper_test.sh new file mode 100755 index 00000000..1cf03fa9 --- /dev/null +++ b/rules/apex/bazel_apexer_wrapper_test.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +# Copyright (C) 2021 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +set -xeuo pipefail + +apexer_tool_path="${RUNFILES_DIR}/__main__/external/make_injection/host/linux-x86/bin" +avb_tool_path="${RUNFILES_DIR}/__main__/external/avb" +android_jar="${RUNFILES_DIR}/__main__/prebuilts/sdk/current/public/android.jar" + +input_dir=$(mktemp -d) +output_dir=$(mktemp -d) + +function cleanup { + rm -rf ${input_dir} + rm -rf ${output_dir} +} + +trap cleanup ERR +############################################# +# prepare the inputs +############################################# +# Create the input directory with +# 1. a file with random bits +# 2. a file installed sub dir with random bits +# 3. a one-level symlink +# 4. a two-level symlink with "execroot/__main__" in the path +# 5. a two-level sumlink without "execroot/__main__" in the path +# 6. a three-level symlink with "execroot/__main__" in the path +echo "test file1" > "${input_dir}/file1" +echo "test file2" > "${input_dir}/file2" +mkdir -p "${input_dir}/execroot/__main__" +ln -s "${input_dir}/file1" "${input_dir}/one_level_sym" +ln -s "${input_dir}/file2" "${input_dir}/execroot/__main__/middle_sym" +ln -s "${input_dir}/execroot/__main__/middle_sym" "${input_dir}/two_level_sym_in_execroot" +ln -s "${input_dir}/one_level_sym" "${input_dir}/two_level_sym_not_in_execroot" +ln -s "${input_dir}/two_level_sym_in_execroot" "${input_dir}/three_level_sym_in_execroot" + +# Create the APEX manifest file +manifest_dir=$(mktemp -d) +manifest_file="${manifest_dir}/apex_manifest.pb" +echo '{"name": "com.android.example.apex", "version": 1}' > "${manifest_dir}/apex_manifest.json" +"${apexer_tool_path}/conv_apex_manifest" proto "${manifest_dir}/apex_manifest.json" -o ${manifest_file} + +# Create the file_contexts file +file_contexts_file=$(mktemp) +echo ' +(/.*)? u:object_r:root_file:s0 +/execroot(/.*)? u:object_r:execroot_file:s0 +' > ${file_contexts_file} + +output_file="${output_dir}/test.apex" + +# Create the wrapper manifest file +bazel_apexer_wrapper_manifest_file=$(mktemp) +echo " +dir1,file1,"${input_dir}/file1" +dir2/dir3,file2,"${input_dir}/file2" +dir4,one_level_sym,"${input_dir}/one_level_sym" +dir5,two_level_sym_in_execroot,"${input_dir}/two_level_sym_in_execroot" +dir6,two_level_sym_not_in_execroot,"${input_dir}/two_level_sym_not_in_execroot" +dir7,three_level_sym_in_execroot,"${input_dir}/three_level_sym_in_execroot" +" > ${bazel_apexer_wrapper_manifest_file} + +############################################# +# run bazel_apexer_wrapper +############################################# +"${RUNFILES_DIR}/__main__/build/bazel/rules/apex/bazel_apexer_wrapper" \ + --manifest ${manifest_file} \ + --file_contexts ${file_contexts_file} \ + --key "${RUNFILES_DIR}/__main__/build/bazel/rules/apex/test.pem" \ + --apexer_path ${apexer_tool_path} \ + --apexer_tool_paths ${apexer_tool_path}:${avb_tool_path} \ + --apex_output_file ${output_file} \ + --bazel_apexer_wrapper_manifest ${bazel_apexer_wrapper_manifest_file} \ + --android_jar_path ${android_jar} + +############################################# +# check the result +############################################# +"${apexer_tool_path}/deapexer" --debugfs_path="${apexer_tool_path}/debugfs" extract ${output_file} ${output_dir} + +# The expected mounted tree should be something like this: +# /tmp/tmp.9u7ViPlMr7 +# ├── apex_manifest.pb +# ├── apex_payload.img +# ├── mnt +# │ ├── apex_manifest.pb +# │ ├── dir1 +# │ │ └── file1 +# │ ├── dir2 +# │ │ └── dir3 +# │ │ └── file2 +# │ ├── dir4 +# │ │ └── one_level_sym +# (one level symlinks always resolve) +# │ ├── dir5 +# │ │ └── two_level_sym_in_execroot +# (two level symlink resolve if the path contains execroot/__main__) +# │ ├── dir6 +# │ │ └── two_level_sym_not_in_execroot -> /tmp/tmp.evJh21oYGG/file1 +# (two level symlink resolve only one level otherwise) +# │ ├── dir7 +# │ │ └── three_level_sym_in_execroot +# (three level symlink resolve if the path contains execroot/__main__) +# └── test.apex + +# b/215129834: +# https://android-review.googlesource.com/c/platform/system/apex/+/1944264 made +# it such that the hash of non-payload files in the APEX (like +# AndroidManifest.xml) will be included as part of the apex_manifest.pb via the +# apexContainerFilesHash string to ensure that changes to AndroidManifest.xml +# results in changes in content hash for the apex_payload.img. Since this is +# potentially fragile, we skip diffing the apex_manifest.pb, and just check that +# it exists. +test -f "${output_dir}/apex_manifest.pb" || echo "expected apex_manifest.pb to exist" + +# check the contents with diff for the rest of the files +diff ${input_dir}/file1 ${output_dir}/dir1/file1 +diff ${input_dir}/file2 ${output_dir}/dir2/dir3/file2 +diff ${input_dir}/file1 ${output_dir}/dir4/one_level_sym +diff ${input_dir}/file2 ${output_dir}/dir5/two_level_sym_in_execroot +[ `readlink ${output_dir}/dir6/two_level_sym_not_in_execroot` = "${input_dir}/file1" ] +diff ${input_dir}/file2 ${output_dir}/dir7/three_level_sym_in_execroot + +cleanup + +echo "Passed for all test cases" |