1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# usage: mkroot/testroot.sh [TARGET...] 4*cf5a6c84SAndroid Build Coastguard Worker# 5*cf5a6c84SAndroid Build Coastguard Worker# Test system image(s) (by booting qemu with -hda test.img providing /mnt/init) 6*cf5a6c84SAndroid Build Coastguard Worker# and check that: 7*cf5a6c84SAndroid Build Coastguard Worker# 8*cf5a6c84SAndroid Build Coastguard Worker# A) it boots and runs our code (which means /dev/hda works) 9*cf5a6c84SAndroid Build Coastguard Worker# B) the clock is set sanely ("make" is unhappy when source newer than output) 10*cf5a6c84SAndroid Build Coastguard Worker# C) it can talk to the virtual network 11*cf5a6c84SAndroid Build Coastguard Worker# 12*cf5a6c84SAndroid Build Coastguard Worker# Each successful test prints a === line, and all 3 means it passed. 13*cf5a6c84SAndroid Build Coastguard Worker# Writes result into root/build/test/$TARGET-test.txt 14*cf5a6c84SAndroid Build Coastguard Worker# 15*cf5a6c84SAndroid Build Coastguard Worker# With arguments, tests those targets (verbosely). With no arguments, tests 16*cf5a6c84SAndroid Build Coastguard Worker# each target with a linux-kernel (in parallel) and prints pass/fail summary. 17*cf5a6c84SAndroid Build Coastguard Worker 18*cf5a6c84SAndroid Build Coastguard Workerdie() { echo "$@"; exit 1; } 19*cf5a6c84SAndroid Build Coastguard Worker 20*cf5a6c84SAndroid Build Coastguard Worker[ -n "$(which toybox)" -a -n "$(which mksquashfs)" ] || 21*cf5a6c84SAndroid Build Coastguard Worker die "Need toybox and mksquashfs in $PATH" 22*cf5a6c84SAndroid Build Coastguard Worker 23*cf5a6c84SAndroid Build Coastguard Workermkdir -p "${TEST:=$PWD/root/build/test}" && 24*cf5a6c84SAndroid Build Coastguard Worker 25*cf5a6c84SAndroid Build Coastguard Worker# Setup test filesystem and package it into a squashfs. 26*cf5a6c84SAndroid Build Coastguard Workercat > "$TEST"/init << 'EOF' && 27*cf5a6c84SAndroid Build Coastguard Worker#!/bin/sh 28*cf5a6c84SAndroid Build Coastguard Worker 29*cf5a6c84SAndroid Build Coastguard Workerecho 30*cf5a6c84SAndroid Build Coastguard Workerecho === init $HOST 31*cf5a6c84SAndroid Build Coastguard Worker[ "$(date +%s)" -gt 1500000000 ] && echo === date ok $HOST 32*cf5a6c84SAndroid Build Coastguard Workerwget http://10.0.2.2:65432 -O - 33*cf5a6c84SAndroid Build Coastguard Worker# TODO: cd /mnt && scripts/test.sh 34*cf5a6c84SAndroid Build Coastguard WorkerEOF 35*cf5a6c84SAndroid Build Coastguard Workerchmod +x "$TEST"/init && 36*cf5a6c84SAndroid Build Coastguard Worker 37*cf5a6c84SAndroid Build Coastguard Workermksquashfs "$TEST"/init configure scripts/ tests/ "$TEST"/init.sqf -noappend -all-root >/dev/null && 38*cf5a6c84SAndroid Build Coastguard Worker 39*cf5a6c84SAndroid Build Coastguard Worker# Setup server on host's loopback for network smoke test 40*cf5a6c84SAndroid Build Coastguard Workerecho === net ok > "$TEST"/index.html || die "smoketest setup" 41*cf5a6c84SAndroid Build Coastguard Workertoybox netcat -p 65432 -s 127.0.0.1 -L toybox httpd "$TEST" & 42*cf5a6c84SAndroid Build Coastguard Workertrap "kill $!" EXIT 43*cf5a6c84SAndroid Build Coastguard Workersleep .25 44*cf5a6c84SAndroid Build Coastguard Worker 45*cf5a6c84SAndroid Build Coastguard Worker[ -n "$(toybox wget http://127.0.0.1:65432/ -O - | grep ===)" ] || die "wget" 46*cf5a6c84SAndroid Build Coastguard Worker 47*cf5a6c84SAndroid Build Coastguard Workerdo_test() 48*cf5a6c84SAndroid Build Coastguard Worker{ 49*cf5a6c84SAndroid Build Coastguard Worker X=$(dirname "$1") Y=$(basename $X) 50*cf5a6c84SAndroid Build Coastguard Worker [ ! -e "$1" ] && { echo skip "$Y"; return 0; } 51*cf5a6c84SAndroid Build Coastguard Worker # Alas KARGS=quiet doesn't silence qemu's bios, so filter output ourselves. 52*cf5a6c84SAndroid Build Coastguard Worker # QEMU broke -hda because too many people know how to use it, this is 53*cf5a6c84SAndroid Build Coastguard Worker # the new edgier version they added to be -hda without gratuitous breakage. 54*cf5a6c84SAndroid Build Coastguard Worker { 55*cf5a6c84SAndroid Build Coastguard Worker cd $X || continue 56*cf5a6c84SAndroid Build Coastguard Worker echo === $X 57*cf5a6c84SAndroid Build Coastguard Worker # Can't point two QEMU instances at same sqf because gratuitous file locking 58*cf5a6c84SAndroid Build Coastguard Worker cp "$TEST"/init.{sqf,$BASHPID} && 59*cf5a6c84SAndroid Build Coastguard Worker # When stdin is a tty QEMU will SIGTTOU itself here, so </dev/null. 60*cf5a6c84SAndroid Build Coastguard Worker toybox timeout -i 10 bash -c "./run-qemu.sh -drive format=raw,file='$TEST'/init.$BASHPID < /dev/null 2>&1" 61*cf5a6c84SAndroid Build Coastguard Worker rm -f "$TEST/init.$BASHPID" 62*cf5a6c84SAndroid Build Coastguard Worker cd ../.. 63*cf5a6c84SAndroid Build Coastguard Worker } | tee root/build/log/$Y-test.txt | { [ -z "$V" ] && cat >/dev/null || { [ "$V" -gt 1 ] && cat || grep '^=== '; } } 64*cf5a6c84SAndroid Build Coastguard Worker} 65*cf5a6c84SAndroid Build Coastguard Worker 66*cf5a6c84SAndroid Build Coastguard Worker# Just test targets on command line? 67*cf5a6c84SAndroid Build Coastguard Workerif [ $# -gt 0 ]; then 68*cf5a6c84SAndroid Build Coastguard Worker ((V++)) 69*cf5a6c84SAndroid Build Coastguard Worker for I in "$@"; do do_test root/"$I"/linux-kernel; done 70*cf5a6c84SAndroid Build Coastguard Worker exit 71*cf5a6c84SAndroid Build Coastguard Workerfi 72*cf5a6c84SAndroid Build Coastguard Worker 73*cf5a6c84SAndroid Build Coastguard WorkerCOUNT=0 CPUS=$(($(nproc)+0)) 74*cf5a6c84SAndroid Build Coastguard Workerfor I in root/*/linux-kernel 75*cf5a6c84SAndroid Build Coastguard Workerdo 76*cf5a6c84SAndroid Build Coastguard Worker do_test "$I" | { [ -z "$V" ] && cat >/dev/null || { [ "$V" -gt 1 ] && cat || grep '^=== '; } } & 77*cf5a6c84SAndroid Build Coastguard Worker [ $((++COUNT)) -ge $CPUS ] && 78*cf5a6c84SAndroid Build Coastguard Worker { wait -n; ((--COUNT)); [ -z "$V" ] && echo -n .; } 79*cf5a6c84SAndroid Build Coastguard Workerdone 80*cf5a6c84SAndroid Build Coastguard Worker 81*cf5a6c84SAndroid Build Coastguard Workerwhile [ $COUNT -gt 0 ]; do 82*cf5a6c84SAndroid Build Coastguard Worker wait -n; ((--COUNT)); [ -z "$V" ] && echo -n . 83*cf5a6c84SAndroid Build Coastguard Workerdone 84*cf5a6c84SAndroid Build Coastguard Workerecho 85*cf5a6c84SAndroid Build Coastguard Worker 86*cf5a6c84SAndroid Build Coastguard WorkerPASS= NOPASS= 87*cf5a6c84SAndroid Build Coastguard Workerfor I in root/*/linux-kernel 88*cf5a6c84SAndroid Build Coastguard Workerdo 89*cf5a6c84SAndroid Build Coastguard Worker [ ! -e "$I" ] && continue 90*cf5a6c84SAndroid Build Coastguard Worker X=$(dirname $I) Y=$(basename $X) 91*cf5a6c84SAndroid Build Coastguard Worker 92*cf5a6c84SAndroid Build Coastguard Worker [ "$(grep '^=== ' root/build/log/$Y-test.txt | wc -l)" -eq 4 ] && 93*cf5a6c84SAndroid Build Coastguard Worker PASS+="$Y " || NOPASS+="$Y " 94*cf5a6c84SAndroid Build Coastguard Workerdone 95*cf5a6c84SAndroid Build Coastguard Worker 96*cf5a6c84SAndroid Build Coastguard Worker[ -n "$PASS" ] && echo PASS=$PASS 97*cf5a6c84SAndroid Build Coastguard Worker[ -n "$NOPASS" ] && echo NOPASS=$NOPASS 98*cf5a6c84SAndroid Build Coastguard Workerbd() { sed 's@.*/\([^/]*\)/[^/]*@\1@'; } 99*cf5a6c84SAndroid Build Coastguard WorkerNO="$(ls -d root/*/fs | bd | egrep -xv "$(ls root/*/linux-kernel | bd | tr '\n' '|')build" | xargs)" 100*cf5a6c84SAndroid Build Coastguard Worker[ -n "$NO" ] && echo No kernel: $NO 101