#! /usr/libexec/atf-sh
# SPDX-License-Identifier: ISC
#
# Copyright (c) 2025 Lexi Winter

. $(atf_get_srcdir)/../../sys/common/vnet.subr

# Bug 286910: adding 'netmask' or 'broadcast' to an IPv6 address crashed
# ifconfig.

atf_test_case "netmask" "cleanup"
netmask_head()
{
	atf_set descr "Test invalid 'netmask' option"
	atf_set require.user root
}

netmask_body()
{
	vnet_init

	ep=$(vnet_mkepair)
	vnet_mkjail ifcjail ${ep}a

	# Add the address the wrong way
	atf_check -s exit:1 \
	    -e match:"ifconfig: netmask: invalid option for inet6" \
	    jexec ifcjail ifconfig ${ep}a inet6 2001:db8:1::1 netmask 64

	# Add the address the correct way
	atf_check -s exit:0 \
	    jexec ifcjail ifconfig ${ep}a inet6 2001:db8:1::1/64
	atf_check -s exit:0 -o match:"2001:db8:1::1 prefixlen 64" \
	    jexec ifcjail ifconfig ${ep}a

	# Remove the address the wrong way
	atf_check -s exit:1 \
	    -e match:"ifconfig: netmask: invalid option for inet6" \
	    jexec ifcjail ifconfig ${ep}a inet6 2001:db8:1::1 netmask 64 -alias
}

netmask_cleanup()
{
	vnet_cleanup
}

atf_test_case "broadcast" "cleanup"
broadcast_head()
{
	atf_set descr "Test invalid 'broadcast' option"
	atf_set require.user root
}

broadcast_body()
{
	vnet_init

	ep=$(vnet_mkepair)
	vnet_mkjail ifcjail ${ep}a

	atf_check -s exit:1 \
	    -e match:"ifconfig: broadcast: invalid option for inet6" \
	    jexec ifcjail ifconfig ${ep}a \
	        inet6 2001:db8:1::1 broadcast 2001:db8:1::ffff

	atf_check -s exit:0 \
	    jexec ifcjail ifconfig ${ep}a inet6 2001:db8:1::1/64

	atf_check -s exit:1 \
	    -e match:"ifconfig: broadcast: invalid option for inet6" \
	    jexec ifcjail ifconfig ${ep}a \
	        inet6 2001:db8:1::1 broadcast 2001:db:1::ffff -alias
}

broadcast_cleanup()
{
	vnet_cleanup
}

atf_test_case "delete6" "cleanup"
delete6_head()
{
	atf_set descr 'Test removing IPv6 addresses'
	atf_set require.user root
}

delete6_body()
{
	vnet_init

	ep=$(vnet_mkepair)

	atf_check -s exit:0 \
	    ifconfig ${ep}a inet6 fe80::42/64
	atf_check -s exit:0 -o match:"fe80::42%${ep}" \
	    ifconfig ${ep}a inet6

	atf_check -s exit:0 \
	    ifconfig ${ep}a inet6 -alias fe80::42
	atf_check -s exit:0 -o not-match:"fe80::42%${ep}" \
	    ifconfig ${ep}a inet6
}

delete6_cleanup()
{
	vnet_cleanup
}

atf_init_test_cases()
{
	atf_add_test_case netmask
	atf_add_test_case broadcast
	atf_add_test_case delete6
}
