494 lines
16 KiB
Python
494 lines
16 KiB
Python
from xml.etree import ElementTree
|
|
|
|
import pytest
|
|
|
|
from core.emulator.emudata import LinkOptions, NodeOptions
|
|
from core.emulator.enumerations import NodeTypes
|
|
from core.errors import CoreError
|
|
from core.location.mobility import BasicRangeModel
|
|
from core.services.utility import SshService
|
|
|
|
|
|
class TestXml:
|
|
def test_xml_hooks(self, session, tmpdir):
|
|
"""
|
|
Test save/load hooks in xml.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
"""
|
|
# create hook
|
|
file_name = "runtime_hook.sh"
|
|
data = "#!/bin/sh\necho hello"
|
|
session.set_hook("hook:4", file_name, None, data)
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
runtime_hooks = session._hooks.get(4)
|
|
assert runtime_hooks
|
|
runtime_hook = runtime_hooks[0]
|
|
assert file_name == runtime_hook[0]
|
|
assert data == runtime_hook[1]
|
|
|
|
def test_xml_ptp(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for a ptp network.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create ptp
|
|
ptp_node = session.add_node(_type=NodeTypes.PEER_TO_PEER)
|
|
|
|
# create nodes
|
|
node_one = session.add_node()
|
|
node_two = session.add_node()
|
|
|
|
# link nodes to ptp net
|
|
for node in [node_one, node_two]:
|
|
interface = ip_prefixes.create_interface(node)
|
|
session.add_link(node.id, ptp_node.id, interface_one=interface)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = node_one.id
|
|
n2_id = node_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
|
|
def test_xml_ptp_services(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for a ptp neetwork.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create ptp
|
|
ptp_node = session.add_node(_type=NodeTypes.PEER_TO_PEER)
|
|
|
|
# create nodes
|
|
options = NodeOptions(model="host")
|
|
node_one = session.add_node(options=options)
|
|
node_two = session.add_node()
|
|
|
|
# link nodes to ptp net
|
|
for node in [node_one, node_two]:
|
|
interface = ip_prefixes.create_interface(node)
|
|
session.add_link(node.id, ptp_node.id, interface_one=interface)
|
|
|
|
# set custom values for node service
|
|
session.services.set_service(node_one.id, SshService.name)
|
|
service_file = SshService.configs[0]
|
|
file_data = "# test"
|
|
session.services.set_service_file(
|
|
node_one.id, SshService.name, service_file, file_data
|
|
)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = node_one.id
|
|
n2_id = node_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# retrieve custom service
|
|
service = session.services.get_service(node_one.id, SshService.name)
|
|
|
|
# verify nodes have been recreated
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
assert service.config_data.get(service_file) == file_data
|
|
|
|
def test_xml_mobility(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for mobility.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create wlan
|
|
wlan_node = session.add_node(_type=NodeTypes.WIRELESS_LAN)
|
|
session.mobility.set_model(wlan_node, BasicRangeModel, {"test": "1"})
|
|
|
|
# create nodes
|
|
options = NodeOptions(model="mdr")
|
|
options.set_position(0, 0)
|
|
node_one = session.add_node(options=options)
|
|
node_two = session.add_node(options=options)
|
|
|
|
# link nodes
|
|
for node in [node_one, node_two]:
|
|
interface = ip_prefixes.create_interface(node)
|
|
session.add_link(node.id, wlan_node.id, interface_one=interface)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
wlan_id = wlan_node.id
|
|
n1_id = node_one.id
|
|
n2_id = node_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# retrieve configuration we set originally
|
|
value = str(session.mobility.get_config("test", wlan_id, BasicRangeModel.name))
|
|
|
|
# verify nodes and configuration were restored
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
assert session.get_node(wlan_id)
|
|
assert value == "1"
|
|
|
|
def test_network_to_network(self, session, tmpdir):
|
|
"""
|
|
Test xml generation when dealing with network to network nodes.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
"""
|
|
# create nodes
|
|
switch_one = session.add_node(_type=NodeTypes.SWITCH)
|
|
switch_two = session.add_node(_type=NodeTypes.SWITCH)
|
|
|
|
# link nodes
|
|
session.add_link(switch_one.id, switch_two.id)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = switch_one.id
|
|
n2_id = switch_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
switch_one = session.get_node(n1_id)
|
|
switch_two = session.get_node(n2_id)
|
|
assert switch_one
|
|
assert switch_two
|
|
assert len(switch_one.all_link_data(0) + switch_two.all_link_data(0)) == 1
|
|
|
|
def test_link_options(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for a ptp network.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create nodes
|
|
node_one = session.add_node()
|
|
interface_one = ip_prefixes.create_interface(node_one)
|
|
switch = session.add_node(_type=NodeTypes.SWITCH)
|
|
|
|
# create link
|
|
link_options = LinkOptions()
|
|
link_options.per = 10.5
|
|
link_options.bandwidth = 50000
|
|
link_options.jitter = 10
|
|
link_options.delay = 30
|
|
link_options.dup = 5
|
|
session.add_link(
|
|
node_one.id, switch.id, interface_one, link_options=link_options
|
|
)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = node_one.id
|
|
n2_id = switch.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
links = []
|
|
for node_id in session.nodes:
|
|
node = session.nodes[node_id]
|
|
links += node.all_link_data(0)
|
|
link = links[0]
|
|
assert link_options.per == link.per
|
|
assert link_options.bandwidth == link.bandwidth
|
|
assert link_options.jitter == link.jitter
|
|
assert link_options.delay == link.delay
|
|
assert link_options.dup == link.dup
|
|
|
|
def test_link_options_ptp(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for a ptp network.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create nodes
|
|
node_one = session.add_node()
|
|
interface_one = ip_prefixes.create_interface(node_one)
|
|
node_two = session.add_node()
|
|
interface_two = ip_prefixes.create_interface(node_two)
|
|
|
|
# create link
|
|
link_options = LinkOptions()
|
|
link_options.per = 10.5
|
|
link_options.bandwidth = 50000
|
|
link_options.jitter = 10
|
|
link_options.delay = 30
|
|
link_options.dup = 5
|
|
session.add_link(
|
|
node_one.id, node_two.id, interface_one, interface_two, link_options
|
|
)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = node_one.id
|
|
n2_id = node_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
links = []
|
|
for node_id in session.nodes:
|
|
node = session.nodes[node_id]
|
|
links += node.all_link_data(0)
|
|
link = links[0]
|
|
assert link_options.per == link.per
|
|
assert link_options.bandwidth == link.bandwidth
|
|
assert link_options.jitter == link.jitter
|
|
assert link_options.delay == link.delay
|
|
assert link_options.dup == link.dup
|
|
|
|
def test_link_options_bidirectional(self, session, tmpdir, ip_prefixes):
|
|
"""
|
|
Test xml client methods for a ptp network.
|
|
|
|
:param session: session for test
|
|
:param tmpdir: tmpdir to create data in
|
|
:param ip_prefixes: generates ip addresses for nodes
|
|
"""
|
|
# create nodes
|
|
node_one = session.add_node()
|
|
interface_one = ip_prefixes.create_interface(node_one)
|
|
node_two = session.add_node()
|
|
interface_two = ip_prefixes.create_interface(node_two)
|
|
|
|
# create link
|
|
link_options_one = LinkOptions()
|
|
link_options_one.unidirectional = 1
|
|
link_options_one.bandwidth = 5000
|
|
link_options_one.delay = 10
|
|
link_options_one.per = 10.5
|
|
link_options_one.dup = 5
|
|
link_options_one.jitter = 5
|
|
session.add_link(
|
|
node_one.id, node_two.id, interface_one, interface_two, link_options_one
|
|
)
|
|
link_options_two = LinkOptions()
|
|
link_options_two.unidirectional = 1
|
|
link_options_two.bandwidth = 10000
|
|
link_options_two.delay = 20
|
|
link_options_two.per = 10
|
|
link_options_two.dup = 10
|
|
link_options_two.jitter = 10
|
|
session.update_link(
|
|
node_two.id,
|
|
node_one.id,
|
|
interface_two.id,
|
|
interface_one.id,
|
|
link_options_two,
|
|
)
|
|
|
|
# instantiate session
|
|
session.instantiate()
|
|
|
|
# get ids for nodes
|
|
n1_id = node_one.id
|
|
n2_id = node_two.id
|
|
|
|
# save xml
|
|
xml_file = tmpdir.join("session.xml")
|
|
file_path = xml_file.strpath
|
|
session.save_xml(file_path)
|
|
|
|
# verify xml file was created and can be parsed
|
|
assert xml_file.isfile()
|
|
assert ElementTree.parse(file_path)
|
|
|
|
# stop current session, clearing data
|
|
session.shutdown()
|
|
|
|
# verify nodes have been removed from session
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n1_id)
|
|
with pytest.raises(CoreError):
|
|
assert not session.get_node(n2_id)
|
|
|
|
# load saved xml
|
|
session.open_xml(file_path, start=True)
|
|
|
|
# verify nodes have been recreated
|
|
assert session.get_node(n1_id)
|
|
assert session.get_node(n2_id)
|
|
links = []
|
|
for node_id in session.nodes:
|
|
node = session.nodes[node_id]
|
|
links += node.all_link_data(0)
|
|
assert len(links) == 2
|
|
link_one = links[0]
|
|
link_two = links[1]
|
|
assert link_options_one.bandwidth == link_one.bandwidth
|
|
assert link_options_one.delay == link_one.delay
|
|
assert link_options_one.per == link_one.per
|
|
assert link_options_one.dup == link_one.dup
|
|
assert link_options_one.jitter == link_one.jitter
|
|
assert link_options_two.bandwidth == link_two.bandwidth
|
|
assert link_options_two.delay == link_two.delay
|
|
assert link_options_two.per == link_two.per
|
|
assert link_options_two.dup == link_two.dup
|
|
assert link_options_two.jitter == link_two.jitter
|