xref: /aosp_15_r20/external/toybox/mkroot/testroot.sh (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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