% Tests for nlm module
############
############
+  Packet creation tests

= Create subpackets
File_Object()
NLM4_Cookie()
Object_Name()

= Create nlm Calls
SHARE_Call()
UNSHARE_Call()
LOCK_Call()
UNLOCK_Call()
GRANTED_MSG_Call()
GRANTED_RES_Call()
CANCEL_Call()
TEST_Call()

= Create nlm Replies
SHARE_Reply()
UNSHARE_Reply()
LOCK_Reply()
UNLOCK_Reply()
GRANTED_MSG_Reply()
GRANTED_RES_Reply()
CANCEL_Reply()
TEST_Reply()

+ Layer bindings tests

= RPC Layer Bindings for NLM Calls
from scapy.contrib.oncrpc import *
pkt = RPC()/RPC_Call()/SHARE_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 20)
pkt = RPC()/RPC_Call()/UNSHARE_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 21)
pkt = RPC()/RPC_Call()/LOCK_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 2)
pkt = RPC()/RPC_Call()/UNLOCK_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 4)
pkt = RPC()/RPC_Call()/GRANTED_MSG_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 10)
pkt = RPC()/RPC_Call()/GRANTED_RES_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 15)
pkt = RPC()/RPC_Call()/CANCEL_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 3)
pkt = RPC()/RPC_Call()/TEST_Call()
assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 1)

= RPC Layer Bindings for NLM Replies
from scapy.contrib.oncrpc import *
pkt = RPC()/RPC_Reply()/SHARE_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/UNSHARE_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/LOCK_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/UNLOCK_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/GRANTED_MSG_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/GRANTED_RES_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/CANCEL_Reply()
assert pkt.mtype == 1
pkt = RPC()/RPC_Reply()/TEST_Reply()
assert pkt.mtype == 1

+ Test Built Packets Against Raw Strings

= Built NLM Calls vs Raw Strings
pkt = SHARE_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    mode=1,
    access=2,
    reclaim='YES'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01'

pkt = UNSHARE_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    mode=1,
    access=2,
    reclaim='YES'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01'

pkt = LOCK_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    block='YES',
    exclusive='YES',
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    svid=1,
    l_offset=2,
    l_len=3,
    reclaim=1,
    state=4
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x04'

pkt = UNLOCK_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    svid=1,
    l_offset=2,
    l_len=3
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03'

pkt = GRANTED_MSG_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    exclusive='YES',
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    svid=1,
    l_offset=2,
    l_len=3
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03'

pkt = GRANTED_RES_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_BLOCKED'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x03'

pkt = CANCEL_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    block='YES',
    exclusive='YES',
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    svid=1,
    l_offset=2,
    l_len=3
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03'

pkt = TEST_Call(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    exclusive='YES',
    caller=Object_Name(
        length=6,
        _name='CALLER',
        fill='\x00\x00'
    ),
    filehandle=File_Object(
        length=4,
        fh='file'
    ),
    owner=Object_Name(
        length=5,
        _name='OWNER',
        fill='\x00'
    ),
    svid=1,
    l_offset=2,
    l_len=3
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03'


= NLM Replies vs Raw Strings
pkt = SHARE_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED',
    sequence=1
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01'

pkt = UNSHARE_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED',
    sequence=1
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01'

pkt = LOCK_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01'

pkt = UNLOCK_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01'

pkt = CANCEL_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01'

pkt = TEST_Reply(
    cookie=NLM4_Cookie(
        length=6,
        contents='COOKIE',
        fill='\x00\x00'
    ),
    status='NLM4_DENIED'
)
assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01'
