Changeset 21 in libcf for trunk/test/test.c


Ignore:
Timestamp:
02/01/13 17:46:09 (11 years ago)
Author:
cheese
Message:

#1 add test code for multi-threading, socket and multi-threaded logging

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/test.c

    r19 r21  
    99
    1010#include <stdlib.h>
     11#include <string.h>
     12#include <errno.h>
     13
     14#define THREAD_POOL 5
     15#define PORT        1234
    1116
    1217CF_Debug_Ctx        gDebugCtx;
    1318CF_Debug_CallStack  gDebugCallstack;
    1419
     20CF_Log_Ctx          gLogCtx;
     21
    1522const char * file = "./log.txt";
    1623
     
    1926    int         i, j;
    2027    char        idname[16] = {0x00,};
    21     CF_Log_Ctx  gLogCtx;
    22 
    23     CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
    24 
     28
     29    CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
     30
     31    /* initialize */
    2532    CF_Log_Initialize (10);
    2633
     34    /* context {{{ */
    2735    gLogCtx = CF_Log_CreateCtx (file, CF_LOG_BUFFER_DEFAULT);
    2836    if (gLogCtx == NULL)
     
    4149
    4250    CF_Log_DestroyCtx (gLogCtx);
    43 
    44     ///////////////////
    45 
     51    /* }}} context */
     52
     53    /* id {{{ */
    4654    for (i = 0 ; i < 10 ; i++)
    4755    {
     
    5765        CF_LOG_CLOSE (i);
    5866    }
    59 
     67    /* }}} id */
     68
     69    /* finalize */
    6070    CF_Log_Finalize ();
    6171}
     
    6373void file_test (const char * message)
    6474{
    65     int     size = 0;
    6675    int     fd = 0;
    67     char    * buffer = NULL;
     76    char    buffer[128] = {0x00,};
    6877
    6978    CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
     
    7382        CF_DEBUG_TRACE (gDebugCtx, "what the ... file open ?\n");
    7483
    75     size = CF_File_GetSize (fd);
    76     if (size < 0)
    77         CF_DEBUG_TRACE (gDebugCtx, "what the ... file size ?\n");
    78 
    79     buffer = (char *) calloc (1, (size_t) (size + 1));
    80     if (buffer == NULL)
    81         CF_DEBUG_TRACE (gDebugCtx, "what the ... buffer ?\n");
    82 
    83     if (CF_File_Read (fd, buffer, (size_t)size) < 0)
     84    if (CF_File_Read (fd, buffer, sizeof (buffer) - 1) < 0)
    8485        CF_DEBUG_TRACE (gDebugCtx, "what the ... file read ?\n");
    8586    else
    86         CF_DEBUG_TRACE (gDebugCtx, "%s", buffer);
     87        CF_DEBUG_TRACE_BIN (gDebugCtx, (unsigned char *)buffer,
     88                                        sizeof (buffer) - 1,
     89                                        "-- %d bytes of %d bytes\n",
     90                                        sizeof (buffer) - 1,
     91                                        CF_File_GetSize (fd));
    8792
    8893    CF_File_Close (fd);
     
    116121}
    117122
     123CF_THREAD_RETURN CF_THREAD_CALL socket_echo_server (void * arg)
     124{
     125    int srvsock = *((int *)arg);
     126    int clntsock = 0;
     127    int recvd = 0;
     128    char buf[1024] = {0x00,};
     129
     130    /*------------------------------------------------------------*/
     131    clntsock = CF_Socket_Accept (srvsock, NULL);
     132    if (clntsock < 0)
     133    {
     134        CF_DEBUG_PRINT (stderr, "failed to accept on server\n");
     135        return (CF_THREAD_RETURN)-1;
     136    }
     137    CF_DEBUG_PRINT (stderr, "SERVER : accepted\n");
     138    CF_Log_Write (gLogCtx, "SERVER", "accepted\n");
     139
     140    if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0)
     141    {
     142        CF_DEBUG_PRINT (stderr, "failed to recv on server\n");
     143        return (CF_THREAD_RETURN)-2;
     144    }
     145    CF_DEBUG_PRINT (stderr, "SERVER : recv {%s}\n", buf);
     146    CF_Log_Write (gLogCtx, "SERVER", "recv {%s}\n", buf);
     147
     148    if (CF_Socket_Send (clntsock, buf, recvd) < 0)
     149    {
     150        CF_DEBUG_PRINT (stderr, "failed to send on server\n");
     151        return (CF_THREAD_RETURN)-3;
     152    }
     153    CF_DEBUG_PRINT (stderr, "SERVER : resp {%s}\n", buf);
     154    CF_Log_Write (gLogCtx, "SERVER", "resp {%s}\n", buf);
     155
     156    return (CF_THREAD_RETURN)0;
     157    /*------------------------------------------------------------*/
     158}
     159
     160CF_THREAD_RETURN CF_THREAD_CALL socket_echo_client (void * arg)
     161{
     162    int sock = 0;
     163    int recvd = 0;
     164    char buf[1024] = {0x00,};
     165
     166    sprintf (buf, "...wow ? is it succeed ?");
     167
     168    /*------------------------------------------------------------*/
     169    sock = CF_Socket_Connect ("localhost", PORT);
     170    if (sock < 0)
     171    {
     172        CF_DEBUG_PRINT (stderr, "failed to connect on client\n");
     173        return (CF_THREAD_RETURN)-1;
     174    }
     175    CF_DEBUG_PRINT (stderr, "CLIENT : connected\n");
     176    CF_Log_Write (gLogCtx, "CLIENT", "connected\n");
     177
     178    if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0)
     179    {
     180        CF_DEBUG_PRINT (stderr, "failed to send on client %d\n", errno);
     181        return (CF_THREAD_RETURN)-2;
     182    }
     183    CF_DEBUG_PRINT (stderr, "CLIENT : sent {%s}\n", buf);
     184    CF_Log_Write (gLogCtx, "CLIENT", "sent {%s}\n", buf);
     185
     186    memset (buf, 0x00, sizeof (buf));
     187
     188    if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0)
     189    {
     190        CF_DEBUG_PRINT (stderr, "failed to recv on client\n");
     191        return (CF_THREAD_RETURN)-3;
     192    }
     193    CF_DEBUG_PRINT (stderr, "CLIENT : recv {%s}\n", buf);
     194    CF_Log_Write (gLogCtx, "CLIENT", "recv {%s}\n", buf);
     195
     196    CF_Socket_Close (sock);
     197
     198    return (CF_THREAD_RETURN)0;
     199    /*------------------------------------------------------------*/
     200}
     201
     202void socket_test (void)
     203{
     204    CF_Thread tid[THREAD_POOL];
     205
     206    int sock = 0;
     207    int iter = 0;
     208    int reuse = 1;
     209
     210    /*------------------------------------------------------------*/
     211    gLogCtx = CF_Log_CreateCtx ("socket.txt", CF_LOG_BUFFER_DEFAULT);
     212    if (gLogCtx == NULL)
     213        CF_DEBUG_PRINT (stderr, "failed to open log\n");
     214
     215    CF_Log_Write (gLogCtx, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n");
     216
     217    if (CF_Socket_Initialize () < 0)
     218    {
     219        CF_DEBUG_PRINT (stderr, "failed to initialize socket\n");
     220        return ;
     221    }
     222    CF_Log_Write (gLogCtx, "SOCKET", "socket initialized\n");
     223
     224    sock = CF_Socket_Server (PORT, 5);
     225    if (sock < 0)
     226    {
     227        CF_DEBUG_PRINT (stderr, "failed to ready server %d\n", sock);
     228        return ;
     229    }
     230    CF_Log_Write (gLogCtx, "SOCKET", "socket ready\n");
     231
     232    if (CF_Socket_SetOption (sock, SO_REUSEADDR, &reuse, sizeof (reuse)) < 0)
     233    {
     234        CF_DEBUG_PRINT (stderr, "failed to set option\n");
     235        return ;
     236    }
     237    CF_Log_Write (gLogCtx, "SOCKET", "set socket option\n");
     238
     239    for (iter = 0 ; iter < THREAD_POOL ; iter++)
     240    {
     241        if (CF_Thread_Create (&tid[iter], socket_echo_server, &sock) < 0)
     242        {
     243            CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
     244            return ;
     245        }
     246        CF_Log_Write (gLogCtx, "SOCKET", "create server thread-%d\n", iter);
     247    }
     248
     249    for (iter = 0 ; iter < THREAD_POOL ; iter++)
     250    {
     251        CF_Thread dummy;
     252        if (CF_Thread_Create (&dummy, socket_echo_client, &sock) < 0)
     253        {
     254            CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
     255            return ;
     256        }
     257        CF_Log_Write (gLogCtx, "SOCKET", "create client thread-%d\n", iter);
     258    }
     259
     260    for (iter = 0 ; iter < THREAD_POOL ; iter++)
     261    {
     262        int st;
     263        CF_DEBUG_PRINT (stderr, "tid[%d] 0x%08x\n", iter, tid[iter]);
     264        CF_Thread_Join (&tid[iter]);
     265//      pthread_join (*((pthread_t *)*((CF_Thread *)&tid[iter])), &st);
     266        CF_Thread_Release (&tid[iter]);
     267        CF_Log_Write (gLogCtx, "SOCKET", "join server thread-%d\n", iter);
     268    }
     269
     270    CF_Socket_Close (sock);
     271
     272    CF_Socket_Finalize ();
     273
     274    CF_Log_DestroyCtx (gLogCtx);
     275    /*------------------------------------------------------------*/
     276}
     277
    118278int main (int argc, char ** argv)
    119279{
     
    122282    CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
    123283
     284    // 1
    124285    CF_DEBUG_PRINT (stderr, " == LOG TEST ==\n");
    125286    log_test ("LOG_TEST");
    126287
     288    // 2
    127289    CF_DEBUG_PRINT (stderr, " == FILE READ TEST ==\n");
    128290    file_test ("FILE_READ_TEST");
    129291
     292    // 3
    130293    CF_DEBUG_PRINT (stderr, " == CALLSTACK TEST ==\n");
    131294    callee1 ();
     295
     296    // 4
     297    CF_DEBUG_PRINT (stderr, " == MULTI-THREADED SOCKET TEST ==\n");
     298    socket_test ();
    132299
    133300    CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack);
     
    143310    return 0;
    144311}
     312
Note: See TracChangeset for help on using the changeset viewer.