/** * @file test.c * @author myusgun */ #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_Mutex globalMutex; #define LOG_SOCKET 0 #define LOG_MT 1 const char * file = "./log.txt"; int test_log_mt (void * arg); void test_log (const char * message); void test_file (const char * message); void test_callstack3 (void); void test_callstack2 (void); void test_callstack1 (void); int socket_echo_server (void * arg); int socket_echo_client (void * arg); void test_socket (void); int main (int argc, char ** argv) { CF_DEBUG_INITIALIZE; // 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"); CF_DEBUG_BEGIN_FUNCTION; test_callstack1 (); CF_DEBUG_END_FUNCTION; // 4 CF_DEBUG_PRINT (stderr, " == MULTI-THREADED SOCKET TEST ==\n"); test_socket (); CF_DEBUG_PRINT (stderr, " == END OF TEST ==\n"); CF_DEBUG_FINALIZE; return 0; } int 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 0; } void test_log (const char * message) { int i, j; char idname[16] = {0x00,}; CF_Thread tid[10]; /* 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 ; } } for (i = 0 ; i < 10 ; i++) { if (CF_Thread_Join (&tid[i]) < 0) CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i); if (CF_Thread_Release (&tid[i]) < 0) CF_DEBUG_PRINT (stderr, "failed to release %dth thread\n", i); } if (CF_Mutex_Destory (&globalMutex) < 0) { // error } /* }}} mt */ /* finalize */ CF_Log_Finalize (); } void test_file (const char * message) { int fd = 0; char buffer[128] = {0x00,}; fd = CF_File_Open (file, CF_FILE_RO); if (fd < 0) CF_DEBUG_PRINT (stderr, "what the ... file open ?\n"); if (CF_File_Read (fd, buffer, sizeof (buffer)) < 0) CF_DEBUG_PRINT (stderr, "what the ... file read ?\n"); else CF_DEBUG_PRINT_BIN (stdout, (unsigned char *)buffer, sizeof (buffer), "-- %d bytes of %d bytes\n", sizeof (buffer), CF_File_GetSize (fd)); CF_File_Close (fd); } void test_callstack3 (void) { // ... CF_DEBUG_BEGIN_FUNCTION; CF_DEBUG_PRINT_CALLSTACK (stderr); CF_DEBUG_END_FUNCTION; // ... } void test_callstack2 (void) { // ... CF_DEBUG_BEGIN_FUNCTION; test_callstack3 (); CF_DEBUG_END_FUNCTION; // ... } void test_callstack1 (void) { // ... CF_DEBUG_BEGIN_FUNCTION; test_callstack2 (); CF_DEBUG_END_FUNCTION; // ... } int 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); if (clntsock < 0) { CF_DEBUG_PRINT (stderr, "failed to accept on server\n"); 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 -2; } CF_Log_Write (LOG_SOCKET, "SERVER", "recv {%s}\n", buf); if (CF_Socket_Send (clntsock, buf, recvd) < 0) { return -3; } CF_Log_Write (LOG_SOCKET, "SERVER", "resp {%s}\n", buf); } CF_Socket_Close (clntsock); return 0; /*------------------------------------------------------------*/ } int 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 -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 -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 -3; } CF_Log_Write (LOG_SOCKET, "CLIENT", "recv {%s}\n", buf); } CF_Socket_Close (sock); return 0; /*------------------------------------------------------------*/ } void test_socket (void) { CF_Thread stid[THREAD_POOL]; CF_Thread ctid[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 (&stid[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++) { if (CF_Thread_Create (&ctid[iter], 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 (&ctid[iter]); CF_Thread_Release (&ctid[iter]); CF_Thread_Join (&stid[iter]); CF_Thread_Release (&stid[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 (); /*------------------------------------------------------------*/ }