2017-04-27 21:34:23 +01:00
|
|
|
"""
|
|
|
|
Unit test fixture module.
|
|
|
|
"""
|
2017-08-02 20:25:57 +01:00
|
|
|
|
2017-04-27 21:34:23 +01:00
|
|
|
import os
|
2019-03-22 06:29:26 +00:00
|
|
|
import threading
|
2019-03-22 20:45:53 +00:00
|
|
|
import time
|
2017-08-02 20:25:57 +01:00
|
|
|
|
2017-04-27 21:34:23 +01:00
|
|
|
import pytest
|
2019-09-11 05:33:35 +01:00
|
|
|
from mock.mock import MagicMock
|
|
|
|
|
2019-06-20 01:34:33 +01:00
|
|
|
from core.api.grpc.client import InterfaceHelper
|
|
|
|
from core.api.grpc.server import CoreGrpcServer
|
|
|
|
from core.api.tlv.coreapi import CoreConfMessage, CoreEventMessage
|
2019-04-30 07:31:47 +01:00
|
|
|
from core.api.tlv.corehandlers import CoreHandler
|
|
|
|
from core.api.tlv.coreserver import CoreServer
|
2018-05-01 18:40:25 +01:00
|
|
|
from core.emulator.coreemu import CoreEmu
|
|
|
|
from core.emulator.emudata import IpPrefixes
|
2019-09-10 22:20:51 +01:00
|
|
|
from core.emulator.enumerations import CORE_API_PORT, ConfigTlvs, EventTlvs, EventTypes
|
2019-04-30 07:31:47 +01:00
|
|
|
from core.nodes import ipaddress
|
|
|
|
from core.services.coreservices import ServiceManager
|
2017-07-26 16:48:59 +01:00
|
|
|
|
2017-07-12 17:46:57 +01:00
|
|
|
EMANE_SERVICES = "zebra|OSPFv3MDR|IPForward"
|
|
|
|
|
2017-04-27 21:34:23 +01:00
|
|
|
|
2019-10-23 17:31:07 +01:00
|
|
|
class CoreServerTest:
|
2018-04-26 00:33:58 +01:00
|
|
|
def __init__(self, port=CORE_API_PORT):
|
|
|
|
self.host = "localhost"
|
|
|
|
self.port = port
|
|
|
|
address = (self.host, self.port)
|
2019-09-10 23:10:24 +01:00
|
|
|
self.server = CoreServer(
|
|
|
|
address, CoreHandler, {"numthreads": 1, "daemonize": False}
|
|
|
|
)
|
2017-08-02 20:25:57 +01:00
|
|
|
|
|
|
|
self.distributed_server = "core2"
|
|
|
|
self.prefix = ipaddress.Ipv4Prefix("10.83.0.0/16")
|
|
|
|
self.session = None
|
|
|
|
self.request_handler = None
|
|
|
|
|
2019-06-22 07:12:18 +01:00
|
|
|
def setup_handler(self):
|
|
|
|
self.session = self.server.coreemu.create_session(1)
|
|
|
|
request_mock = MagicMock()
|
|
|
|
request_mock.fileno = MagicMock(return_value=1)
|
|
|
|
self.request_handler = CoreHandler(request_mock, "", self.server)
|
|
|
|
self.request_handler.session = self.session
|
|
|
|
self.request_handler.add_session_handlers()
|
|
|
|
|
2019-06-20 01:34:33 +01:00
|
|
|
def setup(self, distributed_address):
|
2017-08-03 17:37:22 +01:00
|
|
|
# validate address
|
|
|
|
assert distributed_address, "distributed server address was not provided"
|
|
|
|
|
2017-08-02 20:25:57 +01:00
|
|
|
# create session
|
2018-04-26 00:33:58 +01:00
|
|
|
self.session = self.server.coreemu.create_session(1)
|
2017-08-02 20:25:57 +01:00
|
|
|
|
|
|
|
# create request handler
|
|
|
|
request_mock = MagicMock()
|
|
|
|
request_mock.fileno = MagicMock(return_value=1)
|
2018-04-26 00:33:58 +01:00
|
|
|
self.request_handler = CoreHandler(request_mock, "", self.server)
|
2017-08-02 20:25:57 +01:00
|
|
|
self.request_handler.session = self.session
|
|
|
|
self.request_handler.add_session_handlers()
|
|
|
|
|
|
|
|
# have broker handle a configuration state change
|
2018-04-26 00:33:58 +01:00
|
|
|
self.session.set_state(EventTypes.DEFINITION_STATE)
|
2019-09-10 23:10:24 +01:00
|
|
|
message = CoreEventMessage.create(
|
|
|
|
0, [(EventTlvs.TYPE, EventTypes.CONFIGURATION_STATE.value)]
|
|
|
|
)
|
2017-08-02 20:25:57 +01:00
|
|
|
self.request_handler.handle_message(message)
|
|
|
|
|
|
|
|
# add broker server for distributed core
|
2019-10-18 03:25:52 +01:00
|
|
|
distributed = f"{self.distributed_server}:{distributed_address}:{self.port}"
|
2019-09-10 23:10:24 +01:00
|
|
|
message = CoreConfMessage.create(
|
|
|
|
0,
|
|
|
|
[
|
|
|
|
(ConfigTlvs.OBJECT, "broker"),
|
|
|
|
(ConfigTlvs.TYPE, 0),
|
|
|
|
(ConfigTlvs.DATA_TYPES, (10,)),
|
|
|
|
(ConfigTlvs.VALUES, distributed),
|
|
|
|
],
|
|
|
|
)
|
2017-08-02 20:25:57 +01:00
|
|
|
self.request_handler.handle_message(message)
|
|
|
|
|
|
|
|
# set session location
|
2019-09-10 23:10:24 +01:00
|
|
|
message = CoreConfMessage.create(
|
|
|
|
0,
|
|
|
|
[
|
|
|
|
(ConfigTlvs.OBJECT, "location"),
|
|
|
|
(ConfigTlvs.TYPE, 0),
|
|
|
|
(ConfigTlvs.DATA_TYPES, (9, 9, 9, 9, 9, 9)),
|
|
|
|
(ConfigTlvs.VALUES, "0|0| 47.5766974863|-122.125920191|0.0|150.0"),
|
|
|
|
],
|
|
|
|
)
|
2017-08-02 20:25:57 +01:00
|
|
|
self.request_handler.handle_message(message)
|
|
|
|
|
|
|
|
# set services for host nodes
|
2019-09-10 23:10:24 +01:00
|
|
|
message = CoreConfMessage.create(
|
|
|
|
0,
|
|
|
|
[
|
|
|
|
(ConfigTlvs.SESSION, str(self.session.id)),
|
|
|
|
(ConfigTlvs.OBJECT, "services"),
|
|
|
|
(ConfigTlvs.TYPE, 0),
|
|
|
|
(ConfigTlvs.DATA_TYPES, (10, 10, 10)),
|
|
|
|
(ConfigTlvs.VALUES, "host|DefaultRoute|SSH"),
|
|
|
|
],
|
|
|
|
)
|
2017-08-02 20:25:57 +01:00
|
|
|
self.request_handler.handle_message(message)
|
|
|
|
|
|
|
|
def shutdown(self):
|
2018-06-15 22:03:27 +01:00
|
|
|
self.server.coreemu.shutdown()
|
2017-08-02 20:25:57 +01:00
|
|
|
self.server.server_close()
|
|
|
|
|
|
|
|
|
2019-03-22 06:29:26 +00:00
|
|
|
@pytest.fixture
|
|
|
|
def grpc_server():
|
|
|
|
coremu = CoreEmu()
|
|
|
|
grpc_server = CoreGrpcServer(coremu)
|
2019-05-31 19:46:47 +01:00
|
|
|
thread = threading.Thread(target=grpc_server.listen, args=("localhost:50051",))
|
2019-03-22 06:29:26 +00:00
|
|
|
thread.daemon = True
|
|
|
|
thread.start()
|
2019-03-22 20:45:53 +00:00
|
|
|
time.sleep(0.1)
|
2019-03-22 06:29:26 +00:00
|
|
|
yield grpc_server
|
|
|
|
coremu.shutdown()
|
|
|
|
grpc_server.server.stop(None)
|
|
|
|
|
|
|
|
|
2018-04-26 00:33:58 +01:00
|
|
|
@pytest.fixture
|
2017-04-27 21:34:23 +01:00
|
|
|
def session():
|
2018-04-26 00:33:58 +01:00
|
|
|
# use coreemu and create a session
|
2019-04-08 17:49:37 +01:00
|
|
|
coreemu = CoreEmu(config={"emane_prefix": "/usr"})
|
2018-04-26 00:33:58 +01:00
|
|
|
session_fixture = coreemu.create_session()
|
|
|
|
session_fixture.set_state(EventTypes.CONFIGURATION_STATE)
|
2017-04-27 21:34:23 +01:00
|
|
|
assert os.path.exists(session_fixture.session_dir)
|
2017-07-10 18:44:10 +01:00
|
|
|
|
2018-04-26 00:33:58 +01:00
|
|
|
# return created session
|
2017-07-10 18:44:10 +01:00
|
|
|
yield session_fixture
|
|
|
|
|
2018-06-11 20:26:12 +01:00
|
|
|
# clear session configurations
|
|
|
|
session_fixture.location.reset()
|
|
|
|
session_fixture.services.reset()
|
|
|
|
session_fixture.mobility.config_reset()
|
|
|
|
session_fixture.emane.config_reset()
|
|
|
|
|
2018-04-26 00:33:58 +01:00
|
|
|
# shutdown coreemu
|
|
|
|
coreemu.shutdown()
|
2017-07-10 18:44:10 +01:00
|
|
|
|
2018-06-15 22:03:27 +01:00
|
|
|
# clear services, since they will be reloaded
|
|
|
|
ServiceManager.services.clear()
|
|
|
|
|
2017-07-10 18:44:10 +01:00
|
|
|
|
2017-04-27 21:34:23 +01:00
|
|
|
@pytest.fixture(scope="module")
|
2018-04-26 00:33:58 +01:00
|
|
|
def ip_prefixes():
|
|
|
|
return IpPrefixes(ip4_prefix="10.83.0.0/16")
|
2017-07-26 16:48:59 +01:00
|
|
|
|
|
|
|
|
2019-03-30 05:12:34 +00:00
|
|
|
@pytest.fixture(scope="module")
|
|
|
|
def interface_helper():
|
|
|
|
return InterfaceHelper(ip4_prefix="10.83.0.0/16")
|
|
|
|
|
|
|
|
|
2017-07-26 16:48:59 +01:00
|
|
|
@pytest.fixture()
|
|
|
|
def cored():
|
2017-08-02 20:25:57 +01:00
|
|
|
# create and return server
|
|
|
|
server = CoreServerTest()
|
2017-07-26 16:48:59 +01:00
|
|
|
yield server
|
|
|
|
|
|
|
|
# cleanup
|
|
|
|
server.shutdown()
|
2017-08-02 20:25:57 +01:00
|
|
|
|
2018-06-15 22:03:27 +01:00
|
|
|
# cleanup services
|
|
|
|
ServiceManager.services.clear()
|
|
|
|
|
2017-08-02 20:25:57 +01:00
|
|
|
|
2019-06-22 07:12:18 +01:00
|
|
|
@pytest.fixture()
|
|
|
|
def coreserver():
|
|
|
|
# create and return server
|
|
|
|
server = CoreServerTest()
|
|
|
|
server.setup_handler()
|
|
|
|
yield server
|
|
|
|
|
|
|
|
# cleanup
|
|
|
|
server.shutdown()
|
|
|
|
|
|
|
|
# cleanup services
|
|
|
|
ServiceManager.services.clear()
|
|
|
|
|
|
|
|
|
2017-08-02 20:25:57 +01:00
|
|
|
def pytest_addoption(parser):
|
|
|
|
parser.addoption("--distributed", help="distributed server address")
|
|
|
|
|
|
|
|
|
|
|
|
def pytest_generate_tests(metafunc):
|
|
|
|
distributed_param = "distributed_address"
|
|
|
|
if distributed_param in metafunc.fixturenames:
|
|
|
|
distributed_address = metafunc.config.getoption("distributed")
|
|
|
|
metafunc.parametrize(distributed_param, [distributed_address])
|