#!/bin/sh

. ../support/simple_eval_tools.sh

HEADER com2sec6 directive

SKIPIFNOT NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
SKIPIF NETSNMP_NO_DEBUGGING

#
# Begin test
#

# 601a Test missing CONTEXT
CONFIGAGENT 'com2sec6 -Cn'
# 601b Test empty CONTEXT
CONFIGAGENT 'com2sec6 -Cn ""'
# 601c Test overlong CONTEXT (34 chars)
CONFIGAGENT 'com2sec6 -Cn 1234567890123456789012345678901234'

# 602a Test missing secName
CONFIGAGENT 'com2sec6'
# 602b Test empty secName
CONFIGAGENT 'com2sec6 ""'
# 602c Test overlong secName (34 chars)
CONFIGAGENT 'com2sec6 1234567890123456789012345678901234'
# 602d Test valid context and missing secName
CONFIGAGENT 'com2sec6 -Cn 123456789012345678901234567890123'
# 602e Test valid context and empty secName
CONFIGAGENT 'com2sec6 -Cn 123456789012345678901234567890123 ""'

# 603a Test missing network address
CONFIGAGENT 'com2sec6 t603a'
# 603b Test empty network address
CONFIGAGENT 'com2sec6 t603b ""'
# 603c Test forbidden value
CONFIGAGENT 'com2sec6 t603c NETWORK'

# 604a Test missing COMMUNITY
CONFIGAGENT 'com2sec6 t604a default'
# 604b 'Error: empty COMMUNITY parameter'
CONFIGAGENT 'com2sec6 t604b default ""'
# 604c Test overlong COMMUNITY
CONFIGAGENT 'com2sec6 t604c default 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345'
# 604d Test barely valid community
CONFIGAGENT 'com2sec6 t604d default 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234'
# 604e Test forbidden value
CONFIGAGENT 'com2sec6 t604e default COMMUNITY'

# 605a Test 'default' configuration
CONFIGAGENT 'com2sec6 t605a default c605a'
# 605b Test ip address configuration
CONFIGAGENT 'com2sec6 t605b aa00:: c605b'
# 605c Test valid numeric mask
CONFIGAGENT 'com2sec6 t605c aa00::/8 c605c'
# 605d Test invalid numeric mask (too big)
CONFIGAGENT 'com2sec6 t605d aa00::/129 c605d'
# 605e Test invalid numeric mask (negative)
CONFIGAGENT 'com2sec6 t605e aa00::/-1 c605e'
# 605f Test valid ip address mask
CONFIGAGENT 'com2sec6 t605f aa00::/ff00:: c605f'
# 605g Test invalid ip address mask
CONFIGAGENT 'com2sec6 t605g aa00::/fffff:: c605g'
# 605h Test invalid ip address mask
CONFIGAGENT 'com2sec6 t605h aa00::/gg00:: c605h'
# 605i Test address with 1 bits not covered by the mask
CONFIGAGENT 'com2sec6 t605i aa00::/0ff0:: c605i'

# 606a Test maximally long address/mask
CONFIGAGENT 'com2sec6 t606a ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff c606a'

# 607a Test non existant host name
CONFIGAGENT 'com2sec6 t607a no.such.address. c607a'
# 607b Test maximally long host name/mask
CONFIGAGENT 'com2sec6 t607b a23456789012345678901234567890123456789012345678901234567890123.a23456789012345678901234567890123456789012345678901234567890123.a23456789012345678901234567890123456789012345678901234567890123.a234567890123456789012345678901234567890123456789012345678901./ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff c607b'

# 608 Lookup tests, require network access
# 608a Test lookup returning a single host
CONFIGAGENT 'com2sec6 t608a oneaaaa.net-snmp.org c608a'
# 608b Test lookup returning multiple hosts
CONFIGAGENT 'com2sec6 t608b twoaaaa.net-snmp.org c608b'

# Default agent setup
CONFIGAGENT "[snmp] persistentdir $SNMP_TMP_PERSISTENTDIR"
# Dummy config to prevent the basic_setup warning
CONFIGAGENT 'rocommunity public 127.0.0.0/8'

AGENT_FLAGS='-Dnetsnmp_udp_parse_security,netsnmp_udp6_parse_security,netsnmp_unix_parse_security'

STARTAGENT

SAVECHECKAGENT() {
    CHECKAGENT "$@"
    if [ "x$return_value" != "x0" ] ; then
        FINISHED
    fi
}

# 601
SAVECHECKAGENT 'line 1: Error: missing CONTEXT_NAME parameter'
SAVECHECKAGENT 'line 2: Error: missing NAME parameter'
SAVECHECKAGENT 'line 3: Error: context name too long'
# 602
CHECKAGENTCOUNT atleastone 'line 4: Error: Blank line following com2sec6 token.'
SAVECHECKAGENT 'line 5: Error: empty NAME parameter'
SAVECHECKAGENT 'line 6: Error: security name too long'
SAVECHECKAGENT 'line 7: Error: missing NAME parameter'
SAVECHECKAGENT 'line 8: Error: empty NAME parameter'
# 603
SAVECHECKAGENT 'line 9: Error: missing SOURCE parameter'
SAVECHECKAGENT 'line 10: Error: empty SOURCE parameter'
SAVECHECKAGENT 'line 11: Error: example config NETWORK not properly configured'
# 604
SAVECHECKAGENT 'line 12: Error: missing COMMUNITY parameter'
SAVECHECKAGENT 'line 13: Error: empty COMMUNITY parameter'
SAVECHECKAGENT 'line 14: Error: community name too long'
SAVECHECKAGENT '<"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", ::/::> => "t604d"'
SAVECHECKAGENT 'line 16: Error: example config COMMUNITY not properly configured'
# 605
SAVECHECKAGENT '<"c605a", ::/::> => "t605a"'
SAVECHECKAGENT '<"c605b", aa00::/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff> => "t605b"'
SAVECHECKAGENT '<"c605c", aa00::/ff00::> => "t605c"'
SAVECHECKAGENT 'line 20: Error: bad mask length'
SAVECHECKAGENT 'line 21: Error: bad mask length'
SAVECHECKAGENT '<"c605f", aa00::/ff00::> => "t605f"'
SAVECHECKAGENT 'line 23: Error: bad mask'
SAVECHECKAGENT 'line 24: Error: bad mask'
SAVECHECKAGENT 'line 25: Error: source/mask mismatch'
# 606
SAVECHECKAGENT '<"c606a", ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff> => "t606a"'
# 607
SAVECHECKAGENT 'line 27: Error:'
SAVECHECKAGENT 'line 28: Error:'

# 608
CHECKAGENT '<"c608a"'
if [ "$snmp_last_test_result" -eq 0 ] ; then
  CHECKAGENT 'line 29: Error:'
  errnum=`expr $errnum - 1`
  if [ "$snmp_last_test_result" -ne 1 ] ; then
    FINISHED
  fi
elif [ "$snmp_last_test_result" -ne 1 ] ; then
  FINISHED
fi

CHECKAGENTCOUNT atleastone '<"c608b"'
if [ "$snmp_last_test_result" -eq 0 ] ; then
  CHECKAGENT 'line 30: Error:'
  if [ "$snmp_last_test_result" -eq 1 ] ; then
    errnum=`expr $errnum - 1`
  fi
fi

FINISHED
