#!/bin/sh

set -e

. ./helpers

ME=$(basename $0)

CREATIONS="^(addbr |addif |tuntap add |link add )"

setup_sandbox

# Tearing down a fresh host (or re-tearing down) must never crash.
run_net stop
assert_eq "stop on a fresh host rc" "${NET_RC}" "0"

# First start: everything is created.
run_net start
assert_eq "first start rc" "${NET_RC}" "0"
segment "${SANDBOX}/start-1.log"
assert_eq "created objects on first start" "$(creation_count "${SANDBOX}/start-1.log")" "708"

# Re-running start on the configured host must not create anything,
# and must not crash: this is what the re-entrancy guards are for.
run_net start
assert_eq "second start rc" "${NET_RC}" "0"
segment "${SANDBOX}/start-2.log"
assert_eq "created objects on re-run" "$(creation_count "${SANDBOX}/start-2.log")" "0"

# Stopping twice in a row must never crash either.
run_net stop
assert_eq "first stop rc" "${NET_RC}" "0"
run_net stop
assert_eq "second stop rc" "${NET_RC}" "0"

# After a full cycle, a new start recreates exactly the same
# inventory, with the same MAC addresses.
run_net start
assert_eq "start after a full cycle rc" "${NET_RC}" "0"
segment "${SANDBOX}/start-3.log"
assert_eq "created objects after a full cycle" "$(creation_count "${SANDBOX}/start-3.log")" "708"
grep -E "${CREATIONS}" "${SANDBOX}/start-1.log" | sort >"${SANDBOX}/start-1.sorted"
grep -E "${CREATIONS}" "${SANDBOX}/start-3.log" | sort >"${SANDBOX}/start-3.sorted"
if ! cmp -s "${SANDBOX}/start-1.sorted" "${SANDBOX}/start-3.sorted" ; then
	echo "${ME}: start after a full cycle is not identical to the first start"
	diff "${SANDBOX}/start-1.sorted" "${SANDBOX}/start-3.sorted"
	exit 1
fi

# And the final stop tears everything down again.
run_net stop
assert_eq "final stop rc" "${NET_RC}" "0"

exit 0
