1#!/usr/bin/env bash 2# shellcheck disable=SC2086 # we want word splitting 3# shellcheck disable=SC1091 # paths only become valid at runtime 4 5. "${SCRIPTS_DIR}/setup-test-env.sh" 6 7section_start cuttlefish_setup "cuttlefish: setup" 8set -xe 9 10export HOME=/cuttlefish 11export PATH=/cuttlefish/bin:$PATH 12export LD_LIBRARY_PATH=/cuttlefish/lib64:${CI_PROJECT_DIR}/install/lib:$LD_LIBRARY_PATH 13export EGL_PLATFORM=surfaceless 14 15# Pick up a vulkan driver 16ARCH=$(uname -m) 17export VK_DRIVER_FILES=${CI_PROJECT_DIR}/install/share/vulkan/icd.d/${VK_DRIVER:-}_icd.$ARCH.json 18 19syslogd 20 21chown root:kvm /dev/kvm 22 23pushd /cuttlefish 24 25# Add a function to perform some tasks when exiting the script 26function my_atexit() 27{ 28 # shellcheck disable=SC2317 29 cp /cuttlefish/cuttlefish/instances/cvd-1/logs/logcat $RESULTS_DIR || true 30 # shellcheck disable=SC2317 31 cp /cuttlefish/cuttlefish/instances/cvd-1/kernel.log $RESULTS_DIR || true 32 33 # shellcheck disable=SC2317 34 cp /cuttlefish/cuttlefish/instances/cvd-1/logs/launcher.log $RESULTS_DIR || true 35 36 # shellcheck disable=SC2317 37 /cuttlefish/bin/stop_cvd -wait_for_launcher=10 38} 39 40# stop cuttlefish if the script ends prematurely or is interrupted 41trap 'my_atexit' EXIT 42trap 'exit 2' HUP INT PIPE TERM 43 44ulimit -S -n 32768 45 46# Clean up state of previous run 47rm -rf /cuttlefish/cuttlefish 48rm -rf /cuttlefish/.cache 49rm -rf /cuttlefish/.cuttlefish_config.json 50 51launch_cvd \ 52 -daemon \ 53 -verbosity=VERBOSE \ 54 -file_verbosity=VERBOSE \ 55 -use_overlay=false \ 56 -enable_bootanimation=false \ 57 -enable_minimal_mode=true \ 58 -guest_enforce_security=false \ 59 -report_anonymous_usage_stats=no \ 60 -gpu_mode="$ANDROID_GPU_MODE" \ 61 -cpus=${FDO_CI_CONCURRENT:-4} \ 62 -memory_mb 8192 \ 63 -kernel_path="$HOME/bzImage" \ 64 -initramfs_path="$HOME/initramfs.img" 65 66sleep 1 67 68popd 69 70ADB=adb 71 72$ADB wait-for-device root 73sleep 1 74$ADB shell echo Hi from Android 75# shellcheck disable=SC2035 76$ADB logcat dEQP:D *:S & 77 78# overlay vendor 79 80OV_TMPFS="/data/overlay-remount" 81$ADB shell mkdir -p "$OV_TMPFS" 82$ADB shell mount -t tmpfs none "$OV_TMPFS" 83 84$ADB shell mkdir -p "$OV_TMPFS/vendor-upper" 85$ADB shell mkdir -p "$OV_TMPFS/vendor-work" 86 87opts="lowerdir=/vendor,upperdir=$OV_TMPFS/vendor-upper,workdir=$OV_TMPFS/vendor-work" 88$ADB shell mount -t overlay -o "$opts" none /vendor 89 90$ADB shell setenforce 0 91 92# deqp 93 94$ADB shell mkdir -p /data/deqp 95$ADB push /deqp-gles/modules/egl/deqp-egl-android /data/deqp 96$ADB push /deqp-gles/assets/gl_cts/data/mustpass/egl/aosp_mustpass/3.2.6.x/egl-main.txt /data/deqp 97$ADB push /deqp-vk/external/vulkancts/modules/vulkan/* /data/deqp 98$ADB push /deqp-vk/mustpass/vk-main.txt.zst /data/deqp 99$ADB push /deqp-tools/* /data/deqp 100$ADB push /deqp-runner/deqp-runner /data/deqp 101 102# download Android Mesa from S3 103MESA_ANDROID_ARTIFACT_URL=https://${PIPELINE_ARTIFACTS_BASE}/${S3_ANDROID_ARTIFACT_NAME}.tar.zst 104curl -L --retry 4 -f --retry-all-errors --retry-delay 60 -o ${S3_ANDROID_ARTIFACT_NAME}.tar.zst ${MESA_ANDROID_ARTIFACT_URL} 105mkdir /mesa-android 106tar -C /mesa-android -xvf ${S3_ANDROID_ARTIFACT_NAME}.tar.zst 107rm "${S3_ANDROID_ARTIFACT_NAME}.tar.zst" & 108 109INSTALL="/mesa-android/install" 110 111$ADB push "$INSTALL/all-skips.txt" /data/deqp 112$ADB push "$INSTALL/angle-skips.txt" /data/deqp 113if [ -e "$INSTALL/$GPU_VERSION-flakes.txt" ]; then 114 $ADB push "$INSTALL/$GPU_VERSION-flakes.txt" /data/deqp 115fi 116if [ -e "$INSTALL/$GPU_VERSION-fails.txt" ]; then 117 $ADB push "$INSTALL/$GPU_VERSION-fails.txt" /data/deqp 118fi 119if [ -e "$INSTALL/$GPU_VERSION-skips.txt" ]; then 120 $ADB push "$INSTALL/$GPU_VERSION-skips.txt" /data/deqp 121fi 122$ADB push "$INSTALL/deqp-$DEQP_SUITE.toml" /data/deqp 123 124# remove 32 bits libs from /vendor/lib 125 126$ADB shell rm -f /vendor/lib/libglapi.so 127$ADB shell rm -f /vendor/lib/egl/libGLES_mesa.so 128 129$ADB shell rm -f /vendor/lib/egl/libEGL_angle.so 130$ADB shell rm -f /vendor/lib/egl/libEGL_emulation.so 131$ADB shell rm -f /vendor/lib/egl/libGLESv1_CM_angle.so 132$ADB shell rm -f /vendor/lib/egl/libGLESv1_CM_emulation.so 133$ADB shell rm -f /vendor/lib/egl/libGLESv2_angle.so 134$ADB shell rm -f /vendor/lib/egl/libGLESv2_emulation.so 135 136$ADB shell rm -f /vendor/lib/hw/vulkan.* 137 138# replace on /vendor/lib64 139 140$ADB push "$INSTALL/lib/libgallium_dri.so" /vendor/lib64/libgallium_dri.so 141$ADB push "$INSTALL/lib/libEGL.so" /vendor/lib64/egl/libEGL_mesa.so 142$ADB push "$INSTALL/lib/libGLESv1_CM.so" /vendor/lib64/egl/libGLESv1_CM_mesa.so 143$ADB push "$INSTALL/lib/libGLESv2.so" /vendor/lib64/egl/libGLESv2_mesa.so 144 145$ADB push "$INSTALL/lib/libvulkan_lvp.so" /vendor/lib64/hw/vulkan.lvp.so 146$ADB push "$INSTALL/lib/libvulkan_virtio.so" /vendor/lib64/hw/vulkan.virtio.so 147 148$ADB shell rm -f /vendor/lib64/egl/libEGL_emulation.so 149$ADB shell rm -f /vendor/lib64/egl/libGLESv1_CM_emulation.so 150$ADB shell rm -f /vendor/lib64/egl/libGLESv2_emulation.so 151 152# Check what GLES implementation Surfaceflinger is using before copying the new mesa libraries 153while [ "$($ADB shell dumpsys SurfaceFlinger | grep GLES:)" = "" ] ; do sleep 1; done 154$ADB shell dumpsys SurfaceFlinger | grep GLES 155 156# restart Android shell, so that surfaceflinger uses the new libraries 157$ADB shell stop 158$ADB shell start 159 160# Check what GLES implementation Surfaceflinger is using after copying the new mesa libraries 161while [ "$($ADB shell dumpsys SurfaceFlinger | grep GLES:)" = "" ] ; do sleep 1; done 162MESA_RUNTIME_VERSION="$($ADB shell dumpsys SurfaceFlinger | grep GLES:)" 163MESA_BUILD_VERSION=$(cat "$INSTALL/VERSION") 164if ! printf "%s" "$MESA_RUNTIME_VERSION" | grep "${MESA_BUILD_VERSION}$"; then 165 echo "Fatal: Android is loading a wrong version of the Mesa3D libs: ${MESA_RUNTIME_VERSION}" 1>&2 166 exit 1 167fi 168 169BASELINE="" 170if [ -e "$INSTALL/$GPU_VERSION-fails.txt" ]; then 171 BASELINE="--baseline /data/deqp/$GPU_VERSION-fails.txt" 172fi 173 174# Default to an empty known flakes file if it doesn't exist. 175$ADB shell "touch /data/deqp/$GPU_VERSION-flakes.txt" 176 177if [ -e "$INSTALL/$GPU_VERSION-skips.txt" ]; then 178 DEQP_SKIPS="$DEQP_SKIPS /data/deqp/$GPU_VERSION-skips.txt" 179fi 180 181if [ -n "$USE_ANGLE" ]; then 182 DEQP_SKIPS="$DEQP_SKIPS /data/deqp/angle-skips.txt" 183fi 184 185AOSP_RESULTS=/data/deqp/results 186uncollapsed_section_switch cuttlefish_test "cuttlefish: testing" 187 188set +e 189$ADB shell "mkdir ${AOSP_RESULTS}; cd ${AOSP_RESULTS}/..; \ 190 XDG_CACHE_HOME=/data/local/tmp \ 191 ./deqp-runner \ 192 suite \ 193 --suite /data/deqp/deqp-$DEQP_SUITE.toml \ 194 --output $AOSP_RESULTS \ 195 --skips /data/deqp/all-skips.txt $DEQP_SKIPS \ 196 --flakes /data/deqp/$GPU_VERSION-flakes.txt \ 197 --testlog-to-xml /data/deqp/testlog-to-xml \ 198 --shader-cache-dir /data/local/tmp \ 199 --fraction-start ${CI_NODE_INDEX:-1} \ 200 --fraction $(( CI_NODE_TOTAL * ${DEQP_FRACTION:-1})) \ 201 --jobs ${FDO_CI_CONCURRENT:-4} \ 202 $BASELINE \ 203 ${DEQP_RUNNER_MAX_FAILS:+--max-fails \"$DEQP_RUNNER_MAX_FAILS\"} \ 204 " 205 206EXIT_CODE=$? 207set -e 208section_switch cuttlefish_results "cuttlefish: gathering the results" 209 210$ADB pull "$AOSP_RESULTS/." "$RESULTS_DIR" 211 212# Remove all but the first 50 individual XML files uploaded as artifacts, to 213# save fd.o space when you break everything. 214find $RESULTS_DIR -name \*.xml | \ 215 sort -n | 216 sed -n '1,+49!p' | \ 217 xargs rm -f 218 219# If any QPA XMLs are there, then include the XSL/CSS in our artifacts. 220find $RESULTS_DIR -name \*.xml \ 221 -exec cp /deqp-tools/testlog.css /deqp-tools/testlog.xsl "$RESULTS_DIR/" ";" \ 222 -quit 223 224$ADB shell "cd ${AOSP_RESULTS}/..; \ 225./deqp-runner junit \ 226 --testsuite dEQP \ 227 --results $AOSP_RESULTS/failures.csv \ 228 --output $AOSP_RESULTS/junit.xml \ 229 --limit 50 \ 230 --template \"See $ARTIFACTS_BASE_URL/results/{{testcase}}.xml\"" 231 232$ADB pull "$AOSP_RESULTS/junit.xml" "$RESULTS_DIR" 233 234section_end cuttlefish_results 235exit $EXIT_CODE 236