diff --git a/src/mctpd.c b/src/mctpd.c index 3c798ace..8234fb4e 100644 --- a/src/mctpd.c +++ b/src/mctpd.c @@ -196,7 +196,7 @@ struct ctx { sd_bus *bus; // Configuration - const char *config_filename; + char *config_filename; mctp_nl *nl; @@ -3573,7 +3573,7 @@ static int add_interface(struct ctx *ctx, int ifindex) return -ENOENT; } - struct link *link = malloc(sizeof(*link)); + struct link *link = calloc(1, sizeof(*link)); if (!link) return -ENOMEM; @@ -3829,6 +3829,11 @@ static void setup_config_defaults(struct ctx *ctx) ctx->default_role = ENDPOINT_ROLE_BUS_OWNER; } +static void free_config(struct ctx *ctx) +{ + free(ctx->config_filename); +} + int main(int argc, char **argv) { struct ctx ctxi = {0}, *ctx = &ctxi; @@ -3900,6 +3905,7 @@ int main(int argc, char **argv) free_links(ctx); free_peers(ctx); free_nets(ctx); + free_config(ctx); mctp_nl_close(ctx->nl); diff --git a/tests/conftest.py b/tests/conftest.py index d18772a9..e1135f73 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -21,8 +21,12 @@ async def dbus(): yield bus @pytest.fixture -async def mctpd(nursery, dbus, sysnet): - m = fake_mctpd.MctpdWrapper(dbus, sysnet) +def config(): + return None + +@pytest.fixture +async def mctpd(nursery, dbus, sysnet, config): + m = fake_mctpd.MctpdWrapper(dbus, sysnet, config = config) await m.start_mctpd(nursery) yield m res = await m.stop_mctpd() diff --git a/tests/mctp_test_utils.py b/tests/mctp_test_utils.py index 6f23a026..b0de2fe9 100644 --- a/tests/mctp_test_utils.py +++ b/tests/mctp_test_utils.py @@ -6,6 +6,13 @@ async def mctpd_mctp_iface_obj(dbus, iface): ) return await obj.get_interface('au.com.codeconstruct.MCTP.BusOwner1') +async def mctpd_mctp_iface_control_obj(dbus, iface): + obj = await dbus.get_proxy_object( + "au.com.codeconstruct.MCTP1", + "/au/com/codeconstruct/mctp1/interfaces/" + iface.name, + ) + return await obj.get_interface("au.com.codeconstruct.MCTP.Interface1") + async def mctpd_mctp_endpoint_obj(dbus, path, iface): obj = await dbus.get_proxy_object( 'au.com.codeconstruct.MCTP1', diff --git a/tests/mctpd/__init__.py b/tests/mctpd/__init__.py index e9eeef65..67469cc7 100644 --- a/tests/mctpd/__init__.py +++ b/tests/mctpd/__init__.py @@ -6,6 +6,7 @@ import socket import struct import sys +import tempfile import trio import uuid @@ -975,11 +976,12 @@ async def send_fd(sock, fd): class MctpdWrapper: - def __init__(self, bus, sysnet, binary=None): + def __init__(self, bus, sysnet, binary=None, config=None): self.bus = bus self.system = sysnet.system self.network = sysnet.network self.binary = binary or './test-mctpd' + self.config = config (self.sock_local, self.sock_remote) = self.socketpair() def socketpair(self): @@ -1056,8 +1058,18 @@ def name_owner_changed(name, new_owner, old_owner): # start mctpd, passing our control socket env = os.environ.copy() env['MCTP_TEST_SOCK'] = str(self.sock_remote.fileno()) + + if self.config: + config_file = tempfile.NamedTemporaryFile('w', prefix="mctp.conf.") + config_file.write(self.config) + config_file.flush() + command = [self.binary, '-v', '-c', config_file.name] + else: + config_file = None + command = [self.binary, '-v'] + proc = await trio.lowlevel.open_process( - [self.binary, '-v'], # todo: flexible paths + command = command, pass_fds = (1, 2, self.sock_remote.fileno()), env = env, ) @@ -1074,6 +1086,9 @@ def name_owner_changed(name, new_owner, old_owner): proc_rc = await proc.wait() + if config_file: + config_file.close() + await send_chan.send(proc_rc) Sysnet = namedtuple('SysNet', ['system', 'network']) diff --git a/tests/test_mctpd_endpoint.py b/tests/test_mctpd_endpoint.py new file mode 100644 index 00000000..49e8f0c7 --- /dev/null +++ b/tests/test_mctpd_endpoint.py @@ -0,0 +1,15 @@ +import pytest +from mctp_test_utils import * +from mctpd import * + +@pytest.fixture(name="config") +def endpoint_config(): + return """ + mode = "endpoint" + """ + +""" Test if mctpd is running as an endpoint """ +async def test_endpoint_role(dbus, mctpd): + obj = await mctpd_mctp_iface_control_obj(dbus, mctpd.system.interfaces[0]) + role = await obj.get_role() + assert str(role) == "Endpoint"