% Regression tests for Scapy Nmap module

~ nmap

############
############
+ Basic Nmap OS fingerprints tests

= Module loading
load_module('nmap')

= Test functions

d = nmap_udppacket_sig(IP()/UDP(), IP(raw(IP()/ICMP(type=3, code=2)/IPerror()/UDPerror())))
assert len(d) == 9

d = nmap_tcppacket_sig(IP()/TCP())
assert len(d) == 5

= Fetch database
from __future__ import print_function
try:
    from urllib.request import urlopen
except ImportError:
    from urllib2 import urlopen

for i in range(10):
    try:
        open('nmap-os-fingerprints', 'wb').write(urlopen('https://raw.githubusercontent.com/nmap/nmap/9efe1892/nmap-os-fingerprints').read())
        break
    except:
        pass

conf.nmap_base = 'nmap-os-fingerprints'

= Database loading
assert len(nmap_kdb.get_base()) > 100

= fingerprint test: www.secdev.org
~ netaccess
score, fprint = nmap_fp('www.secdev.org')
print(score, fprint)
assert score > 0.5
assert fprint

= fingerprint test: gateway
~ netaccess
score, fprint = nmap_fp(conf.route.route('0.0.0.0')[2])
print(score, fprint)
assert score > 0.5
assert fprint

= fingerprint test: to text
~  netaccess

import re as re_

a = nmap_sig("www.secdev.org", 80, 81)
a
for x in nmap_sig2txt(a).split("\n"):
    assert re_.match(r"\w{2,4}\(.*\)", x)

= nmap_udppacket_sig test: www.google.com
~ netaccess

a = nmap_sig("www.google.com", ucport=80)
assert len(a) > 3
assert len(a["PU"]) > 0

+ Nmap errors triggering

= Nmap base not available

nmap_kdb.filename = "invalid"
nmap_kdb.reload()
assert nmap_kdb.filename == None

= Clear temp files
try:
    os.remove('nmap-os-fingerprints')
except:
    pass

