#include "unity.h"
#include "unity_fixture.h"
#include "ofc/config.h"
#include "ofc/timer.h"
#include "ofc/event.h"
#include "ofc/libc.h"
#include "ofc/message.h"
#include "ofc/net.h"
#include "ofc/net_internal.h"
#include "ofc/socket.h"
#include "ofc/sched.h"
#include "ofc/app.h"
#include "ofc/core.h"
#include "ofc/env.h"
#include "ofc/persist.h"
typedef enum {
STREAM_TEST_STATE_IDLE,
STREAM_TEST_STATE_RUNNING,
} STREAM_TEST_STATE;
#define STREAM_TEST_INTERVAL 2000
#define STREAM_TEST_COUNT 5
#define STREAM_TEST_PORT 7542
typedef struct _OFC_STREAM_INTERFACE {
OFC_IPADDR ip;
} OFC_STREAM_INTERFACE;
typedef struct _OFC_STREAM_TEST {
STREAM_TEST_STATE state;
#if defined(OFC_MULTI_TCP)
#endif
OFC_FAMILY_TYPE family;
} OFC_STREAM_TEST;
static OFC_APP_TEMPLATE StreamTestAppDef =
{
"Stream Test Application",
&StreamTestPreSelect,
&StreamTestPostSelect,
&StreamTestDestroy,
#if defined(OFC_APP_DEBUG)
#endif
};
typedef enum {
SERVER_TEST_STATE_IDLE,
SERVER_TEST_STATE_HEADER,
SERVER_TEST_STATE_BODY
} SERVER_TEST_STATE;
typedef struct {
SERVER_TEST_STATE state;
OFC_MESSAGE *recv_msg;
} OFC_SERVER_TEST;
static OFC_APP_TEMPLATE ServerTestAppDef =
{
"Stream Server Test Application",
&ServerTestPreSelect,
&ServerTestPostSelect,
&ServerTestDestroy,
#if defined(OFC_APP_DEBUG)
#endif
};
typedef enum {
CLIENT_TEST_STATE_IDLE,
CLIENT_TEST_STATE_CONNECTING,
CLIENT_TEST_STATE_CONNECTED
} CLIENT_TEST_STATE;
typedef struct {
CLIENT_TEST_STATE state;
OFC_MESSAGE *write_msg;
OFC_IPADDR ip;
} OFC_CLIENT_TEST;
static OFC_APP_TEMPLATE ClientTestAppDef =
{
"Stream Client Test Application",
&ClientTestPreSelect,
&ClientTestPostSelect,
&ClientTestDestroy,
#if defined(OFC_APP_DEBUG)
#endif
};
#define OFFSET_CLIENT_MSG_SIZE 0
#define OFFSET_CLIENT_MSG_DATA 4
#define CLIENT_MSG_HEADER_LEN 4
#define CLIENT_MSG_DATA "This is my test message"
static OFC_STREAM_INTERFACE *StartupInterface(OFC_FAMILY_TYPE family,
OFC_IPADDR *ip) {
OFC_STREAM_INTERFACE *iface;
ofc_memcpy(&iface->ip, ip, sizeof(OFC_IPADDR));
iface->hListen = ofc_socket_listen(ip, STREAM_TEST_PORT);
} else {
ofc_printf("Started Interface for %s on %s\n",
(family == OFC_FAMILY_IP) ? "IPV4" : "IPV6",
ofc_ntop(&iface->ip, ip_addr, IP6STR_LEN));
}
return (iface);
}
static OFC_VOID ShutdownInterface(OFC_STREAM_INTERFACE *iface) {
ofc_socket_destroy(iface->hListen);
}
static OFC_VOID StreamTestInitialize(OFC_STREAM_TEST *streamTest) {
#if !defined(OFC_MULTI_TCP)
OFC_IPADDR ip;
OFC_STREAM_INTERFACE *iface;
#endif
#if !defined(OFC_MULTI_TCP)
if (streamTest->family == OFC_FAMILY_IP) {
ip.ip_version = OFC_FAMILY_IP;
ip.u.ipv4.addr = OFC_INADDR_ANY;
} else {
ip.ip_version = OFC_FAMILY_IPV6;
ip.u.ipv6 = ofc_in6addr_any;
}
iface = StartupInterface(streamTest->family, &ip);
#endif
streamTest->hTimer = ofc_timer_create("SOCKET");
ofc_timer_set(streamTest->hTimer, STREAM_TEST_INTERVAL);
}
#if defined(OFC_MULTI_TCP)
streamTest->hConfigUpdate = ofc_event_create(OFC_EVENT_AUTO) ;
ofc_persist_register_update(streamTest->hConfigUpdate) ;
#endif
}
#if defined(OFC_MULTI_TCP)
static OFC_VOID StreamTestReconfig (OFC_STREAM_TEST *streamTest)
{
int i ;
OFC_IPADDR ip ;
OFC_STREAM_INTERFACE *iface ;
OFC_STREAM_INTERFACE *next_interface ;
iface = next_interface)
{
for (i = 0 ; i < ofc_persist_interface_count() && !found ;)
{
if (ofc_net_is_addr_equal (&iface->ip, &ip))
else
i++ ;
}
if (!found)
{
ShutdownInterface (iface) ;
}
}
for (i = 0 ; i < ofc_persist_interface_count() ; i++)
{
{
if (ofc_net_is_addr_equal (&iface->ip, &ip))
else
}
if (!found && (streamTest->family == ip.ip_version))
{
iface = StartupInterface (streamTest->family, &ip) ;
}
}
}
#endif
OFC_STREAM_TEST *streamTest;
OFC_STREAM_INTERFACE *iface;
OFC_SOCKET_EVENT_TYPE event_types;
STREAM_TEST_STATE entry_state;
streamTest = ofc_app_get_data(app);
do
{
entry_state = streamTest->state;
ofc_sched_clear_wait(streamTest->scheduler, app);
switch (streamTest->state) {
default:
case STREAM_TEST_STATE_IDLE:
StreamTestInitialize(streamTest);
ofc_sched_add_wait(streamTest->scheduler, app,
streamTest->hTimer);
#if defined(OFC_MULTI_TCP)
ofc_sched_add_wait (streamTest->scheduler, app,
streamTest->hConfigUpdate) ;
#endif
iface)) {
event_types = OFC_SOCKET_EVENT_ACCEPT;
ofc_socket_enable(iface->hListen, event_types);
ofc_sched_add_wait(streamTest->scheduler, app,
iface->hListen);
}
streamTest->state = STREAM_TEST_STATE_RUNNING;
break;
case STREAM_TEST_STATE_RUNNING:
ofc_sched_add_wait(streamTest->scheduler, app,
streamTest->hTimer);
#if defined(OFC_MULTI_TCP)
ofc_sched_add_wait (streamTest->scheduler, app,
streamTest->hConfigUpdate) ;
#endif
iface)) {
event_types = OFC_SOCKET_EVENT_ACCEPT;
ofc_socket_enable(iface->hListen, event_types);
ofc_sched_add_wait(streamTest->scheduler, app,
iface->hListen);
}
break;
}
} while (streamTest->state != entry_state);
}
}
OFC_STREAM_TEST *streamTest;
OFC_SERVER_TEST *serverTest;
OFC_CLIENT_TEST *clientTest;
OFC_STREAM_INTERFACE *iface;
OFC_SOCKET_EVENT_TYPE event_types;
streamTest = ofc_app_get_data(app);
for (progress =
OFC_TRUE; progress && !ofc_app_destroying(app);) {
switch (streamTest->state) {
default:
break;
case STREAM_TEST_STATE_IDLE:
break;
case STREAM_TEST_STATE_RUNNING:
iface !=
OFC_NULL && hSocket != iface->hListen;
iface));
if (iface !=
OFC_NULL && hSocket == iface->hListen) {
event_types = ofc_socket_test(hSocket);
if (event_types & OFC_SOCKET_EVENT_ACCEPT) {
serverTest->state = SERVER_TEST_STATE_IDLE;
serverTest->scheduler = streamTest->scheduler;
serverTest->masterSocket = iface->hListen;
serverTest->hSocket =
ofc_socket_accept(serverTest->masterSocket);
} else {
ofc_app_create(streamTest->scheduler,
&ServerTestAppDef,
serverTest);
}
}
} else if (hSocket == streamTest->hTimer) {
if (streamTest->count++ >= STREAM_TEST_COUNT) {
ofc_app_kill(app);
} else {
iface)) {
clientTest =
clientTest->state = CLIENT_TEST_STATE_IDLE;
clientTest->scheduler = streamTest->scheduler;
clientTest->ip = iface->ip;
ofc_printf("Creating Stream Client for %s "
"Application on %s\n",
streamTest->family == OFC_FAMILY_IP ?
"IPv4" : "IPv6",
ofc_ntop(&iface->ip,
ip_str, IP6STR_LEN));
clientTest->app =
ofc_app_create(streamTest->scheduler,
&ClientTestAppDef,
clientTest);
}
ofc_timer_set(streamTest->hTimer, STREAM_TEST_INTERVAL);
}
}
#if defined(OFC_MULTI_TCP)
else if (hSocket == streamTest->hConfigUpdate)
StreamTestReconfig (streamTest) ;
#endif
break;
}
}
}
}
OFC_STREAM_TEST *streamTest;
OFC_STREAM_INTERFACE *iface;
ofc_printf("Destroying Stream Test Application\n");
streamTest = ofc_app_get_data(app);
switch (streamTest->state) {
default:
case STREAM_TEST_STATE_IDLE:
break;
case STREAM_TEST_STATE_RUNNING:
ofc_timer_destroy(streamTest->hTimer);
#if defined(OFC_MULTI_TCP)
ofc_persist_unregister_update (streamTest->hConfigUpdate) ;
ofc_event_destroy(streamTest->hConfigUpdate) ;
#endif
ShutdownInterface(iface);
}
break;
}
}
}
OFC_SERVER_TEST *serverTest;
OFC_SOCKET_EVENT_TYPE event_types;
SERVER_TEST_STATE entry_state;
serverTest = ofc_app_get_data(app);
do
{
entry_state = serverTest->state;
ofc_sched_clear_wait(serverTest->scheduler, app);
switch (serverTest->state) {
default:
case SERVER_TEST_STATE_IDLE:
serverTest->state = SERVER_TEST_STATE_HEADER;
event_types = OFC_SOCKET_EVENT_READ | OFC_SOCKET_EVENT_CLOSE;
ofc_socket_enable(serverTest->hSocket, event_types);
ofc_sched_add_wait(serverTest->scheduler, app,
serverTest->hSocket);
break;
case SERVER_TEST_STATE_HEADER:
case SERVER_TEST_STATE_BODY:
event_types = OFC_SOCKET_EVENT_READ | OFC_SOCKET_EVENT_CLOSE;
ofc_socket_enable(serverTest->hSocket, event_types);
ofc_sched_add_wait(serverTest->scheduler, app,
serverTest->hSocket);
break;
}
} while (serverTest->state != entry_state);
}
}
OFC_SERVER_TEST *serverTest;
OFC_SOCKADDR sockaddr_local;
OFC_SOCKADDR sockaddr_remote;
serverTest = ofc_app_get_data(app);
for (progress =
OFC_TRUE; progress && !ofc_app_destroying(app);) {
switch (serverTest->state) {
default:
case SERVER_TEST_STATE_IDLE:
break;
case SERVER_TEST_STATE_HEADER:
if (hSocket == serverTest->hSocket) {
serverTest->recv_msg =
ofc_message_create(MSG_ALLOC_AUTO,
CLIENT_MSG_HEADER_LEN,
}
progress |= ofc_socket_read(serverTest->hSocket,
serverTest->recv_msg);
if (ofc_message_done(serverTest->recv_msg)) {
count = OFC_NET_NTOL (&serverTest->header, 0);
ofc_message_destroy(serverTest->recv_msg);
serverTest->recv_msg =
ofc_message_create(MSG_ALLOC_HEAP, count,
OFC_NULL);
serverTest->state = SERVER_TEST_STATE_BODY;
}
}
break;
case SERVER_TEST_STATE_BODY:
if (hSocket == serverTest->hSocket) {
progress |= ofc_socket_read(serverTest->hSocket,
serverTest->recv_msg);
if (ofc_message_done(serverTest->recv_msg)) {
ofc_socket_get_addresses(serverTest->hSocket,
&sockaddr_local,
&sockaddr_remote);
ofc_ntop(&sockaddr_local.sin_addr,
local_ip_str, IP6STR_LEN);
ofc_ntop(&sockaddr_remote.sin_addr,
remote_ip_str, IP6STR_LEN);
ofc_printf("Read %d Bytes on %s(%d) from %s(%d)\n",
ofc_message_offset(serverTest->recv_msg),
local_ip_str,
sockaddr_local.sin_port,
remote_ip_str,
sockaddr_remote.sin_port);
ofc_app_kill(app);
}
}
break;
}
}
}
}
OFC_SERVER_TEST *serverTest;
ofc_printf("Destroying Stream Server Application\n");
serverTest = ofc_app_get_data(app);
switch (serverTest->state) {
default:
case SERVER_TEST_STATE_IDLE:
break;
case SERVER_TEST_STATE_HEADER:
case SERVER_TEST_STATE_BODY:
ofc_socket_destroy(serverTest->hSocket);
ofc_message_destroy(serverTest->recv_msg);
break;
}
}
}
OFC_BOOL ServiceWrite(OFC_CLIENT_TEST *clientTest) {
OFC_SOCKADDR sockaddr_local;
OFC_SOCKADDR sockaddr_remote;
if (clientTest->write_msg ==
OFC_NULL) {
size = ofc_strlen(CLIENT_MSG_DATA);
clientTest->write_msg = ofc_message_create(MSG_ALLOC_HEAP,
CLIENT_MSG_HEADER_LEN + size,
buffer = ofc_message_data(clientTest->write_msg);
OFC_NET_LTON(buffer, OFFSET_CLIENT_MSG_SIZE, size);
ofc_strncpy(&buffer[OFFSET_CLIENT_MSG_DATA],
CLIENT_MSG_DATA,
ofc_strlen(CLIENT_MSG_DATA));
}
progress = ofc_socket_write(clientTest->hSocket, clientTest->write_msg);
if (ofc_message_done(clientTest->write_msg)) {
ofc_socket_get_addresses(clientTest->hSocket,
&sockaddr_local,
&sockaddr_remote);
ofc_ntop(&sockaddr_local.sin_addr, local_ip_str, IP6STR_LEN);
ofc_ntop(&sockaddr_remote.sin_addr, remote_ip_str, IP6STR_LEN);
ofc_printf("Wrote Message on %s(%d) to %s(%d)\n",
local_ip_str,
sockaddr_local.sin_port,
remote_ip_str,
sockaddr_remote.sin_port);
ofc_app_kill(clientTest->app);
}
return (progress);
}
OFC_CLIENT_TEST *clientTest;
OFC_SOCKET_EVENT_TYPE event_types;
CLIENT_TEST_STATE entry_state;
clientTest = ofc_app_get_data(app);
do
{
entry_state = clientTest->state;
ofc_sched_clear_wait(clientTest->scheduler, app);
switch (clientTest->state) {
default:
case CLIENT_TEST_STATE_IDLE:
clientTest->hSocket = ofc_socket_connect(&clientTest->ip,
STREAM_TEST_PORT);
clientTest->state = CLIENT_TEST_STATE_CONNECTING;
event_types = OFC_SOCKET_EVENT_CLOSE |
OFC_SOCKET_EVENT_WRITE;
ofc_socket_enable(clientTest->hSocket, event_types);
ofc_sched_add_wait(clientTest->scheduler, app,
clientTest->hSocket);
} else {
ofc_app_kill(app);
}
break;
case CLIENT_TEST_STATE_CONNECTING:
case CLIENT_TEST_STATE_CONNECTED:
event_types = OFC_SOCKET_EVENT_CLOSE;
event_types |= OFC_SOCKET_EVENT_WRITE;
ofc_socket_enable(clientTest->hSocket, event_types);
ofc_sched_add_wait(clientTest->scheduler, app,
clientTest->hSocket);
break;
}
} while (clientTest->state != entry_state);
}
}
OFC_CLIENT_TEST *clientTest;
OFC_SOCKET_EVENT_TYPE event_types;
clientTest = ofc_app_get_data(app);
for (progress =
OFC_TRUE; progress && !ofc_app_destroying(app);) {
switch (clientTest->state) {
default:
case CLIENT_TEST_STATE_IDLE:
break;
case CLIENT_TEST_STATE_CONNECTING:
if (hSocket == clientTest->hSocket) {
event_types = ofc_socket_test(hSocket);
if (event_types & OFC_SOCKET_EVENT_CLOSE) {
ofc_app_kill(app);
} else if (ofc_socket_connected(clientTest->hSocket)) {
clientTest->state = CLIENT_TEST_STATE_CONNECTED;
progress |= ServiceWrite(clientTest);
}
}
break;
case CLIENT_TEST_STATE_CONNECTED:
if (hSocket == clientTest->hSocket)
progress |= ServiceWrite(clientTest);
break;
}
}
}
}
OFC_CLIENT_TEST *clientTest;
ofc_printf("Destroying Stream Client Application\n");
clientTest = ofc_app_get_data(app);
switch (clientTest->state) {
default:
case CLIENT_TEST_STATE_IDLE:
break;
case CLIENT_TEST_STATE_CONNECTING:
case CLIENT_TEST_STATE_CONNECTED:
ofc_socket_destroy(clientTest->hSocket);
ofc_message_destroy(clientTest->write_msg);
break;
}
}
}
TEST_GROUP(stream);
TEST_SETUP(stream) {
TEST_ASSERT_FALSE_MESSAGE(test_startup(), "Failed to Startup Framework");
}
TEST_TEAR_DOWN(stream) {
test_shutdown();
}
TEST(stream, test_stream) {
OFC_STREAM_TEST *streamTest;
streamTest->family = OFC_FAMILY_IP;
streamTest->count = 0;
streamTest->state = STREAM_TEST_STATE_IDLE;
streamTest->scheduler = hScheduler;
ofc_printf("Creating Stream Test Application for IPv4\n");
hApp = ofc_app_create(hScheduler, &StreamTestAppDef, streamTest);
ofc_app_set_wait(hApp, hDone);
ofc_event_wait(hDone);
}
#if defined(OFC_DISCOVER_IPV6)
streamTest->family = OFC_FAMILY_IPV6;
streamTest->count = 0;
streamTest->state = STREAM_TEST_STATE_IDLE;
streamTest->scheduler = hScheduler;
ofc_printf("Creating Stream Test Application for IPv6\n");
hApp = ofc_app_create(hScheduler, &StreamTestAppDef, streamTest);
ofc_app_set_wait(hApp, hDone);
ofc_event_wait(hDone);
}
#endif
}
TEST_GROUP_RUNNER(stream) {
RUN_TEST_CASE(stream, test_stream);
}
#if !defined(NO_MAIN)
static void runAllTests(void)
{
RUN_TEST_GROUP(stream);
}
int main(int argc, const char *argv[])
{
if (argc >= 2) {
if (ofc_strcmp(argv[1], "--config") == 0) {
}
}
return UnityMain(argc, argv, runAllTests);
}
#endif
#define OFC_MAX_PATH
Definition: file.h:119
#define OFC_HANDLE_NULL
Definition: handle.h:64
OFC_DWORD_PTR OFC_HANDLE
Definition: handle.h:43
OFC_CORE_LIB OFC_VOID ofc_free(OFC_LPVOID mem)
OFC_CORE_LIB OFC_LPVOID ofc_malloc(OFC_SIZET size)
OFC_CORE_LIB OFC_HANDLE ofc_queue_create(OFC_VOID)
OFC_CORE_LIB OFC_VOID ofc_queue_destroy(OFC_HANDLE qHead)
OFC_CORE_LIB OFC_VOID ofc_enqueue(OFC_HANDLE qHead, OFC_VOID *qElement)
OFC_CORE_LIB OFC_VOID * ofc_queue_next(OFC_HANDLE qHead, OFC_VOID *qElement)
OFC_CORE_LIB OFC_VOID * ofc_dequeue(OFC_HANDLE qHead)
OFC_CORE_LIB OFC_VOID * ofc_queue_first(OFC_HANDLE qHead)
OFC_CORE_LIB OFC_VOID ofc_queue_unlink(OFC_HANDLE qHead, OFC_VOID *qElement)
@ OFC_FALSE
Definition: types.h:632
@ OFC_TRUE
Definition: types.h:636
void OFC_VOID
Definition: types.h:159
unsigned int OFC_UINT32
Definition: types.h:176
OFC_UINT8 OFC_BOOL
Definition: types.h:624
#define OFC_NULL
Definition: types.h:656
char OFC_CHAR
Definition: types.h:143
int OFC_INT
Definition: types.h:119
long int OFC_SIZET
Definition: types.h:115