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

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

#1 fix hex codec bug and add codec to windows project

File size: 8.5 KB
Line 
1/**
2 * @file test.c
3 * @author myusgun <myusgun@gmail.com>
4 */
5#include "cf_file.h"
6#include "cf_log.h"
7#include "cf_socket.h"
8#include "cf_thread.h"
9#include "cf_codec.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_Mutex globalMutex;
25
26#define LOG_SOCKET 0
27#define LOG_MT 1
28
29const char * file = "./log.txt";
30
31int test_log_mt (void * arg);
32void test_log (const char * message);
33void test_file (const char * message);
34void test_callstack3 (void);
35void test_callstack2 (void);
36void test_callstack1 (void);
37int socket_echo_server (void * arg);
38int socket_echo_client (void * arg);
39void test_socket (void);
40void test_codec (void);
41
42int main (int argc, char ** argv)
43{
44 CF_DEBUG_INITIALIZE;
45
46 // 1
47 CF_DEBUG_PRINT (stderr, " == LOG TEST ==\n");
48 test_log ("LOG_TEST");
49
50 // 2
51 CF_DEBUG_PRINT (stderr, " == FILE READ TEST ==\n");
52 test_file ("FILE_READ_TEST");
53
54 // 3
55 CF_DEBUG_PRINT (stderr, " == CALLSTACK TEST ==\n");
56 CF_DEBUG_BEGIN_FUNCTION;
57 test_callstack1 ();
58 CF_DEBUG_END_FUNCTION;
59
60 // 4
61 CF_DEBUG_PRINT (stderr, " == MULTI-THREADED SOCKET TEST ==\n");
62 test_socket ();
63
64 // 5
65 CF_DEBUG_PRINT (stderr, " == CODEC TEST ==\n");
66 test_codec ();
67
68 CF_DEBUG_PRINT (stderr, " == END OF TEST ==\n");
69
70 CF_DEBUG_FINALIZE;
71
72 return 0;
73}
74
75int test_log_mt (void * arg)
76{
77 static int cnt = 0;
78 int i = 0;
79 int th = 0;
80
81 if (CF_Mutex_Lock (&globalMutex) < 0) { // for critical section
82 // error
83 }
84 th = cnt++;
85 if (CF_Mutex_Unlock (&globalMutex) < 0) { // for critical section
86 // error
87 }
88
89 CF_DEBUG_PRINT (stderr, "created %dth thread\n", th);
90
91 for (i = 0 ; i < 100000 ; i++)
92 {
93 CF_Log_Write (LOG_MT, "LOG_MT", "[%d] multi-threadedlogging test %d\n", th, i);
94 }
95
96 CF_DEBUG_PRINT (stderr, "end %dth thread\n", th);
97
98 return 0;
99}
100
101void test_log (const char * message)
102{
103 int i, j;
104 char idname[16] = {0x00,};
105 CF_Thread tid[10];
106
107 /* initialize */
108 if (CF_Log_Initialize (10) < 0)
109 {
110 fprintf (stderr, "failed to init. log\n");
111 return ;
112 }
113
114 for (i = 0 ; i < 10 ; i++)
115 {
116 sprintf (idname, "logid%d.txt", i);
117 if (CF_Log_Open (i, idname, CF_LOG_BUFFER_NO) < 0)
118 fprintf (stderr, "failed to open log\n");
119 }
120
121 for (i = 0 ; i < 10 ; i++)
122 {
123 for (j = 0 ; j < 10000 ; j++)
124 {
125 int result = CF_Log_Write (i, "LOG_ID_TEST", "turn %d\n", j);
126 if (result < 0)
127 fprintf (stderr, "failed to write log %d\n", result);
128 }
129
130 if (CF_Log_Close (i) < 0)
131 fprintf (stderr, "failed to close log\n");
132 }
133
134 /* mt {{{ */
135 if (CF_Log_Open (LOG_MT, "log_mt.txt", CF_LOG_BUFFER_DEFAULT) < 0)
136 CF_DEBUG_PRINT (stderr, "create log ctx error\n");
137
138 if (CF_Log_SetMT (LOG_MT, CF_TRUE) < 0)
139 CF_DEBUG_PRINT (stderr, "set multi-threading mode error\n");
140
141 if (CF_Mutex_Create (&globalMutex) < 0) {
142 // error
143 }
144
145 for (i = 0 ; i < 10 ; i++)
146 {
147 if (CF_Thread_Create (&tid[i], test_log_mt, &i) < 0)
148 {
149 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", i);
150 return ;
151 }
152 }
153
154 for (i = 0 ; i < 10 ; i++)
155 {
156 if (CF_Thread_Join (&tid[i]) < 0)
157 CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i);
158 if (CF_Thread_Release (&tid[i]) < 0)
159 CF_DEBUG_PRINT (stderr, "failed to release %dth thread\n", i);
160 }
161
162 if (CF_Mutex_Destory (&globalMutex) < 0) {
163 // error
164 }
165 /* }}} mt */
166
167 /* finalize */
168 CF_Log_Finalize ();
169}
170
171void test_file (const char * message)
172{
173 int fd = 0;
174 char buffer[128] = {0x00,};
175
176 fd = CF_File_Open (file, CF_FILE_RO);
177 if (fd < 0)
178 CF_DEBUG_PRINT (stderr, "what the ... file open ?\n");
179
180 if (CF_File_Read (fd, buffer, sizeof (buffer)) < 0)
181 CF_DEBUG_PRINT (stderr, "what the ... file read ?\n");
182 else
183 CF_DEBUG_PRINT_BIN (stdout, (unsigned char *)buffer,
184 sizeof (buffer),
185 "-- %d bytes of %d bytes\n",
186 sizeof (buffer),
187 CF_File_GetSize (fd));
188
189 CF_File_Close (fd);
190}
191
192void test_callstack3 (void)
193{
194 // ...
195
196 CF_DEBUG_BEGIN_FUNCTION;
197 CF_DEBUG_PRINT_CALLSTACK (stderr);
198 CF_DEBUG_END_FUNCTION;
199
200 // ...
201}
202void test_callstack2 (void)
203{
204 // ...
205
206 CF_DEBUG_BEGIN_FUNCTION;
207 test_callstack3 ();
208 CF_DEBUG_END_FUNCTION;
209
210 // ...
211}
212void test_callstack1 (void)
213{
214 // ...
215
216 CF_DEBUG_BEGIN_FUNCTION;
217 test_callstack2 ();
218 CF_DEBUG_END_FUNCTION;
219
220 // ...
221}
222
223int socket_echo_server (void * arg)
224{
225 int srvsock = *((int *)arg);
226 int clntsock = 0;
227 int recvd = 0;
228 char buf[1024] = {0x00,};
229 int i = 0;
230
231 /*------------------------------------------------------------*/
232 clntsock = CF_Socket_Accept (srvsock);
233 if (clntsock < 0)
234 {
235 CF_DEBUG_PRINT (stderr, "failed to accept on server\n");
236 return -1;
237 }
238 CF_Log_Write (LOG_SOCKET, "SERVER", "accepted\n");
239
240 for (i = 0 ; i < 100 ; i++)
241 {
242 if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0)
243 {
244 CF_DEBUG_PRINT (stderr, "failed to recv on server\n");
245 return -2;
246 }
247 CF_Log_Write (LOG_SOCKET, "SERVER", "recv {%s}\n", buf);
248
249 if (CF_Socket_Send (clntsock, buf, recvd) < 0)
250 {
251 return -3;
252 }
253 CF_Log_Write (LOG_SOCKET, "SERVER", "resp {%s}\n", buf);
254 }
255
256 CF_Socket_Close (clntsock);
257
258 return 0;
259 /*------------------------------------------------------------*/
260}
261
262int socket_echo_client (void * arg)
263{
264 int sock = 0;
265 int recvd = 0;
266 char buf[1024] = {0x00,};
267 int i = 0;
268
269 sprintf (buf, "...wow ? is it succeed ?");
270
271 /*------------------------------------------------------------*/
272 sock = CF_Socket_Connect ("localhost", PORT);
273 if (sock < 0)
274 {
275 CF_DEBUG_PRINT (stderr, "failed to connect on client\n");
276 return -1;
277 }
278 CF_Log_Write (LOG_SOCKET, "CLIENT", "connected\n");
279
280 for (i = 0 ; i < 100 ; i++)
281 {
282 if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0)
283 {
284 CF_DEBUG_PRINT (stderr, "failed to send on client %d\n", errno);
285 return -2;
286 }
287 CF_Log_Write (LOG_SOCKET, "CLIENT", "sent {%s}\n", buf);
288
289 memset (buf, 0x00, sizeof (buf));
290
291 if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0)
292 {
293 CF_DEBUG_PRINT (stderr, "failed to recv on client\n");
294 return -3;
295 }
296 CF_Log_Write (LOG_SOCKET, "CLIENT", "recv {%s}\n", buf);
297 }
298
299 CF_Socket_Close (sock);
300
301 return 0;
302 /*------------------------------------------------------------*/
303}
304
305void test_socket (void)
306{
307 CF_Thread stid[THREAD_POOL];
308 CF_Thread ctid[THREAD_POOL];
309
310 int sock = 0;
311 int iter = 0;
312
313 /*------------------------------------------------------------*/
314 if (CF_Log_Initialize (1) < 0)
315 {
316 fprintf (stderr, "failed to init. log\n");
317 return ;
318 }
319
320 if (CF_Log_Open (LOG_SOCKET, "socket.txt", CF_LOG_BUFFER_DEFAULT) < 0)
321 CF_DEBUG_PRINT (stderr, "failed to open log\n");
322
323 CF_Log_Write (LOG_SOCKET, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n");
324
325 if (CF_Socket_Initialize () < 0)
326 {
327 CF_DEBUG_PRINT (stderr, "failed to initialize socket\n");
328 return ;
329 }
330 CF_Log_Write (LOG_SOCKET, "SOCKET", "socket initialized\n");
331
332 sock = CF_Socket_Server (PORT, 5);
333 if (sock < 0)
334 {
335 CF_DEBUG_PRINT (stderr, "failed to ready server %d\n", sock);
336 return ;
337 }
338 CF_Log_Write (LOG_SOCKET, "SOCKET", "socket ready\n");
339
340 for (iter = 0 ; iter < THREAD_POOL ; iter++)
341 {
342 if (CF_Thread_Create (&stid[iter], socket_echo_server, &sock) < 0)
343 {
344 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
345 return ;
346 }
347 CF_Log_Write (LOG_SOCKET, "SOCKET", "create server thread-%d\n", iter);
348 }
349
350 for (iter = 0 ; iter < THREAD_POOL ; iter++)
351 {
352 if (CF_Thread_Create (&ctid[iter], socket_echo_client, &sock) < 0)
353 {
354 CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
355 return ;
356 }
357 CF_Log_Write (LOG_SOCKET, "SOCKET", "create client thread-%d\n", iter);
358 }
359
360 for (iter = 0 ; iter < THREAD_POOL ; iter++)
361 {
362 CF_Thread_Join (&ctid[iter]);
363 CF_Thread_Release (&ctid[iter]);
364
365 CF_Thread_Join (&stid[iter]);
366 CF_Thread_Release (&stid[iter]);
367
368 CF_Log_Write (LOG_SOCKET, "SOCKET", "join server thread-%d\n", iter);
369 }
370
371 CF_Socket_Close (sock);
372
373 CF_Socket_Finalize ();
374
375 CF_Log_Close (LOG_SOCKET);
376
377 CF_Log_Finalize ();
378 /*------------------------------------------------------------*/
379}
380
381void test_codec (void)
382{
383 char data[] = "ONE OK ROCK - Nothing Helps";
384
385 char hex[512] = {0x00,};
386 unsigned char bin[512] = {0x00,};
387 size_t length = 0;
388
389 CF_DEBUG_PRINT (stderr, " = Convert binary to hex = \n");
390 CF_Codec_BinaryToHex ((unsigned char *)data, strlen (data), hex);
391 CF_DEBUG_PRINT (stderr, "data : %s\n", data);
392 CF_DEBUG_PRINT (stderr, "hex : %s\n", hex);
393 CF_DEBUG_PRINT_BIN (stdout, (unsigned char *) data, strlen (data), "data : %s\n", data);
394
395 CF_DEBUG_PRINT (stderr, " = Convert hex to binary = \n");
396 CF_Codec_HexToBinary (hex, bin, &length);
397 CF_DEBUG_PRINT (stderr, "bin : %s\n", bin);
398 CF_DEBUG_PRINT_BIN (stderr, bin, length, "bin : %s\n", bin);
399}
Note: See TracBrowser for help on using the repository browser.