/** * @file test.c * @author myusgun * @version 0.1 */ #include "cf_file.h" #include "cf_log.h" #include "cf_socket.h" #include "cf_thread.h" /* * before including "cf_debug.h", * if _DEBUG is defined, the debugging code will be act. */ #include "cf_debug.h" #include #include #include #define THREAD_POOL 5 #define PORT 1234 CF_Debug_Ctx gDebugCtx; CF_Debug_CallStack gDebugCallstack; CF_Mutex globalMutex; #define LOG_SOCKET 0 #define LOG_MT 1 const char * file = "./log.txt"; CF_THREAD_RETURN CF_THREAD_CALL test_log_mt (void * arg) { static int cnt = 0; int i = 0; int th = 0; if (CF_Mutex_Lock (&globalMutex) < 0) { // for critical section // error } th = cnt++; if (CF_Mutex_Unlock (&globalMutex) < 0) { // for critical section // error } CF_DEBUG_PRINT (stderr, "created %dth thread\n", th); for (i = 0 ; i < 100000 ; i++) { CF_Log_Write (LOG_MT, "LOG_MT", "[%d] multi-threadedlogging test %d\n", th, i); } CF_DEBUG_PRINT (stderr, "end %dth thread\n", th); return (CF_THREAD_RETURN)0; } void test_log (const char * message) { int i, j; char idname[16] = {0x00,}; CF_Thread tid[10]; CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); /* initialize */ if (CF_Log_Initialize (10) < 0) { fprintf (stderr, "failed to init. log\n"); return ; } for (i = 0 ; i < 10 ; i++) { sprintf (idname, "logid%d.txt", i); if (CF_Log_Open (i, idname, CF_LOG_BUFFER_NO) < 0) fprintf (stderr, "failed to open log\n"); } for (i = 0 ; i < 10 ; i++) { for (j = 0 ; j < 10000 ; j++) { int result = CF_Log_Write (i, "LOG_ID_TEST", "turn %d\n", j); if (result < 0) fprintf (stderr, "failed to write log %d\n", result); } if (CF_Log_Close (i) < 0) fprintf (stderr, "failed to close log\n"); } /* mt {{{ */ if (CF_Log_Open (LOG_MT, "log_mt.txt", CF_LOG_BUFFER_DEFAULT) < 0) CF_DEBUG_PRINT (stderr, "create log ctx error\n"); if (CF_Log_SetMT (LOG_MT, CF_TRUE) < 0) CF_DEBUG_PRINT (stderr, "set multi-threading mode error\n"); if (CF_Mutex_Create (&globalMutex) < 0) { // error } for (i = 0 ; i < 10 ; i++) { if (CF_Thread_Create (&tid[i], test_log_mt, &i) < 0) { CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", i); return ; } } if (CF_Mutex_Destory (&globalMutex) < 0) { // error } for (i = 0 ; i < 10 ; i++) { if (CF_Thread_Join (&tid[i]) < 0) CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i); } /* }}} mt */ /* 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)) < 0) CF_DEBUG_TRACE (gDebugCtx, "what the ... file read ?\n"); else CF_DEBUG_TRACE_BIN (gDebugCtx, (unsigned char *)buffer, sizeof (buffer), "-- %d bytes of %d bytes\n", sizeof (buffer), 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,}; int i = 0; /*------------------------------------------------------------*/ 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_Log_Write (LOG_SOCKET, "SERVER", "accepted\n"); for (i = 0 ; i < 100 ; i++) { 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_Log_Write (LOG_SOCKET, "SERVER", "recv {%s}\n", buf); if (CF_Socket_Send (clntsock, buf, recvd) < 0) { return (CF_THREAD_RETURN)-3; } CF_Log_Write (LOG_SOCKET, "SERVER", "resp {%s}\n", buf); } CF_Socket_Close (clntsock); 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,}; int i = 0; 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_Log_Write (LOG_SOCKET, "CLIENT", "connected\n"); for (i = 0 ; i < 100 ; i++) { 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_Log_Write (LOG_SOCKET, "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_Log_Write (LOG_SOCKET, "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; /*------------------------------------------------------------*/ if (CF_Log_Initialize (1) < 0) { fprintf (stderr, "failed to init. log\n"); return ; } if (CF_Log_Open (LOG_SOCKET, "socket.txt", CF_LOG_BUFFER_DEFAULT) < 0) CF_DEBUG_PRINT (stderr, "failed to open log\n"); CF_Log_Write (LOG_SOCKET, "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 (LOG_SOCKET, "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 (LOG_SOCKET, "SOCKET", "socket ready\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 (LOG_SOCKET, "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 (LOG_SOCKET, "SOCKET", "create client thread-%d\n", iter); } for (iter = 0 ; iter < THREAD_POOL ; iter++) { CF_Thread_Join (&tid[iter]); CF_Thread_Release (&tid[iter]); CF_Log_Write (LOG_SOCKET, "SOCKET", "join server thread-%d\n", iter); } CF_Socket_Close (sock); CF_Socket_Finalize (); CF_Log_Close (LOG_SOCKET); CF_Log_Finalize (); /*------------------------------------------------------------*/ } 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 ==\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; }