/** * test.c */ #include "cf_file.h" #include "cf_debug.h" #include "cf_log.h" #include "cf_socket.h" #include "cf_thread.h" #include #include #include #define THREAD_POOL 5 #define PORT 1234 CF_Debug_Ctx gDebugCtx; CF_Debug_CallStack gDebugCallstack; CF_Log_Ctx gLogCtx; const char * file = "./log.txt"; void test_log (const char * message) { int i, j; char idname[16] = {0x00,}; CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); /* initialize */ CF_Log_Initialize (10); /* context {{{ */ gLogCtx = CF_Log_CreateCtx (file, CF_LOG_BUFFER_DEFAULT); if (gLogCtx == NULL) CF_DEBUG_PRINT (stderr, "create log ctx error\n"); for (i = 0 ; i < 10000 ; i++) CF_Log_Write (gLogCtx, "LOG_TEST", "turn %d\n", i); CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack); CF_Log_Write (gLogCtx, message, "here is the end of function [file:%s line:%d func:%s]\n", gDebugCallstack.file, gDebugCallstack.line, gDebugCallstack.function); CF_Log_DestroyCtx (gLogCtx); /* }}} context */ /* id {{{ */ for (i = 0 ; i < 10 ; i++) { sprintf (idname, "logid%d.txt", i); CF_LOG_OPEN (i, idname, CF_LOG_BUFFER_NO); } for (i = 0 ; i < 10 ; i++) { for (j = 0 ; j < 10000 ; j++) CF_LOG_WRITE (i, "LOG_ID_TEST", "turn %d\n", j); CF_LOG_CLOSE (i); } /* }}} id */ /* finalize */ CF_Log_Finalize (); } void test_file (const char * message) { int fd = 0; char buffer[128] = {0x00,}; CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); fd = CF_File_Open (file, CF_FILE_RO); if (fd < 0) CF_DEBUG_TRACE (gDebugCtx, "what the ... file open ?\n"); if (CF_File_Read (fd, buffer, sizeof (buffer) - 1) < 0) CF_DEBUG_TRACE (gDebugCtx, "what the ... file read ?\n"); else CF_DEBUG_TRACE_BIN (gDebugCtx, (unsigned char *)buffer, sizeof (buffer) - 1, "-- %d bytes of %d bytes\n", sizeof (buffer) - 1, CF_File_GetSize (fd)); CF_File_Close (fd); CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL); } void test_callstack3 (void) { CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); while (CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack) == CF_OK) { CF_DEBUG_TRACE (gDebugCtx, "print callstack [file:%s line:%d func:%s]\n", gDebugCallstack.file, gDebugCallstack.line, gDebugCallstack.function); } CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL); } void test_callstack2 (void) { CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); test_callstack3 (); CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL); } void test_callstack1 (void) { CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); test_callstack2 (); CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL); } CF_THREAD_RETURN CF_THREAD_CALL socket_echo_server (void * arg) { int srvsock = *((int *)arg); int clntsock = 0; int recvd = 0; char buf[1024] = {0x00,}; /*------------------------------------------------------------*/ clntsock = CF_Socket_Accept (srvsock, NULL); if (clntsock < 0) { CF_DEBUG_PRINT (stderr, "failed to accept on server\n"); return (CF_THREAD_RETURN)-1; } CF_DEBUG_PRINT (stderr, "SERVER : accepted\n"); CF_Log_Write (gLogCtx, "SERVER", "accepted\n"); if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0) { CF_DEBUG_PRINT (stderr, "failed to recv on server\n"); return (CF_THREAD_RETURN)-2; } CF_DEBUG_PRINT (stderr, "SERVER : recv {%s}\n", buf); CF_Log_Write (gLogCtx, "SERVER", "recv {%s}\n", buf); if (CF_Socket_Send (clntsock, buf, recvd) < 0) { CF_DEBUG_PRINT (stderr, "failed to send on server\n"); return (CF_THREAD_RETURN)-3; } CF_DEBUG_PRINT (stderr, "SERVER : resp {%s}\n", buf); CF_Log_Write (gLogCtx, "SERVER", "resp {%s}\n", buf); return (CF_THREAD_RETURN)0; /*------------------------------------------------------------*/ } CF_THREAD_RETURN CF_THREAD_CALL socket_echo_client (void * arg) { int sock = 0; int recvd = 0; char buf[1024] = {0x00,}; sprintf (buf, "...wow ? is it succeed ?"); /*------------------------------------------------------------*/ sock = CF_Socket_Connect ("localhost", PORT); if (sock < 0) { CF_DEBUG_PRINT (stderr, "failed to connect on client\n"); return (CF_THREAD_RETURN)-1; } CF_DEBUG_PRINT (stderr, "CLIENT : connected\n"); CF_Log_Write (gLogCtx, "CLIENT", "connected\n"); if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0) { CF_DEBUG_PRINT (stderr, "failed to send on client %d\n", errno); return (CF_THREAD_RETURN)-2; } CF_DEBUG_PRINT (stderr, "CLIENT : sent {%s}\n", buf); CF_Log_Write (gLogCtx, "CLIENT", "sent {%s}\n", buf); memset (buf, 0x00, sizeof (buf)); if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0) { CF_DEBUG_PRINT (stderr, "failed to recv on client\n"); return (CF_THREAD_RETURN)-3; } CF_DEBUG_PRINT (stderr, "CLIENT : recv {%s}\n", buf); CF_Log_Write (gLogCtx, "CLIENT", "recv {%s}\n", buf); CF_Socket_Close (sock); return (CF_THREAD_RETURN)0; /*------------------------------------------------------------*/ } void test_socket (void) { CF_Thread tid[THREAD_POOL]; int sock = 0; int iter = 0; int reuse = 1; /*------------------------------------------------------------*/ gLogCtx = CF_Log_CreateCtx ("socket.txt", CF_LOG_BUFFER_DEFAULT); if (gLogCtx == NULL) CF_DEBUG_PRINT (stderr, "failed to open log\n"); CF_Log_Write (gLogCtx, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n"); if (CF_Socket_Initialize () < 0) { CF_DEBUG_PRINT (stderr, "failed to initialize socket\n"); return ; } CF_Log_Write (gLogCtx, "SOCKET", "socket initialized\n"); sock = CF_Socket_Server (PORT, 5); if (sock < 0) { CF_DEBUG_PRINT (stderr, "failed to ready server %d\n", sock); return ; } CF_Log_Write (gLogCtx, "SOCKET", "socket ready\n"); if (CF_Socket_SetOption (sock, SO_REUSEADDR, &reuse, sizeof (reuse)) < 0) { CF_DEBUG_PRINT (stderr, "failed to set option\n"); return ; } CF_Log_Write (gLogCtx, "SOCKET", "set socket option\n"); for (iter = 0 ; iter < THREAD_POOL ; iter++) { if (CF_Thread_Create (&tid[iter], socket_echo_server, &sock) < 0) { CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter); return ; } CF_Log_Write (gLogCtx, "SOCKET", "create server thread-%d\n", iter); } for (iter = 0 ; iter < THREAD_POOL ; iter++) { CF_Thread dummy; if (CF_Thread_Create (&dummy, socket_echo_client, &sock) < 0) { CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter); return ; } CF_Log_Write (gLogCtx, "SOCKET", "create client thread-%d\n", iter); } for (iter = 0 ; iter < THREAD_POOL ; iter++) { CF_DEBUG_PRINT (stderr, "tid[%d] 0x%08x\n", iter, tid[iter]); CF_Thread_Join (&tid[iter]); CF_Thread_Release (&tid[iter]); CF_Log_Write (gLogCtx, "SOCKET", "join server thread-%d\n", iter); } CF_Socket_Close (sock); CF_Socket_Finalize (); CF_Log_DestroyCtx (gLogCtx); /*------------------------------------------------------------*/ } int main (int argc, char ** argv) { gDebugCtx = CF_Debug_CreateCtx (); CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); // 1 CF_DEBUG_PRINT (stderr, " == LOG TEST ==\n"); test_log ("LOG_TEST"); // 2 CF_DEBUG_PRINT (stderr, " == FILE READ TEST ==\n"); test_file ("FILE_READ_TEST"); // 3 CF_DEBUG_PRINT (stderr, " == CALLSTACK TEST ==\n"); test_callstack1 (); // 4 CF_DEBUG_PRINT (stderr, " == MULTI-THREADED SOCKET TEST with MULTI-THREADED LOGGING ==\n"); test_socket (); CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack); CF_DEBUG_PRINT (stderr, " == END OF TEST ==\n"); CF_DEBUG_TRACE (gDebugCtx, "here is the end of function [file:%s line:%d func:%s]\n", gDebugCallstack.file, gDebugCallstack.line, gDebugCallstack.function); CF_Debug_DestroyCtx (gDebugCtx); return 0; }