source: libcf/trunk/test/test.c@ 38

Last change on this file since 38 was 38, checked in by cheese, 11 years ago

#1 modify test.c for more detail test of multi-threaded logging

File size: 8.3 KB
Line 
1/**
2 * @file test.c
3 * @author myusgun <myusgun@gmail.com>
4 * @version 0.1
5 */
6#include "cf_file.h"
7#include "cf_log.h"
8#include "cf_socket.h"
9#include "cf_thread.h"
10
11/*
12 * before including "cf_debug.h",
13 * if _DEBUG is defined, the debugging code will be act.
14 */
15#include "cf_debug.h"
16
17#include <stdlib.h>
18#include <string.h>
19#include <errno.h>
20
21#define THREAD_POOL 5
22#define PORT 1234
23
24CF_Debug_Ctx gDebugCtx;
25CF_Debug_CallStack gDebugCallstack;
26
27CF_Log_Ctx gLogCtx;
28
29const char * file = "./log.txt";
30
31CF_THREAD_RETURN CF_THREAD_CALL test_log_mt (void * arg)
32{
33 int i = 0;
34 int th = *((int *)arg);
35
36 for (i = 0 ; i < 100000 ; i++)
37 {
38 CF_Log_Write (gLogCtx, "LOG_MT", "[%d] multi-threadedlogging test %d\n", th, i);
39 }
40
41 return (CF_THREAD_RETURN)0;
42}
43
44void test_log (const char * message)
45{
46 int i, j;
47 char idname[16] = {0x00,};
48 CF_Thread tid[10];
49
50 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
51
52 /* initialize */
53 CF_Log_Initialize (10);
54
55 /* context {{{ */
56 gLogCtx = CF_Log_CreateCtx (file, CF_LOG_BUFFER_DEFAULT);
57 if (gLogCtx == NULL)
58 CF_DEBUG_PRINT (stderr, "create log ctx error\n");
59
60 for (i = 0 ; i < 1000 ; i++)
61 CF_Log_Write (gLogCtx, "LOG_TEST", "turn %d\n", i);
62
63 CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack);
64
65 CF_Log_Write (gLogCtx, message,
66 "here is the end of function [file:%s line:%d func:%s]\n",
67 gDebugCallstack.file,
68 gDebugCallstack.line,
69 gDebugCallstack.function);
70
71 CF_Log_DestroyCtx (gLogCtx);
72 /* }}} context */
73
74 /* id {{{ */
75 for (i = 0 ; i < 10 ; i++)
76 {
77 sprintf (idname, "logid%d.txt", i);
78 CF_LOG_OPEN (i, idname, CF_LOG_BUFFER_NO);
79 }
80
81 for (i = 0 ; i < 10 ; i++)
82 {
83 for (j = 0 ; j < 10000 ; j++)
84 CF_LOG_WRITE (i, "LOG_ID_TEST", "turn %d\n", j);
85
86 CF_LOG_CLOSE (i);
87 }
88 /* }}} id */
89
90 /* mt {{{ */
91 gLogCtx = CF_Log_CreateCtx ("log_mt.txt", CF_LOG_BUFFER_DEFAULT);
92 if (gLogCtx == NULL)
93 CF_DEBUG_PRINT (stderr, "create log ctx error\n");
94
95 if (CF_Log_SetMultiThread (gLogCtx) < 0)
96 CF_DEBUG_PRINT (stderr, "set multi-threading mode error\n");
97
98 for (i = 0 ; i < 10 ; i++)
99 {
100 if (CF_Thread_Create (&tid[i], test_log_mt, &i) < 0)
101 {
102 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", i);
103 return ;
104 }
105 CF_DEBUG_PRINT (stderr, "created %dth thread\n", i);
106 }
107
108 for (i = 0 ; i < 10 ; i++)
109 {
110 if (CF_Thread_Join (&tid[i]) < 0)
111 CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i);
112 }
113
114 CF_Log_DestroyCtx (gLogCtx);
115 /* }}} mt */
116
117 /* finalize */
118 CF_Log_Finalize ();
119}
120
121void test_file (const char * message)
122{
123 int fd = 0;
124 char buffer[128] = {0x00,};
125
126 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
127
128 fd = CF_File_Open (file, CF_FILE_RO);
129 if (fd < 0)
130 CF_DEBUG_TRACE (gDebugCtx, "what the ... file open ?\n");
131
132 if (CF_File_Read (fd, buffer, sizeof (buffer)) < 0)
133 CF_DEBUG_TRACE (gDebugCtx, "what the ... file read ?\n");
134 else
135 CF_DEBUG_TRACE_BIN (gDebugCtx, (unsigned char *)buffer,
136 sizeof (buffer),
137 "-- %d bytes of %d bytes\n",
138 sizeof (buffer),
139 CF_File_GetSize (fd));
140
141 CF_File_Close (fd);
142
143 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL);
144}
145
146void test_callstack3 (void)
147{
148 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
149 while (CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack) == CF_OK)
150 {
151 CF_DEBUG_TRACE (gDebugCtx, "print callstack [file:%s line:%d func:%s]\n",
152 gDebugCallstack.file,
153 gDebugCallstack.line,
154 gDebugCallstack.function);
155 }
156 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL);
157}
158void test_callstack2 (void)
159{
160 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
161 test_callstack3 ();
162 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL);
163}
164void test_callstack1 (void)
165{
166 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
167 test_callstack2 ();
168 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL);
169}
170
171CF_THREAD_RETURN CF_THREAD_CALL socket_echo_server (void * arg)
172{
173 int srvsock = *((int *)arg);
174 int clntsock = 0;
175 int recvd = 0;
176 char buf[1024] = {0x00,};
177 int i = 0;
178
179 /*------------------------------------------------------------*/
180 clntsock = CF_Socket_Accept (srvsock, NULL);
181 if (clntsock < 0)
182 {
183 CF_DEBUG_PRINT (stderr, "failed to accept on server\n");
184 return (CF_THREAD_RETURN)-1;
185 }
186 CF_Log_Write (gLogCtx, "SERVER", "accepted\n");
187
188 for (i = 0 ; i < 100 ; i++)
189 {
190 if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0)
191 {
192 CF_DEBUG_PRINT (stderr, "failed to recv on server\n");
193 return (CF_THREAD_RETURN)-2;
194 }
195 CF_Log_Write (gLogCtx, "SERVER", "recv {%s}\n", buf);
196
197 if (CF_Socket_Send (clntsock, buf, recvd) < 0)
198 {
199 return (CF_THREAD_RETURN)-3;
200 }
201 CF_Log_Write (gLogCtx, "SERVER", "resp {%s}\n", buf);
202 }
203
204 CF_Socket_Close (clntsock);
205
206 return (CF_THREAD_RETURN)0;
207 /*------------------------------------------------------------*/
208}
209
210CF_THREAD_RETURN CF_THREAD_CALL socket_echo_client (void * arg)
211{
212 int sock = 0;
213 int recvd = 0;
214 char buf[1024] = {0x00,};
215 int i = 0;
216
217 sprintf (buf, "...wow ? is it succeed ?");
218
219 /*------------------------------------------------------------*/
220 sock = CF_Socket_Connect ("localhost", PORT);
221 if (sock < 0)
222 {
223 CF_DEBUG_PRINT (stderr, "failed to connect on client\n");
224 return (CF_THREAD_RETURN)-1;
225 }
226 CF_Log_Write (gLogCtx, "CLIENT", "connected\n");
227
228 for (i = 0 ; i < 100 ; i++)
229 {
230 if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0)
231 {
232 CF_DEBUG_PRINT (stderr, "failed to send on client %d\n", errno);
233 return (CF_THREAD_RETURN)-2;
234 }
235 CF_Log_Write (gLogCtx, "CLIENT", "sent {%s}\n", buf);
236
237 memset (buf, 0x00, sizeof (buf));
238
239 if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0)
240 {
241 CF_DEBUG_PRINT (stderr, "failed to recv on client\n");
242 return (CF_THREAD_RETURN)-3;
243 }
244 CF_Log_Write (gLogCtx, "CLIENT", "recv {%s}\n", buf);
245 }
246
247 CF_Socket_Close (sock);
248
249 return (CF_THREAD_RETURN)0;
250 /*------------------------------------------------------------*/
251}
252
253void test_socket (void)
254{
255 CF_Thread tid[THREAD_POOL];
256
257 int sock = 0;
258 int iter = 0;
259 int reuse = 1;
260
261 /*------------------------------------------------------------*/
262 gLogCtx = CF_Log_CreateCtx ("socket.txt", CF_LOG_BUFFER_DEFAULT);
263 if (gLogCtx == NULL)
264 CF_DEBUG_PRINT (stderr, "failed to open log\n");
265
266 CF_Log_Write (gLogCtx, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n");
267
268 if (CF_Socket_Initialize () < 0)
269 {
270 CF_DEBUG_PRINT (stderr, "failed to initialize socket\n");
271 return ;
272 }
273 CF_Log_Write (gLogCtx, "SOCKET", "socket initialized\n");
274
275 sock = CF_Socket_Server (PORT, 5);
276 if (sock < 0)
277 {
278 CF_DEBUG_PRINT (stderr, "failed to ready server %d\n", sock);
279 return ;
280 }
281 CF_Log_Write (gLogCtx, "SOCKET", "socket ready\n");
282
283 if (CF_Socket_SetOption (sock, SO_REUSEADDR, &reuse, sizeof (reuse)) < 0)
284 {
285 CF_DEBUG_PRINT (stderr, "failed to set option\n");
286 return ;
287 }
288 CF_Log_Write (gLogCtx, "SOCKET", "set socket option\n");
289
290 for (iter = 0 ; iter < THREAD_POOL ; iter++)
291 {
292 if (CF_Thread_Create (&tid[iter], socket_echo_server, &sock) < 0)
293 {
294 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
295 return ;
296 }
297 CF_Log_Write (gLogCtx, "SOCKET", "create server thread-%d\n", iter);
298 }
299
300 for (iter = 0 ; iter < THREAD_POOL ; iter++)
301 {
302 CF_Thread dummy;
303 if (CF_Thread_Create (&dummy, socket_echo_client, &sock) < 0)
304 {
305 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
306 return ;
307 }
308 CF_Log_Write (gLogCtx, "SOCKET", "create client thread-%d\n", iter);
309 }
310
311 for (iter = 0 ; iter < THREAD_POOL ; iter++)
312 {
313 CF_Thread_Join (&tid[iter]);
314 CF_Thread_Release (&tid[iter]);
315 CF_Log_Write (gLogCtx, "SOCKET", "join server thread-%d\n", iter);
316 }
317
318 CF_Socket_Close (sock);
319
320 CF_Socket_Finalize ();
321
322 CF_Log_DestroyCtx (gLogCtx);
323 /*------------------------------------------------------------*/
324}
325
326int main (int argc, char ** argv)
327{
328 gDebugCtx = CF_Debug_CreateCtx ();
329
330 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx);
331
332 // 1
333 CF_DEBUG_PRINT (stderr, " == LOG TEST ==\n");
334 test_log ("LOG_TEST");
335
336 // 2
337 CF_DEBUG_PRINT (stderr, " == FILE READ TEST ==\n");
338 test_file ("FILE_READ_TEST");
339
340 // 3
341 CF_DEBUG_PRINT (stderr, " == CALLSTACK TEST ==\n");
342 test_callstack1 ();
343
344 // 4
345 CF_DEBUG_PRINT (stderr, " == MULTI-THREADED SOCKET TEST ==\n");
346 test_socket ();
347
348 CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack);
349
350 CF_DEBUG_PRINT (stderr, " == END OF TEST ==\n");
351 CF_DEBUG_TRACE (gDebugCtx, "here is the end of function [file:%s line:%d func:%s]\n",
352 gDebugCallstack.file,
353 gDebugCallstack.line,
354 gDebugCallstack.function);
355
356 CF_Debug_DestroyCtx (gDebugCtx);
357
358 return 0;
359}
360
Note: See TracBrowser for help on using the repository browser.