xref: /linux/scripts/dtc/dt-style-selftest/run.sh (revision 9611c0ce215a66770ccbe5c126bf57ba8c31bcad)
1*efb6347dSDaniel Golle#!/bin/sh
2*efb6347dSDaniel Golle# SPDX-License-Identifier: GPL-2.0-only
3*efb6347dSDaniel Golle#
4*efb6347dSDaniel Golle# Run dt-check-style against fixtures under good/ and bad/.
5*efb6347dSDaniel Golle# good/ files must produce no output and exit 0 in both modes.
6*efb6347dSDaniel Golle# bad/ files must produce the expected output (in expected/<name>.txt)
7*efb6347dSDaniel Golle# and exit 1.
8*efb6347dSDaniel Golle#
9*efb6347dSDaniel Golle# The mode used for a bad fixture is whichever produces a violation:
10*efb6347dSDaniel Golle# trailing-whitespace and tab fixtures use the default (relaxed),
11*efb6347dSDaniel Golle# the rest use --mode=strict. The expected output files name the
12*efb6347dSDaniel Golle# mode in their first line.
13*efb6347dSDaniel Golle
14*efb6347dSDaniel Golleset -u
15*efb6347dSDaniel Golle
16*efb6347dSDaniel Gollehere=$(cd "$(dirname "$0")" && pwd)
17*efb6347dSDaniel Golletool="$here/../dt-check-style"
18*efb6347dSDaniel Gollefail=0
19*efb6347dSDaniel Golle
20*efb6347dSDaniel Gollerun() {
21*efb6347dSDaniel Golle    file=$1
22*efb6347dSDaniel Golle    mode=$2
23*efb6347dSDaniel Golle    "$tool" --mode="$mode" "$file" 2>&1
24*efb6347dSDaniel Golle}
25*efb6347dSDaniel Golle
26*efb6347dSDaniel Golle# good/ -- must exit 0 and produce no output in both modes
27*efb6347dSDaniel Gollefor f in "$here"/good/*; do
28*efb6347dSDaniel Golle    [ -e "$f" ] || continue
29*efb6347dSDaniel Golle    for mode in relaxed strict; do
30*efb6347dSDaniel Golle        out=$(run "$f" "$mode")
31*efb6347dSDaniel Golle        rc=$?
32*efb6347dSDaniel Golle        if [ -n "$out" ] || [ "$rc" -ne 0 ]; then
33*efb6347dSDaniel Golle            echo "FAIL good/$mode: $(basename "$f") (exit $rc, want 0):"
34*efb6347dSDaniel Golle            echo "$out" | sed 's/^/  /'
35*efb6347dSDaniel Golle            fail=$((fail + 1))
36*efb6347dSDaniel Golle        fi
37*efb6347dSDaniel Golle    done
38*efb6347dSDaniel Golledone
39*efb6347dSDaniel Golle
40*efb6347dSDaniel Golle# bad/ -- must match expected/<name>.txt
41*efb6347dSDaniel Gollefor f in "$here"/bad/*; do
42*efb6347dSDaniel Golle    [ -e "$f" ] || continue
43*efb6347dSDaniel Golle    name=$(basename "$f")
44*efb6347dSDaniel Golle    expected="$here/expected/$name.txt"
45*efb6347dSDaniel Golle    if [ ! -f "$expected" ]; then
46*efb6347dSDaniel Golle        echo "FAIL bad: missing $expected"
47*efb6347dSDaniel Golle        fail=$((fail + 1))
48*efb6347dSDaniel Golle        continue
49*efb6347dSDaniel Golle    fi
50*efb6347dSDaniel Golle    mode=$(head -1 "$expected" | sed 's/^# mode=//')
51*efb6347dSDaniel Golle    body=$(tail -n +2 "$expected")
52*efb6347dSDaniel Golle    out=$(run "$f" "$mode")
53*efb6347dSDaniel Golle    rc=$?
54*efb6347dSDaniel Golle    # Strip the directory prefix so expected files are portable.
55*efb6347dSDaniel Golle    out=$(printf '%s\n' "$out" | sed "s|$here/bad/|bad/|g")
56*efb6347dSDaniel Golle    if [ "$out" != "$body" ] || [ "$rc" -ne 1 ]; then
57*efb6347dSDaniel Golle        echo "FAIL bad/$mode: $name (exit $rc, want 1):"
58*efb6347dSDaniel Golle        bf=$(mktemp)
59*efb6347dSDaniel Golle        printf '%s\n' "$body" > "$bf"
60*efb6347dSDaniel Golle        printf '%s\n' "$out" | diff -u "$bf" - | sed 's/^/  /'
61*efb6347dSDaniel Golle        rm -f "$bf"
62*efb6347dSDaniel Golle        fail=$((fail + 1))
63*efb6347dSDaniel Golle    fi
64*efb6347dSDaniel Golledone
65*efb6347dSDaniel Golle
66*efb6347dSDaniel Golleif [ "$fail" -eq 0 ]; then
67*efb6347dSDaniel Golle    echo "PASS"
68*efb6347dSDaniel Golle    exit 0
69*efb6347dSDaniel Gollefi
70*efb6347dSDaniel Golleecho "FAILED ($fail)"
71*efb6347dSDaniel Golleexit 1
72