#!/bin/sh -e

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

iface eth1 inet static
  address 1.2.3.4/14
  broadcast 1.3.255.255
  up echo hi
  post-up echo hello

iface eth2 inet static
  address 1.2.3.4/14
  netmask 255.255.255.128
  broadcast 1.2.3.127
  up echo hi
  post-up echo hello

iface eth3 inet static
  address 1.2.3.4/24
  broadcast -
  up true

iface eth3 inet static
  address 1.2.3.4/30
  broadcast -
  up true

iface eth3 inet static
  address 1.2.3.4/31
  up true

iface eth3 inet static
  address 1.2.3.4/31
  broadcast -
  up true
EOF
cat >tests/up.1 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1=eth1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.252.0.0 broadcast 1.3.255.255 	  dev eth1 label eth1
/bin/ip link set dev eth1   up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2=eth2 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.128 broadcast 1.2.3.127 	  dev eth2 label eth2
/bin/ip link set dev eth2   up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.0 	  dev eth3 label eth3
/bin/ip link set dev eth3   up

true
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.252 broadcast 1.2.3.4 	  dev eth3 label eth3
/bin/ip link set dev eth3   up

true
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.254 broadcast 255.255.255.255 	  dev eth3 label eth3
/bin/ip link set dev eth3   up

true
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.254 broadcast 0.0.0.0 	  dev eth3 label eth3
/bin/ip link set dev eth3   up

true
/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 eth0 eth1 eth2
auto eth3 eth4 eth5
allow-hotplug eth6
iface eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
iface eth1 inet static
  address 1.3.4.5
  netmask 255.255.255.0
iface eth2 inet static
  address 1.4.5.6
  netmask 255.255.255.0
iface eth3 inet static
  address 1.5.6.7
  netmask 255.255.255.0
iface eth4 inet static
  address 1.7.8.9
  netmask 255.255.255.0
iface eth5 inet static
  address 1.8.9.10
  netmask 255.255.255.0
iface eth6 inet static
  address 1.11.12.13
  netmask 255.255.255.0
iface eth7 inet static
  address 1.14.15.16
  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 eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1=eth1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.3.4.5/255.255.255.0 broadcast 1.3.4.255 	  dev eth1 label eth1
/bin/ip link set dev eth1   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2=eth2 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.4.5.6/255.255.255.0 broadcast 1.4.5.255 	  dev eth2 label eth2
/bin/ip link set dev eth2   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.5.6.7/255.255.255.0 broadcast 1.5.6.255 	  dev eth3 label eth3
/bin/ip link set dev eth3   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth4=eth4 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.7.8.9/255.255.255.0 broadcast 1.7.8.255 	  dev eth4 label eth4
/bin/ip link set dev eth4   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth5=eth5 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.8.9.10/255.255.255.0 broadcast 1.8.9.255 	  dev eth5 label eth5
/bin/ip link set dev eth5   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 eth0 eth1
iface eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::1
  netmask 64
  dad-attempts 0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::2/64
  dad-attempts 0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::3/64
  netmask 64
  dad-attempts 0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::4/
  dad-attempts 0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::5/64
  netmask 128
  dad-attempts 0
iface eth0 inet6 static
  address /64
  dad-attempts 0
iface eth0 inet6 static
  address /
  dad-attempts 0

iface eth1 inet6 static
  address 3ffe:ffff:100:f102::1/64
  gateway 3ffe:ffff:100:f102::fff
  dad-attempts 0
iface eth1 inet6 static
  address 3ffe:ffff:100:f102::6/64
  gateway 3ffe:ffff:100:f102::fff
  accept_ra 1
  dad-attempts 0
EOF
cat >tests/up.3 <<EOF
====stdout====
Failed to bring up eth0.
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::1/64  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::2/64  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::3/64  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::4  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::5/128  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 64  dev eth0 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
Missing required variable: address
Missing required configuration variables for interface eth0/inet6.
Configuring interface eth1=eth1 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.

/sbin/sysctl -q -e -w net.ipv6.conf.eth1.accept_ra=0
/sbin/sysctl -q -e -w net.ipv6.conf.eth1.autoconf=0

/bin/ip link set dev eth1   up
/bin/ip -6 addr add 3ffe:ffff:100:f102::1/64  dev eth1 
 /bin/ip -6 route add default via 3ffe:ffff:100:f102::fff  dev eth1 onlink
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1=eth1 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.

/sbin/sysctl -q -e -w net.ipv6.conf.eth1.accept_ra=1
/sbin/sysctl -q -e -w net.ipv6.conf.eth1.autoconf=0

/bin/ip link set dev eth1   up
/bin/ip -6 addr add 3ffe:ffff:100:f102::6/64  dev eth1 
 /bin/ip -6 route add default via 3ffe:ffff:100:f102::fff  dev eth1 onlink
/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: eth0=work
mapping 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 eth0=work (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   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 eth0
iface 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 eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0  address 00:DE:AD:00:BE:AF 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 eth0
iface 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 eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0  address 00:DE:AD:00:BE:AF 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.7 <<EOF
# RUN: -a
auto eth0 eth0.1 eth0.0201 br0.0201 br0.0202 tunnel
iface eth0 inet static
  address 1.2.3.4
  netmask 255.255.255.0
iface eth0 inet6 static
  address 3ffe:ffff:100:f101::1
  netmask 64
  privext 2
  accept_ra 0
  dad-attempts 0
iface eth0.1 inet6 static
  address 3ffe:ffff:120:f101::1
  netmask 64
  dad-attempts 0
iface eth0.0201 inet static
  address 192.168.0.1/25
iface br0.0201 inet manual
  bridge_ports eth0.0201
iface br0.0202 inet manual
iface tunnel inet6 6to4
  local 1.2.3.4
EOF
cat >tests/up.7 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.
/sbin/sysctl -q -e -w net.ipv6.conf.eth0.use_tempaddr=2
/sbin/sysctl -q -e -w net.ipv6.conf.eth0.accept_ra=0
/sbin/sysctl -q -e -w net.ipv6.conf.eth0.autoconf=0

/bin/ip link set dev eth0   up
/bin/ip -6 addr add 3ffe:ffff:100:f101::1/64 dev eth0

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0.1=eth0.1 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth0/1.autoconf=0

/bin/ip link set dev eth0.1   up
/bin/ip -6 addr add 3ffe:ffff:120:f101::1/64 dev eth0.1

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0.0201=eth0.0201 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 192.168.0.1/255.255.255.128 broadcast 192.168.0.127 	  dev eth0.0201 label eth0.0201
/bin/ip link set dev eth0.0201   up

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


/bin/ip link set dev br0.0201 up 2>/dev/null || true
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface br0.0202=br0.0202 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d


/bin/ip link set dev br0.0202 up 2>/dev/null || true
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface tunnel=tunnel (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.
/bin/ip tunnel add tunnel mode sit remote any local 1.2.3.4        
/bin/ip link set tunnel up 
/bin/ip addr add 2002:0102:0304::1/16 dev tunnel
/bin/ip route add 2000::/3 via ::192.88.99.1 dev tunnel
/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.8 <<EOF
# RUN: -a
auto eth1 eth1:1 eth2.2 eth2.2:3
iface eth1 inet static
  address 1.2.3.4
  netmask 255.255.255.0
  up echo hi
  post-up echo hello

iface eth1:1 inet static
  address 1.5.3.4
  netmask 255.255.255.0
  up echo hihi
  post-up echo hellolo

iface eth2.2 inet static
  address 2.3.4.5/24

iface eth2.2:3 inet static
  address 3.4.5.6/23
EOF
cat >tests/up.8 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
Configuring interface eth1=eth1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth1 label eth1
/bin/ip link set dev eth1   up

echo hi
echo hello
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1:1=eth1:1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.5.3.4/255.255.255.0 broadcast 1.5.3.255 	  dev eth1:1 label eth1:1
/bin/ip link set dev eth1:1   up

echo hihi
echo hellolo
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2.2=eth2.2 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 2.3.4.5/255.255.255.0 broadcast 2.3.4.255 	  dev eth2.2 label eth2.2
/bin/ip link set dev eth2.2   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2.2:3=eth2.2:3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 3.4.5.6/255.255.254.0 broadcast 3.4.5.255 	  dev eth2.2:3 label eth2.2:3
/bin/ip link set dev eth2.2:3   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.9 <<EOF
# RUN: tunnel -o local=2.3.4.5
iface tunnel inet6 6to4
  local 1.2.3.4
EOF
cat >tests/up.9 <<EOF
====stdout====
====stderr====
Configuring interface tunnel=tunnel (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.
/bin/ip tunnel add tunnel mode sit remote any local 2.3.4.5        
/bin/ip link set tunnel up 
/bin/ip addr add 2002:0203:0405::1/16 dev tunnel
/bin/ip route add 2000::/3 via ::192.88.99.1 dev tunnel
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

cat >tests/testcase.10 <<EOF
# RUN: -a
source /dev/null
source null
EOF
cat >tests/up.10 <<EOF
====stdout====
====stderr====
Parsing file /dev/null
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
EOF

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

iface 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
/bin/ip link set dev lo up
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255 	  dev eth0 label eth0
/bin/ip link set dev eth0   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.12 <<EOF
auto lo eth0

iface
EOF
cat >tests/up.12 <<EOF
====stdout====
====stderr====
tests/testcase.12:3: too few parameters for iface line
./ifup: couldn't read interfaces file "tests/testcase.12"
EOF

# don't create the input file for this testcase
# cat >tests/testcase.13
cat >tests/up.13 <<EOF
====stdout====
====stderr====
warning: couldn't open interfaces file "tests/testcase.13"
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip link set up dev lo 2>/dev/null
Configuring interface lo=lo (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/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.14 <<EOF
auto eth0 eth1 eth2 eth3

iface eth0 inet static
    address 1.2.3.4/24

iface eth1 inet static wrong

iface eth2 inet static inherits eth0

iface eth3 inet inherits eth0

iface eth4 inherits eth0

iface eth5 inet static inherits 
EOF
cat >tests/up.14 <<EOF
====stdout====
====stderr====
tests/testcase.14:6: extra parameter for the iface line not understood and ignored: wrong
tests/testcase.14:14: 'inherits' keyword is missing a parameter
./ifup: couldn't read interfaces file "tests/testcase.14"
EOF

cat >tests/testcase.15 <<EOF
auto eth0 eth3

iface eth0 inet static
    address 1.2.3.4/24

iface eth3 inet static inherits
EOF
cat >tests/up.15 <<EOF
====stdout====
====stderr====
tests/testcase.15:6: 'inherits' keyword is missing a parameter
./ifup: couldn't read interfaces file "tests/testcase.15"
EOF

cat >tests/testcase.16 <<EOF
auto eth0 eth1 eth2 eth3

iface ethernet inet static
    mtu 1500
    hwaddress 12:34:56:89:0a:bc

iface ethernet inet6 static
    mtu 1492
    hwaddress 12:34:ff:fe:0a:bc

iface eth0 inet static
    address 1.2.3.4/24

iface eth1 inet static inherits ethernet
    address 1.2.3.4/24

iface eth1 inet6 static inherits ethernet
    address 3ffe:ffff:120::fffe:1/64

iface eth2 inet inherits ethernet
    address 1.2.3.5/24

iface eth2 inet6 inherits ethernet
    address 3ffe:ffff:120::fffe:1/64

iface eth3 inherits ethernet
    address 1.2.3.5/24
EOF
cat >tests/up.16 <<EOF
====stdout====
====stderr====
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip link set up dev lo 2>/dev/null
Configuring interface lo=lo (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth0=eth0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255     dev eth0 label eth0
/bin/ip link set dev eth0   up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1=eth1 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.4/255.255.255.0 broadcast 1.2.3.255     dev eth1 label eth1
/bin/ip link set dev eth1 mtu 1500 address 12:34:56:89:0a:bc up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth1=eth1 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth1.autoconf=0
/sbin/sysctl -q -e -w net.ipv6.conf.eth1.mtu=1492
/bin/ip link set dev eth1 address 12:34:ff:fe:0a:bc up
/bin/ip -6 addr add 3ffe:ffff:120::fffe:1/64  dev eth1 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2=eth2 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.5/255.255.255.0 broadcast 1.2.3.255 	  dev eth2 label eth2
/bin/ip link set dev eth2 mtu 1500 address 12:34:56:89:0a:bc up

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth2=eth2 (inet6)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/sbin/modprobe -q net-pf-10 > /dev/null 2>&1 || true # ignore failure.


/sbin/sysctl -q -e -w net.ipv6.conf.eth2.autoconf=0
/sbin/sysctl -q -e -w net.ipv6.conf.eth2.mtu=1492
/bin/ip link set dev eth2 address 12:34:ff:fe:0a:bc up
/bin/ip -6 addr add 3ffe:ffff:120::fffe:1/64  dev eth2 

/bin/run-parts --exit-on-error --verbose /etc/network/if-up.d
Configuring interface eth3=eth3 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
/bin/ip addr add 1.2.3.5/255.255.255.0 broadcast 1.2.3.255 	  dev eth3 label eth3
/bin/ip link set dev eth3 mtu 1500 address 12:34:56:89:0a:bc 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


result=true
for test in 1 2 3 4 5 6 7 8 9 10; 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

for test in 11 12 13 14 15 16; do
        args="-a"
        ./ifup -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
