#!/bin/sh -e

cat >tests/testcase.1 <<EOF
# RUN: -a
auto /dev/eth0
iface /dev/eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
  up echo hi
  post-up echo hello

# iface /dev/eth0 inet dhcp
EOF
cat >tests/up.1 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.2 <<EOF
# RUN: -a
auto /dev/eth0 /dev/eth1 /dev/eth2
allow-hotplug /dev/eth2
iface /dev/eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
iface /dev/eth1 inet static
  address 1.3.4.5
  netmask 255.255.255.0
iface /dev/eth2 inet static
  address 1.4.5.6
  netmask 255.255.255.0
EOF
cat >tests/up.2 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface /dev/eth1=/dev/eth1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth1 --address 1.3.4.5 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface /dev/eth2=/dev/eth2 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth2 --address 1.4.5.6 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.3 <<EOF
# RUN: -a
auto /dev/eth0
iface /dev/eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
iface /dev/eth0 inet6 static
  address 3ffe:ffff:100:f101::1
  netmask 64
EOF
cat >tests/up.3 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
FIXME: Add proper commands here for ipv6


/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.4 <<EOF
# RUN: /dev/eth0=work
mapping /dev/eth0
  script tests/map.eth0.work
iface work inet static
  address 1.2.3.4
  netmask 255.255.255.0
  up echo hi
  post-up echo hello
EOF
cat >tests/up.4 <<EOF
====stdout====
====stderr====
Configuring interface /dev/eth0=work (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.5 <<EOF
# RUN: -a
auto /dev/eth0
iface /dev/eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
  hwaddress ether 00:DE:AD:00:BE:AF
EOF
cat >tests/up.5 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Warning: Option hwaddress: 00:DE:AD:00:BE:AF not yet supported
inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.6 <<EOF
# RUN: -a
auto /dev/eth0
iface /dev/eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
  hwaddress 00:DE:AD:00:BE:AF
EOF
cat >tests/up.6 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Warning: Option hwaddress: 00:DE:AD:00:BE:AF not yet supported
inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4 --netmask 255.255.255.0           --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.11 <<EOF
# RUN: -a
auto lo /dev/eth0

iface /dev/eth0 inet static
address 1.2.3.4/24

iface lo inet loopback
pre-up configure lo
post-down deconfigure lo
EOF
cat >tests/up.11 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface lo=lo (inet)
configure lo
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
inetutils-ifconfig --interface lo --address 127.0.0.1 --up
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface /dev/eth0=/dev/eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d

inetutils-ifconfig --interface /dev/eth0 --address 1.2.3.4/24        --up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

# Note: Testcase 7 is not run on GNU/Hurd, tunnel is not yet implemented.
result=true
for test in 1 2 3 4 5 6 11; do
        args="$(cat tests/testcase.$test | sed -n 's/^# RUN: //p')"
        ./ifup --no-loopback -nv --force -i tests/testcase.$test $args \
                >tests/up-res-out.$test 2>tests/up-res-err.$test || 
                true
        (echo "====stdout===="; cat tests/up-res-out.$test
         echo "====stderr===="; cat tests/up-res-err.$test) > tests/up-res.$test

        echo "Testcase $test: $args"
        
        if diff -ub tests/up.$test tests/up-res.$test; then
                echo "(okay)"
        else
                echo "(failed)"
                result=false
        fi
        echo "=========="
done

if $result; then
        echo "(okay overall)"
        exit 0
else
        echo "(failed overall)"
        exit 1
fi
