2017-04-27 13:34:23 -07:00
|
|
|
"""
|
2017-08-01 09:28:11 -07:00
|
|
|
Unit tests for testing basic CORE networks.
|
2017-04-27 13:34:23 -07:00
|
|
|
"""
|
2017-04-27 14:49:51 -07:00
|
|
|
|
2017-08-02 16:39:38 -07:00
|
|
|
import threading
|
2021-03-19 16:54:24 -07:00
|
|
|
from pathlib import Path
|
|
|
|
from typing import List, Type
|
2017-07-27 14:17:33 -07:00
|
|
|
|
2018-02-27 10:48:01 -08:00
|
|
|
import pytest
|
2019-09-10 21:33:35 -07:00
|
|
|
|
2020-06-16 12:50:24 -07:00
|
|
|
from core.emulator.data import IpPrefixes, NodeOptions
|
2020-05-20 22:14:03 -07:00
|
|
|
from core.emulator.enumerations import MessageFlags
|
2020-05-24 23:37:38 -07:00
|
|
|
from core.emulator.session import Session
|
2019-10-10 23:01:16 -07:00
|
|
|
from core.errors import CoreCommandError
|
2019-09-10 14:20:51 -07:00
|
|
|
from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility
|
2020-05-29 21:41:58 -07:00
|
|
|
from core.nodes.base import CoreNode, NodeBase
|
2020-05-20 22:14:03 -07:00
|
|
|
from core.nodes.network import HubNode, PtpNet, SwitchNode, WlanNode
|
2017-04-27 13:34:23 -07:00
|
|
|
|
2021-03-19 16:54:24 -07:00
|
|
|
_PATH: Path = Path(__file__).resolve().parent
|
|
|
|
_MOBILITY_FILE: Path = _PATH / "mobility.scen"
|
|
|
|
_WIRED: List = [PtpNet, HubNode, SwitchNode]
|
2017-04-27 13:34:23 -07:00
|
|
|
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2020-06-09 08:48:18 -07:00
|
|
|
def ping(from_node: CoreNode, to_node: CoreNode, ip_prefixes: IpPrefixes):
|
2020-06-09 18:40:50 -07:00
|
|
|
address = ip_prefixes.ip4_address(to_node.id)
|
2019-10-10 23:01:16 -07:00
|
|
|
try:
|
2019-10-23 23:15:19 -07:00
|
|
|
from_node.cmd(f"ping -c 1 {address}")
|
2019-10-10 23:01:16 -07:00
|
|
|
status = 0
|
|
|
|
except CoreCommandError as e:
|
|
|
|
status = e.returncode
|
|
|
|
return status
|
2018-04-25 16:33:58 -07:00
|
|
|
|
|
|
|
|
2017-07-27 14:59:40 -07:00
|
|
|
class TestCore:
|
2018-04-25 16:33:58 -07:00
|
|
|
@pytest.mark.parametrize("net_type", _WIRED)
|
2020-05-29 21:41:58 -07:00
|
|
|
def test_wired_ping(
|
|
|
|
self, session: Session, net_type: Type[NodeBase], ip_prefixes: IpPrefixes
|
|
|
|
):
|
2017-07-27 14:17:33 -07:00
|
|
|
"""
|
|
|
|
Test ptp node network.
|
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
:param session: session for test
|
|
|
|
:param core.enumerations.NodeTypes net_type: type of net node to create
|
|
|
|
:param ip_prefixes: generates ip addresses for nodes
|
2017-07-27 14:17:33 -07:00
|
|
|
"""
|
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# create net node
|
2020-05-20 22:14:03 -07:00
|
|
|
net_node = session.add_node(net_type)
|
2017-07-27 14:17:33 -07:00
|
|
|
|
|
|
|
# create nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
node1 = session.add_node(CoreNode)
|
|
|
|
node2 = session.add_node(CoreNode)
|
2017-07-27 14:17:33 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# link nodes to net node
|
2020-06-12 16:52:41 -07:00
|
|
|
for node in [node1, node2]:
|
2020-06-16 09:30:16 -07:00
|
|
|
iface_data = ip_prefixes.create_iface(node)
|
|
|
|
session.add_link(node.id, net_node.id, iface1_data=iface_data)
|
2017-07-27 14:17:33 -07:00
|
|
|
|
|
|
|
# instantiate session
|
2018-04-25 16:33:58 -07:00
|
|
|
session.instantiate()
|
2017-07-27 14:17:33 -07:00
|
|
|
|
2020-06-12 16:52:41 -07:00
|
|
|
# ping node2 from node1 and assert success
|
|
|
|
status = ping(node1, node2, ip_prefixes)
|
2017-07-27 14:17:33 -07:00
|
|
|
assert not status
|
|
|
|
|
2020-05-24 23:37:38 -07:00
|
|
|
def test_vnode_client(self, request, session: Session, ip_prefixes: IpPrefixes):
|
2017-07-27 11:57:01 -07:00
|
|
|
"""
|
|
|
|
Test vnode client methods.
|
|
|
|
|
2019-10-23 23:15:19 -07:00
|
|
|
:param request: pytest request
|
2018-04-25 16:33:58 -07:00
|
|
|
:param session: session for test
|
|
|
|
:param ip_prefixes: generates ip addresses for nodes
|
2017-07-27 11:57:01 -07:00
|
|
|
"""
|
|
|
|
# create ptp
|
2020-05-20 22:14:03 -07:00
|
|
|
ptp_node = session.add_node(PtpNet)
|
2017-07-27 11:57:01 -07:00
|
|
|
|
|
|
|
# create nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
node1 = session.add_node(CoreNode)
|
|
|
|
node2 = session.add_node(CoreNode)
|
2017-07-27 11:57:01 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# link nodes to ptp net
|
2020-06-12 16:52:41 -07:00
|
|
|
for node in [node1, node2]:
|
2020-06-16 09:30:16 -07:00
|
|
|
iface_data = ip_prefixes.create_iface(node)
|
|
|
|
session.add_link(node.id, ptp_node.id, iface1_data=iface_data)
|
2017-07-27 11:57:01 -07:00
|
|
|
|
|
|
|
# get node client for testing
|
2020-06-12 16:52:41 -07:00
|
|
|
client = node1.client
|
2017-07-27 11:57:01 -07:00
|
|
|
|
|
|
|
# instantiate session
|
2018-04-25 16:33:58 -07:00
|
|
|
session.instantiate()
|
2017-07-27 11:57:01 -07:00
|
|
|
|
|
|
|
# check we are connected
|
|
|
|
assert client.connected()
|
|
|
|
|
2019-10-11 13:55:06 -07:00
|
|
|
# validate command
|
2019-10-23 23:15:19 -07:00
|
|
|
if not request.config.getoption("mock"):
|
|
|
|
assert client.check_cmd("echo hello") == "hello"
|
2017-07-27 11:57:01 -07:00
|
|
|
|
2020-06-16 09:30:16 -07:00
|
|
|
def test_iface(self, session: Session, ip_prefixes: IpPrefixes):
|
2017-07-26 16:52:17 -07:00
|
|
|
"""
|
2020-06-16 09:30:16 -07:00
|
|
|
Test interface methods.
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
:param session: session for test
|
|
|
|
:param ip_prefixes: generates ip addresses for nodes
|
2017-07-26 16:52:17 -07:00
|
|
|
"""
|
|
|
|
|
|
|
|
# create ptp
|
2020-05-20 22:14:03 -07:00
|
|
|
ptp_node = session.add_node(PtpNet)
|
2017-07-26 16:52:17 -07:00
|
|
|
|
|
|
|
# create nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
node1 = session.add_node(CoreNode)
|
|
|
|
node2 = session.add_node(CoreNode)
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# link nodes to ptp net
|
2020-06-12 16:52:41 -07:00
|
|
|
for node in [node1, node2]:
|
2020-06-16 09:30:16 -07:00
|
|
|
iface = ip_prefixes.create_iface(node)
|
|
|
|
session.add_link(node.id, ptp_node.id, iface1_data=iface)
|
2017-07-26 16:52:17 -07:00
|
|
|
|
|
|
|
# instantiate session
|
2018-04-25 16:33:58 -07:00
|
|
|
session.instantiate()
|
2017-07-26 16:52:17 -07:00
|
|
|
|
|
|
|
# check link data gets generated
|
2020-06-18 21:33:28 -07:00
|
|
|
assert ptp_node.links(MessageFlags.ADD)
|
2017-07-26 16:52:17 -07:00
|
|
|
|
|
|
|
# check common nets exist between linked nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
assert node1.commonnets(node2)
|
|
|
|
assert node2.commonnets(node1)
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2020-06-16 09:30:16 -07:00
|
|
|
# check we can retrieve interface id
|
|
|
|
assert 0 in node1.ifaces
|
|
|
|
assert 0 in node2.ifaces
|
2017-07-26 16:52:17 -07:00
|
|
|
|
|
|
|
# check interface parameters
|
2020-06-16 09:30:16 -07:00
|
|
|
iface = node1.get_iface(0)
|
|
|
|
iface.setparam("test", 1)
|
|
|
|
assert iface.getparam("test") == 1
|
|
|
|
assert iface.getparams()
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2020-06-16 09:30:16 -07:00
|
|
|
# delete interface and test that if no longer exists
|
|
|
|
node1.delete_iface(0)
|
|
|
|
assert 0 not in node1.ifaces
|
2017-07-26 16:52:17 -07:00
|
|
|
|
2020-05-24 23:37:38 -07:00
|
|
|
def test_wlan_ping(self, session: Session, ip_prefixes: IpPrefixes):
|
2017-04-27 13:34:23 -07:00
|
|
|
"""
|
|
|
|
Test basic wlan network.
|
|
|
|
|
2018-05-01 10:40:25 -07:00
|
|
|
:param core.emulator.coreemu.EmuSession session: session for test
|
2018-04-25 16:33:58 -07:00
|
|
|
:param ip_prefixes: generates ip addresses for nodes
|
2017-04-27 13:34:23 -07:00
|
|
|
"""
|
|
|
|
|
|
|
|
# create wlan
|
2020-05-20 22:14:03 -07:00
|
|
|
wlan_node = session.add_node(WlanNode)
|
2018-06-13 11:59:50 -07:00
|
|
|
session.mobility.set_model(wlan_node, BasicRangeModel)
|
2017-04-27 13:34:23 -07:00
|
|
|
|
|
|
|
# create nodes
|
2019-10-22 15:13:28 -07:00
|
|
|
options = NodeOptions(model="mdr")
|
|
|
|
options.set_position(0, 0)
|
2020-06-12 16:52:41 -07:00
|
|
|
node1 = session.add_node(CoreNode, options=options)
|
|
|
|
node2 = session.add_node(CoreNode, options=options)
|
2017-04-27 13:34:23 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# link nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
for node in [node1, node2]:
|
2020-06-16 09:30:16 -07:00
|
|
|
iface_id = ip_prefixes.create_iface(node)
|
|
|
|
session.add_link(node.id, wlan_node.id, iface1_data=iface_id)
|
2017-04-27 13:34:23 -07:00
|
|
|
|
|
|
|
# instantiate session
|
2018-04-25 16:33:58 -07:00
|
|
|
session.instantiate()
|
2017-04-27 13:34:23 -07:00
|
|
|
|
2020-06-12 16:52:41 -07:00
|
|
|
# ping node2 from node1 and assert success
|
|
|
|
status = ping(node1, node2, ip_prefixes)
|
2017-04-27 13:34:23 -07:00
|
|
|
assert not status
|
|
|
|
|
2020-05-24 23:37:38 -07:00
|
|
|
def test_mobility(self, session: Session, ip_prefixes: IpPrefixes):
|
2017-08-02 16:39:38 -07:00
|
|
|
"""
|
|
|
|
Test basic wlan network.
|
|
|
|
|
2018-05-01 10:40:25 -07:00
|
|
|
:param core.emulator.coreemu.EmuSession session: session for test
|
2018-04-25 16:33:58 -07:00
|
|
|
:param ip_prefixes: generates ip addresses for nodes
|
2017-08-02 16:39:38 -07:00
|
|
|
"""
|
|
|
|
|
|
|
|
# create wlan
|
2020-05-20 22:14:03 -07:00
|
|
|
wlan_node = session.add_node(WlanNode)
|
2018-06-13 11:59:50 -07:00
|
|
|
session.mobility.set_model(wlan_node, BasicRangeModel)
|
2017-08-02 16:39:38 -07:00
|
|
|
|
|
|
|
# create nodes
|
2019-10-22 15:13:28 -07:00
|
|
|
options = NodeOptions(model="mdr")
|
|
|
|
options.set_position(0, 0)
|
2020-06-12 16:52:41 -07:00
|
|
|
node1 = session.add_node(CoreNode, options=options)
|
|
|
|
node2 = session.add_node(CoreNode, options=options)
|
2017-08-02 16:39:38 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
# link nodes
|
2020-06-12 16:52:41 -07:00
|
|
|
for node in [node1, node2]:
|
2020-06-16 09:30:16 -07:00
|
|
|
iface_id = ip_prefixes.create_iface(node)
|
|
|
|
session.add_link(node.id, wlan_node.id, iface1_data=iface_id)
|
2017-08-02 16:39:38 -07:00
|
|
|
|
|
|
|
# configure mobility script for session
|
2018-06-07 12:57:32 -07:00
|
|
|
config = {
|
2021-03-19 16:54:24 -07:00
|
|
|
"file": str(_MOBILITY_FILE),
|
2018-06-07 12:57:32 -07:00
|
|
|
"refresh_ms": "50",
|
|
|
|
"loop": "1",
|
|
|
|
"autostart": "0.0",
|
|
|
|
"map": "",
|
|
|
|
"script_start": "",
|
|
|
|
"script_pause": "",
|
|
|
|
"script_stop": "",
|
|
|
|
}
|
2018-06-13 11:59:50 -07:00
|
|
|
session.mobility.set_model(wlan_node, Ns2ScriptedMobility, config)
|
2017-08-02 16:39:38 -07:00
|
|
|
|
|
|
|
# add handler for receiving node updates
|
|
|
|
event = threading.Event()
|
|
|
|
|
|
|
|
def node_update(_):
|
|
|
|
event.set()
|
2017-08-03 09:48:26 -07:00
|
|
|
|
2018-04-25 16:33:58 -07:00
|
|
|
session.node_handlers.append(node_update)
|
2017-08-02 16:39:38 -07:00
|
|
|
|
|
|
|
# instantiate session
|
2018-04-25 16:33:58 -07:00
|
|
|
session.instantiate()
|
2017-08-02 16:39:38 -07:00
|
|
|
|
|
|
|
# validate we receive a node message for updating its location
|
|
|
|
assert event.wait(5)
|