FreeRDP
Loading...
Searching...
No Matches
TestWLogCallback.c
1#include <winpr/crt.h>
2#include <winpr/tchar.h>
3#include <winpr/path.h>
4#include <winpr/wlog.h>
5
6typedef struct
7{
8 UINT32 level;
9 char* msg;
10 char* channel;
11} test_t;
12
13static const char* function = nullptr;
14static const char* channels[] = { "com.test.channelA", "com.test.channelB" };
15
16static const test_t messages[] = { { WLOG_INFO, "this is a test", "com.test.channelA" },
17 { WLOG_INFO, "Just some info", "com.test.channelB" },
18 { WLOG_WARN, "this is a %dnd %s", "com.test.channelA" },
19 { WLOG_WARN, "we're warning a %dnd %s", "com.test.channelB" },
20 { WLOG_ERROR, "this is an error", "com.test.channelA" },
21 { WLOG_ERROR, "we've got an error", "com.test.channelB" },
22 { WLOG_TRACE, "this is a trace output", "com.test.channelA" },
23 { WLOG_TRACE, "leaving a trace behind", "com.test.channelB" } };
24
25static BOOL success = TRUE;
26static int pos = 0;
27
28static BOOL check(const wLogMessage* msg)
29{
30 BOOL rc = TRUE;
31 if (!msg)
32 rc = FALSE;
33 else if (strcmp(msg->FileName, __FILE__) != 0)
34 rc = FALSE;
35 else if (strcmp(msg->FunctionName, function) != 0)
36 rc = FALSE;
37 else if (strcmp(msg->PrefixString, messages[pos].channel) != 0)
38 rc = FALSE;
39 else if (msg->Level != messages[pos].level)
40 rc = FALSE;
41 else if (strcmp(msg->FormatString, messages[pos].msg) != 0)
42 rc = FALSE;
43 pos++;
44
45 if (!rc)
46 {
47 (void)fprintf(stderr, "Test failed!\n");
48 success = FALSE;
49 }
50 return rc;
51}
52
53static BOOL CallbackAppenderMessage(const wLogMessage* msg)
54{
55 check(msg);
56 return TRUE;
57}
58
59static BOOL CallbackAppenderData(const wLogMessage* msg)
60{
61 (void)fprintf(stdout, "%s\n", __func__);
62 return TRUE;
63}
64
65static BOOL CallbackAppenderImage(const wLogMessage* msg)
66{
67 (void)fprintf(stdout, "%s\n", __func__);
68 return TRUE;
69}
70
71static BOOL CallbackAppenderPackage(const wLogMessage* msg)
72{
73 (void)fprintf(stdout, "%s\n", __func__);
74 return TRUE;
75}
76
77int TestWLogCallback(int argc, char* argv[])
78{
79 wLog* root = nullptr;
80 wLog* logA = nullptr;
81 wLog* logB = nullptr;
82 wLogLayout* layout = nullptr;
83 wLogAppender* appender = nullptr;
84 wLogCallbacks callbacks;
85
86 WINPR_UNUSED(argc);
87 WINPR_UNUSED(argv);
88
89 function = __func__;
90
91 root = WLog_GetRoot();
92
93 if (!WLog_SetLogAppenderType(root, WLOG_APPENDER_CALLBACK))
94 return -1;
95
96 appender = WLog_GetLogAppender(root);
97 WINPR_ASSERT(appender);
98
99 callbacks.data = CallbackAppenderData;
100 callbacks.image = CallbackAppenderImage;
101 callbacks.message = CallbackAppenderMessage;
102 callbacks.package = CallbackAppenderPackage;
103
104 if (!WLog_ConfigureAppender(appender, "callbacks", (void*)&callbacks))
105 return -1;
106
107 layout = WLog_GetLogLayout(root);
108 if (!WLog_Layout_SetPrefixFormat(root, layout, "%mn"))
109 return -1;
110
111 if (!WLog_OpenAppender(root))
112 return -1;
113
114 logA = WLog_Get(channels[0]);
115 WINPR_ASSERT(logA);
116
117 logB = WLog_Get(channels[1]);
118 WINPR_ASSERT(logB);
119
120 if (!WLog_SetLogLevel(logA, WLOG_TRACE))
121 return -1;
122 if (!WLog_SetLogLevel(logB, WLOG_TRACE))
123 return -1;
124
125 WLog_Print(logA, messages[0].level, messages[0].msg);
126 WLog_Print(logB, messages[1].level, messages[1].msg);
127 WLog_Print(logA, messages[2].level, messages[2].msg, 2, "test");
128 WLog_Print(logB, messages[3].level, messages[3].msg, 2, "time");
129 WLog_Print(logA, messages[4].level, messages[4].msg);
130 WLog_Print(logB, messages[5].level, messages[5].msg);
131 WLog_Print(logA, messages[6].level, messages[6].msg);
132 WLog_Print(logB, messages[7].level, messages[7].msg);
133
134 if (!WLog_CloseAppender(root))
135 return -1;
136
137 return success ? 0 : -1;
138}