Skip to content
Snippets Groups Projects
regression.uts 343 KiB
Newer Older
Phil's avatar
Phil committed
% Regression tests for Scapy

# More informations at http://www.secdev.org/projects/UTscapy/

############
############
+ Informations on Scapy

= Get conf
~ conf command
* Dump the current configuration
conf

= List layers
~ conf command
ls()

= List commands
~ conf command
lsc()

= Configuration
~ conf
conf.debug_dissector = True
Phil's avatar
Phil committed


############
############
+ Scapy functions tests

= Interface related functions

get_if_raw_hwaddr(conf.iface)

get_if_raw_addr(conf.iface).encode("hex")

def get_dummy_interface():
    """Returns a dummy network interface"""
    if WINDOWS:
        data = {}
        data["name"] = "dummy0"
        data["description"] = "Does not exist"
        data["win_index"] = -1
        data["guid"] = "{0XX00000-X000-0X0X-X00X-00XXXX000XXX}"
        data["invalid"] = True
        return NetworkInterface(data)
    else:
        return "dummy0"

get_if_raw_addr(get_dummy_interface())
get_if_list()

get_if_raw_addr6(conf.iface6)

= Test read_routes6() - default output

routes6 = read_routes6()
if WINDOWS:
    route_add_loopback(routes6, True)

# Expected results:
# - one route if there is only the loopback interface
# - three routes if there is a network interface

if len(routes6):
    iflist = get_if_list()
    if WINDOWS:
        route_add_loopback(ipv6=True, iflist=iflist)
    if iflist == [LOOPBACK_NAME]:
	len(routes6) == 1
    elif len(iflist) >= 2:
	len(routes6) >= 3
    else:
	False
else:
    # IPv6 seems disabled. Force a route to ::1
    conf.route6.routes.append(("::1", 128, "::", LOOPBACK_NAME, ["::1"]))
    True

= Test read_routes6() - check mandatory routes

if len(routes6):
    assert(len(filter(lambda r: r[0] == "::1" and r[-1] == ["::1"], routes6)) >= 1)
    if iflist >= 2:
	assert(len(filter(lambda r: r[0] == "fe80::" and r[1] == 64, routes6)) >= 1)
	len(filter(lambda r: in6_islladdr(r[0]) and r[1] == 128 and r[-1] == ["::1"], routes6)) >= 1
else:
    True
= Test ifchange()
conf.route6.ifchange(LOOPBACK_NAME, "::1/128")
True

gpotter2's avatar
gpotter2 committed
############
############
+ Main.py tests

= Prepare emulator
import mock
from mock import Mock

if WINDOWS:
    # This fix when the windows doesn't have a size (run with a windows server)
    mock.patch("pyreadline.console.console.Console.size").return_value = (300, 300)

@mock.patch("scapy.config.conf.readfunc")
def emulate_main_input(data, mock_readfunc):
    global index
    index = 0 # reset var
    def readlineScapy(*args, **kargs):
        global index
        if len(data) == index:
            r_data = "exit(1 if hasattr(sys, 'last_value') and sys.last_value is not None else 0)"
        else:
            r_data = data[index]
        index +=1
        print r_data
        return r_data
    mock_readfunc.side_effect = readlineScapy
    def reduce_mock(self):
        return (Mock, ())
    mock_readfunc.__reduce__ = reduce_mock
    sys.argv = ['']
    def console_exit(code):
        raise SystemExit(code)
    exit_code = -1
    try:
        interact(mydict={"exit": console_exit})
    except SystemExit as e:
        exit_code = str(e)
        pass
    assert exit_code == "0"

= Test basic save_session and load_session

data = ["init_session(\"scapySession1\")",\
"test_value = \"8.8.8.8\"",\
"save_session()",\
"del test_value",\
"load_session()",\
"assert test_value == \"8.8.8.8\""]

emulate_main_input(data)

= Test save_session and load_session with fname

data = ["init_session(\"scapySession2\")",\
"test_value = 7",\
"save_session(fname=\"scapySaveSession.dat\")",\
"del test_value",\
"load_session(fname=\"scapySaveSession.dat\")",\
"assert test_value == 7"]

emulate_main_input(data)
= Test utility functions

tmpfile =  get_temp_file(autoext=".ut")
tmpfile.startswith("/tmp/scapy")
conf.temp_files[0].endswith(".ut")
conf.temp_files.pop()

get_temp_file(True).startswith("/tmp/scapy") and len(conf.temp_files) == 0

sane("A\x00\xFFB") == "A..B"

linehexdump(Ether(), dump=True) == "FFFFFFFFFFFF0242D077E8129000 .......B.w...."

chexdump(Ether(), dump=True) == "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x42, 0xd0, 0x77, 0xe8, 0x12, 0x90, 0x00"

hexstr("A\x00\xFFB") == "41 00 ff 42  A..B"

fletcher16_checksum("\x28\x07") == 22319

tex_escape("$#_") == "\\$\\#\\_"

f = colgen(range(3))
len([f.next() for i in range(2)]) == 2

f = incremental_label()
[f.next() for i in range(2)] == ["tag00000", "tag00001"]

import random
random.seed(0x2807)
corrupt_bytes("ABCDE") == "ABCDW"
sane(corrupt_bytes("ABCDE", n=3)) == "A.8D4"

corrupt_bits("ABCDE") == "EBCDE"
sane(corrupt_bits("ABCDE", n=3)) == "AF.EE"

= Test utility functions - network related
~ netaccess

atol("www.secdev.org") == 3642339845


Phil's avatar
Phil committed
############
############
+ Basic tests
Loading
Loading full blame...