1 /* test_ctx.c
2 ** libstrophe XMPP client library -- test routines for the library run-time
3 *context
4 **
5 ** Copyright (C) 2005-2009 Collecta, Inc.
6 **
7 **  This software is provided AS-IS with no warranty, either express
8 **  or implied.
9 **
10 **  This program is dual licensed under the MIT and GPLv3 licenses.
11 */
12 
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 
17 #include "strophe.h"
18 #include "common.h"
19 
20 static int log_called = 0;
21 static int mem_alloc_called = 0;
22 static int mem_free_called = 0;
23 static int mem_realloc_called = 0;
24 
my_alloc(size_t size,void * userdata)25 void *my_alloc(size_t size, void *userdata)
26 {
27     (void)userdata;
28 
29     mem_alloc_called++;
30     return malloc(size);
31 }
32 
my_free(void * p,void * userdata)33 void my_free(void *p, void *userdata)
34 {
35     (void)userdata;
36 
37     mem_free_called++;
38     return free(p);
39 }
40 
my_realloc(void * p,size_t size,void * userdata)41 void *my_realloc(void *p, size_t size, void *userdata)
42 {
43     (void)userdata;
44 
45     mem_realloc_called++;
46     return realloc(p, size);
47 }
48 
my_logger(void * userdata,xmpp_log_level_t level,const char * area,const char * msg)49 void my_logger(void *userdata,
50                xmpp_log_level_t level,
51                const char *area,
52                const char *msg)
53 {
54     if (strcmp((char *)userdata, "asdf") == 0 && level == XMPP_LEVEL_DEBUG &&
55         strcmp(area, "test") == 0 && strcmp(msg, "hello") == 0)
56         log_called++;
57 }
58 
main()59 int main()
60 {
61     xmpp_ctx_t *ctx;
62     xmpp_mem_t mymem;
63     xmpp_log_t mylog;
64     char my_str[5] = "asdf";
65     void *testptr1, *testptr2;
66 
67     ctx = xmpp_ctx_new(NULL, NULL);
68     if (ctx == NULL)
69         return 1;
70 
71     /* destroy context */
72     xmpp_ctx_free(ctx);
73 
74     /* setup our memory handler */
75     mymem.alloc = my_alloc;
76     mymem.free = my_free;
77     mymem.realloc = my_realloc;
78 
79     /* setup our logger */
80     mylog.handler = my_logger;
81     mylog.userdata = my_str;
82 
83     ctx = xmpp_ctx_new(&mymem, &mylog);
84     xmpp_debug(ctx, "test", "hello");
85 
86     testptr1 = xmpp_alloc(ctx, 1024);
87     if (testptr1 == NULL) {
88         xmpp_ctx_free(ctx);
89         return 1;
90     }
91 
92     testptr2 = xmpp_realloc(ctx, testptr1, 2048);
93     if (testptr2 == NULL) {
94         xmpp_free(ctx, testptr1);
95         xmpp_ctx_free(ctx);
96         return 1;
97     }
98 
99     xmpp_free(ctx, testptr2);
100 
101     xmpp_ctx_free(ctx);
102 
103     /* check for test failure */
104     if (!(log_called && mem_alloc_called && mem_realloc_called &&
105           mem_free_called))
106         return 1;
107     if (mem_alloc_called != mem_free_called)
108         return 1;
109 
110     return 0;
111 }
112