/* main.c - Application main entry point */

/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/types.h>
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <misc/printk.h>

#include <ztest.h>

#include <net/ethernet.h>
#include <net/buf.h>
#include <net/net_ip.h>
#include <net/net_if.h>

#include <net/net_config.h>
#include <net/net_app.h>

#define NET_LOG_ENABLED 1
#include "net_private.h"

#if defined(CONFIG_NET_DEBUG_IF)
#define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
#else
#define DBG(fmt, ...)
#endif

#if defined(CONFIG_NET_IPV6)
/* Interface 1 addresses */
static struct in6_addr my_addr1 = { { { 0x20, 0x01, 0x0d, 0xb8, 1, 0, 0, 0,
					0, 0, 0, 0, 0, 0, 0, 0x1 } } };

/* Interface 2 addresses */
static struct in6_addr my_addr2 = { { { 0x20, 0x01, 0x0d, 0xb8, 2, 0, 0, 0,
					0, 0, 0, 0, 0, 0, 0, 0x1 } } };

/* Extra address is assigned to ll_addr */
static struct in6_addr ll_addr = { { { 0xfe, 0x80, 0x43, 0xb8, 0, 0, 0, 0,
				       0, 0, 0, 0xf2, 0xaa, 0x29, 0x02,
				       0x04 } } };

static struct in6_addr in6addr_mcast = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
					     0, 0, 0, 0, 0, 0, 0, 0x1 } } };
#endif

#if defined(CONFIG_NET_IPV4)
/* Interface 1 addresses IPv4 */
static struct in_addr my_addr4 = { { { 192, 0, 1, 1 } } };
#endif

static struct net_if *iface1;

static bool test_failed;
static bool test_started;
static struct k_sem wait_data;

#define WAIT_TIME 250

struct net_if_test {
	u8_t idx;
	u8_t mac_addr[sizeof(struct net_eth_addr)];
	struct net_linkaddr ll_addr;
};

static int net_iface_dev_init(struct device *dev)
{
	return 0;
}

static u8_t *net_iface_get_mac(struct device *dev)
{
	struct net_if_test *data = dev->driver_data;

	if (data->mac_addr[2] == 0x00) {
		/* 00-00-5E-00-53-xx Documentation RFC 7042 */
		data->mac_addr[0] = 0x00;
		data->mac_addr[1] = 0x00;
		data->mac_addr[2] = 0x5E;
		data->mac_addr[3] = 0x00;
		data->mac_addr[4] = 0x53;
		data->mac_addr[5] = sys_rand32_get();
	}

	data->ll_addr.addr = data->mac_addr;
	data->ll_addr.len = 6;

	return data->mac_addr;
}

static void net_iface_init(struct net_if *iface)
{
	u8_t *mac = net_iface_get_mac(net_if_get_device(iface));

	net_if_set_link_addr(iface, mac, sizeof(struct net_eth_addr),
			     NET_LINK_ETHERNET);
}

static int sender_iface(struct net_if *iface, struct net_pkt *pkt)
{
	if (!pkt->frags) {
		DBG("No data to send!\n");
		return -ENODATA;
	}

	if (test_started) {
		struct net_if_test *data =
			net_if_get_device(iface)->driver_data;

		DBG("Sending at iface %d %p\n", net_if_get_by_iface(iface),
		    iface);

		if (net_pkt_iface(pkt) != iface) {
			DBG("Invalid interface %p, expecting %p\n",
				 net_pkt_iface(pkt), iface);
			test_failed = true;
		}

		if (net_if_get_by_iface(iface) != data->idx) {
			DBG("Invalid interface %d index, expecting %d\n",
				 data->idx, net_if_get_by_iface(iface));
			test_failed = true;
		}
	}

	net_pkt_unref(pkt);

	k_sem_give(&wait_data);

	return 0;
}

struct net_if_test net_iface1_data;

static struct net_if_api net_iface_api = {
	.init = net_iface_init,
	.send = sender_iface,
};

#define _ETH_L2_LAYER DUMMY_L2
#define _ETH_L2_CTX_TYPE NET_L2_GET_CTX_TYPE(DUMMY_L2)

NET_DEVICE_INIT_INSTANCE(net_iface1_test,
			 "iface1",
			 iface1,
			 net_iface_dev_init,
			 &net_iface1_data,
			 NULL,
			 CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
			 &net_iface_api,
			 _ETH_L2_LAYER,
			 _ETH_L2_CTX_TYPE,
			 127);

static void iface_setup(void)
{
#if defined(CONFIG_NET_IPV6)
	struct net_if_mcast_addr *maddr;
#endif
	struct net_if_addr *ifaddr;
	int idx;

	/* The semaphore is there to wait the data to be received. */
	k_sem_init(&wait_data, 0, UINT_MAX);

	iface1 = net_if_get_by_index(0);

	((struct net_if_test *)net_if_get_device(iface1)->driver_data)->idx = 0;

	idx = net_if_get_by_iface(iface1);
	zassert_equal(idx, 0, "Invalid index iface1");

	DBG("Interfaces: [%d] iface1 %p\n",
	    net_if_get_by_iface(iface1), iface1);

	zassert_not_null(iface1, "Interface 1");

#if defined(CONFIG_NET_IPV6)
	ifaddr = net_if_ipv6_addr_add(iface1, &my_addr1,
				      NET_ADDR_MANUAL, 0);
	if (!ifaddr) {
		DBG("Cannot add IPv6 address %s\n",
		       net_sprint_ipv6_addr(&my_addr1));
		zassert_not_null(ifaddr, "addr1");
	}

	/* For testing purposes we need to set the adddresses preferred */
	ifaddr->addr_state = NET_ADDR_PREFERRED;

	ifaddr = net_if_ipv6_addr_add(iface1, &ll_addr,
				      NET_ADDR_MANUAL, 0);
	if (!ifaddr) {
		DBG("Cannot add IPv6 address %s\n",
		       net_sprint_ipv6_addr(&ll_addr));
		zassert_not_null(ifaddr, "ll_addr");
	}

	ifaddr->addr_state = NET_ADDR_PREFERRED;

	net_ipv6_addr_create(&in6addr_mcast, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001);

	maddr = net_if_ipv6_maddr_add(iface1, &in6addr_mcast);
	if (!maddr) {
		DBG("Cannot add multicast IPv6 address %s\n",
		       net_sprint_ipv6_addr(&in6addr_mcast));
		zassert_not_null(maddr, "mcast");
	}
#endif /* IPv6 */

#if defined(CONFIG_NET_IPV4)
	ifaddr = net_if_ipv4_addr_add(iface1, &my_addr4,
				      NET_ADDR_MANUAL, 0);
	if (!ifaddr) {
		DBG("Cannot add IPv4 address %s\n",
		       net_sprint_ipv4_addr(&my_addr4));
		zassert_not_null(ifaddr, "addr4");
	}
#endif

	net_if_up(iface1);

	/* The interface might receive data which might fail the checks
	 * in the iface sending function, so we need to reset the failure
	 * flag.
	 */
	test_failed = false;

	test_started = true;
}

static void app_init(void)
{
	int ret;

	ret = net_config_init("Test app", 0, 1);
	zassert_equal(ret, 0, "app init");
}

static struct net_app_ctx udp_server_ctx;
static struct net_app_ctx tcp_server_ctx;

static void app_udp_server_init(void)
{
	int ret;

	ret = net_app_init_udp_server(&udp_server_ctx, NULL, 42421, NULL);
	zassert_equal(ret, 0, "UDP server init");
}

static void app_tcp_server_init(void)
{
	int ret;

	ret = net_app_init_tcp_server(&tcp_server_ctx, NULL, 42422, NULL);
	zassert_equal(ret, 0, "TCP server init");
}

static void app_udp_server_listen(void)
{
	int ret;

	net_app_server_enable(&udp_server_ctx);

	ret = net_app_listen(&udp_server_ctx);
	zassert_equal(ret, 0, "UDP listen failed");
}

static void app_tcp_server_listen(void)
{
	int ret;

	net_app_server_enable(&tcp_server_ctx);

	ret = net_app_listen(&tcp_server_ctx);
	zassert_equal(ret, 0, "TCP listen failed");
}

static void app_tcp6_client_peer(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "2001:db8:200::1",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 42422, "TCP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv6 client close");
#endif
}

static void app_tcp4_client_peer(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "192.0.1.1",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 42422, "TCP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv4 client close");
#endif
}

static void app_udp6_client_peer(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "2001:db8:200::1",
				      42421,
				      0,
				      NULL);
	zassert_equal(ret, 0, "UDP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 42421, "UDP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv6 client close");
#endif
}

static void app_udp4_client_peer(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "192.0.1.1",
				      42421,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 42421, "UDP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv4 client close");
#endif
}

static void app_tcp6_client_peer_with_port(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "[2001:db8:200::1]:1234",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 1234, "TCP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv6 client close");
#endif
}

static void app_tcp4_client_peer_with_port(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "192.0.1.1:1234",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 1234, "TCP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv4 client close");
#endif
}

static void app_udp6_client_peer_with_port(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "[2001:db8:200::1]:9999",
				      42421,
				      0,
				      NULL);
	zassert_equal(ret, 0, "UDP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 9999, "UDP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv6 client close");
#endif
}

static void app_udp4_client_peer_with_port(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int port;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "192.0.1.1:9999",
				      42421,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 9999, "UDP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv4 client close");
#endif
}

static void app_tcp6_client_peer_addr(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	struct sockaddr_in6 peer;
	int port;
	int ret;

	net_ipaddr_copy(&peer.sin6_addr, &my_addr2);
	peer.sin6_port = htons(8765);
	peer.sin6_family = AF_INET6;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      (struct sockaddr *)&peer,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 8765, "TCP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv6 client close");
#endif
}

static void app_tcp4_client_peer_addr(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	struct sockaddr_in peer;
	int port;
	int ret;

	net_ipaddr_copy(&peer.sin_addr, &my_addr4);
	peer.sin_port = htons(8765);
	peer.sin_family = AF_INET;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      (struct sockaddr *)&peer,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "TCP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 8765, "TCP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "TCP IPv4 client close");
#endif
}

static void app_udp6_client_peer_addr(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	struct sockaddr_in6 peer;
	int port;
	int ret;

	net_ipaddr_copy(&peer.sin6_addr, &my_addr2);
	peer.sin6_port = htons(8765);
	peer.sin6_family = AF_INET6;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      (struct sockaddr *)&peer,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "UDP IPv6 client init");

	port = ntohs(net_sin6(&ctx.ipv6.remote)->sin6_port);
	zassert_equal(port, 8765, "UDP port invalid");

	ret = net_ipv6_addr_cmp(&net_sin6(&ctx.ipv6.remote)->sin6_addr,
				&my_addr2);
	zassert_equal(ret, true, "IPv6 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv6 client close");
#endif
}

static void app_udp4_client_peer_addr(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	struct sockaddr_in peer;
	int port;
	int ret;

	net_ipaddr_copy(&peer.sin_addr, &my_addr4);
	peer.sin_port = htons(8765);
	peer.sin_family = AF_INET;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      (struct sockaddr *)&peer,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, 0, "UDP IPv4 client init");

	port = ntohs(net_sin(&ctx.ipv4.remote)->sin_port);
	zassert_equal(port, 8765, "UDP port invalid");

	ret = net_ipv4_addr_cmp(&net_sin(&ctx.ipv4.remote)->sin_addr,
				&my_addr4);
	zassert_equal(ret, true, "IPv4 address mismatch");

	ret = net_app_close(&ctx);
	zassert_equal(ret, 0, "UDP IPv4 client close");
#endif
}

static void app_tcp6_client_hostname_fail(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, -EINVAL, "TCP IPv6 client init");
#endif
}

static void app_tcp4_client_hostname_fail(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, -EINVAL, "TCP IPv4 client init");
#endif
}

static void app_udp6_client_hostname_fail(void)
{
#if defined(CONFIG_NET_IPV6)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, -EINVAL, "UDP IPv6 client init");
#endif
}

static void app_udp4_client_hostname_fail(void)
{
#if defined(CONFIG_NET_IPV4)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      0,
				      NULL);
	zassert_equal(ret, -EINVAL, "UDP IPv4 client init");
#endif
}

static void app_tcp6_client_hostname(void)
{
#if defined(CONFIG_NET_IPV6) && defined(CONFIG_DNS_RESOLVER)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      MSEC(100),
				      NULL);
	zassert_equal(ret, -ETIMEDOUT, "TCP IPv6 client init");
#endif
}

static void app_tcp4_client_hostname(void)
{
#if defined(CONFIG_NET_IPV4) && defined(CONFIG_DNS_RESOLVER)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_tcp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      MSEC(100),
				      NULL);
	zassert_equal(ret, -ETIMEDOUT, "TCP IPv4 client init");
#endif
}

static void app_udp6_client_hostname(void)
{
#if defined(CONFIG_NET_IPV6) && defined(CONFIG_DNS_RESOLVER)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      MSEC(100),
				      NULL);
	zassert_equal(ret, -ETIMEDOUT, "UDP IPv6 client init");
#endif
}

static void app_udp4_client_hostname(void)
{
#if defined(CONFIG_NET_IPV4) && defined(CONFIG_DNS_RESOLVER)
	static struct net_app_ctx ctx;
	int ret;

	ret = net_app_init_udp_client(&ctx,
				      NULL,
				      NULL,
				      "foobar",
				      42422,
				      MSEC(100),
				      NULL);
	zassert_equal(ret, -ETIMEDOUT, "UDP IPv4 client init");
#endif
}

static void app_close_server(void)
{
	int ret;

	ret = net_app_close(&udp_server_ctx);
	zassert_equal(ret, 0, "UDP server close");

	ret = net_app_close(&tcp_server_ctx);
	zassert_equal(ret, 0, "TCP server close");
}

void test_main(void)
{
	ztest_test_suite(net_app_test,
			 ztest_unit_test(iface_setup),
			 ztest_unit_test(app_init),
			 ztest_unit_test(app_udp_server_init),
			 ztest_unit_test(app_tcp_server_init),
			 ztest_unit_test(app_udp_server_listen),
			 ztest_unit_test(app_tcp_server_listen),
			 ztest_unit_test(app_tcp6_client_peer),
			 ztest_unit_test(app_udp6_client_peer),
			 ztest_unit_test(app_tcp4_client_peer),
			 ztest_unit_test(app_udp4_client_peer),
			 ztest_unit_test(app_tcp6_client_peer_with_port),
			 ztest_unit_test(app_tcp4_client_peer_with_port),
			 ztest_unit_test(app_udp6_client_peer_with_port),
			 ztest_unit_test(app_udp4_client_peer_with_port),
			 ztest_unit_test(app_tcp6_client_peer_addr),
			 ztest_unit_test(app_tcp4_client_peer_addr),
			 ztest_unit_test(app_udp6_client_peer_addr),
			 ztest_unit_test(app_udp4_client_peer_addr),
			 ztest_unit_test(app_tcp6_client_hostname_fail),
			 ztest_unit_test(app_tcp4_client_hostname_fail),
			 ztest_unit_test(app_udp6_client_hostname_fail),
			 ztest_unit_test(app_udp4_client_hostname_fail),
			 ztest_unit_test(app_tcp6_client_hostname),
			 ztest_unit_test(app_tcp4_client_hostname),
			 ztest_unit_test(app_udp6_client_hostname),
			 ztest_unit_test(app_udp4_client_hostname),
			 ztest_unit_test(app_close_server)
			 );

	ztest_run_test_suite(net_app_test);
}
