gwenhywfar 5.14.1
tag16-t.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Sun Jun 13 2004
3 copyright : (C) 2023 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10
11#include <gwenhywfar/testframework.h>
12#include <gwenhywfar/text.h>
13
14#include "tag16-t.h"
15
16
17#ifdef GWENHYWFAR_ENABLE_TESTCODE
18
19
20/* ------------------------------------------------------------------------------------------------
21 * forward declarations
22 * ------------------------------------------------------------------------------------------------
23 */
24
25static int GWENHYWFAR_CB test1(GWEN_TEST_MODULE *mod);
26static int GWENHYWFAR_CB test2(GWEN_TEST_MODULE *mod);
27static int GWENHYWFAR_CB test3(GWEN_TEST_MODULE *mod);
28static int GWENHYWFAR_CB test4(GWEN_TEST_MODULE *mod);
29static int GWENHYWFAR_CB test5(GWEN_TEST_MODULE *mod);
30
31
32
33/* ------------------------------------------------------------------------------------------------
34 * implementations
35 * ------------------------------------------------------------------------------------------------
36 */
37
38
40{
41 GWEN_TEST_MODULE *newMod;
42
43 newMod=GWEN_Test_Module_AddModule(mod, "GWEN_Tag16", NULL);
44
45 GWEN_Test_Module_AddTest(newMod, "add/read uint32_t tag", test1, NULL);
46 GWEN_Test_Module_AddTest(newMod, "add/read uint64_t tag", test2, NULL);
47 GWEN_Test_Module_AddTest(newMod, "add/read string tag", test3, NULL);
48 GWEN_Test_Module_AddTest(newMod, "write/read tag lists", test4, NULL);
49 GWEN_Test_Module_AddTest(newMod, "Start/endTagInBuffer", test5, NULL);
50
51 return 0;
52}
53
54
55
57{
58 GWEN_BUFFER *buf;
59 GWEN_TAG16 *tag;
60 uint32_t value1=0x01234567;
61 uint32_t value2;
62
63 buf=GWEN_Buffer_new(0, 256, 0, 1);
64 GWEN_Tag16_WriteUint32TagToBuffer(0xaa, value1, buf);
66 tag=GWEN_Tag16_fromBuffer(buf, 0);
67 if (tag==NULL) {
68 DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag from this:");
71 return GWEN_ERROR_GENERIC;
72 }
73 value2=GWEN_Tag16_GetTagDataAsUint32(tag, 0);
74 if (value2!=value1) {
75 DBG_ERROR(GWEN_LOGDOMAIN, "value read (%08x) != value written (%08x)", value2, value1);
77 return GWEN_ERROR_GENERIC;
78 }
80
81 return 0;
82}
83
84
85
87{
88 GWEN_BUFFER *buf;
89 GWEN_TAG16 *tag;
90 uint64_t value1=0x0123456789abcdefLL;
91 uint64_t value2;
92
93 buf=GWEN_Buffer_new(0, 256, 0, 1);
94 GWEN_Tag16_WriteUint64TagToBuffer(0xbb, value1, buf);
96 tag=GWEN_Tag16_fromBuffer(buf, 0);
97 if (tag==NULL) {
98 DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag from this:");
100 GWEN_Buffer_free(buf);
101 return GWEN_ERROR_GENERIC;
102 }
103 value2=GWEN_Tag16_GetTagDataAsUint64(tag, 0);
104 if (value2!=value1) {
105 DBG_ERROR(GWEN_LOGDOMAIN, "value read (%016lx) != value written (%016lx)",
106 (unsigned long int) value2, (unsigned long int) value1);
107 GWEN_Buffer_free(buf);
108 return GWEN_ERROR_GENERIC;
109 }
110 GWEN_Buffer_free(buf);
111
112 return 0;
113}
114
115
116
118{
119 GWEN_BUFFER *buf;
120 GWEN_TAG16 *tag;
121 const char *value1="This is a test";
122 char *value2;
123
124 buf=GWEN_Buffer_new(0, 256, 0, 1);
125
126 GWEN_Tag16_WriteStringTagToBuffer(0xcc, value1, buf);
128 tag=GWEN_Tag16_fromBuffer(buf, 0);
129 if (tag==NULL) {
130 DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag from this:");
132 GWEN_Buffer_free(buf);
133 return GWEN_ERROR_GENERIC;
134 }
136 if (value2==NULL) {
137 DBG_ERROR(GWEN_LOGDOMAIN, "No value read back");
138 GWEN_Buffer_free(buf);
139 return GWEN_ERROR_GENERIC;
140 }
141 if (strcmp(value1, value2)!=0) {
142 DBG_ERROR(GWEN_LOGDOMAIN, "value read (\"%s\") != value written (\"%s\")", value2, value1);
143 free(value2);
144 GWEN_Buffer_free(buf);
145 return GWEN_ERROR_GENERIC;
146 }
147 free(value2);
148 GWEN_Buffer_free(buf);
149 return 0;
150}
151
152
153
155{
156 GWEN_BUFFER *buf;
157 GWEN_TAG16_LIST *tagList;
158 const GWEN_TAG16 *tag;
159 const char *value1="This is a test";
160 uint32_t value2=0x12345678;
161 uint64_t value3=0x0123456789abcdefLL;
162
163 buf=GWEN_Buffer_new(0, 256, 0, 1);
164
165 GWEN_Tag16_WriteStringTagToBuffer(0xcc, value1, buf);
166 GWEN_Tag16_WriteUint32TagToBuffer(0xaa, value2, buf);
167 GWEN_Tag16_WriteUint64TagToBuffer(0xbb, value3, buf);
169
170 tagList=GWEN_Tag16_List_fromBuffer((const uint8_t*) GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf), 0);
171 if (tagList==NULL) {
172 DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag list from this:");
174 GWEN_Buffer_free(buf);
175 return GWEN_ERROR_GENERIC;
176 }
177
178 /* test string_t */
179 tag=GWEN_Tag16_List_FindFirstByTagType(tagList, 0xcc);
180 if (tag==NULL) {
181 DBG_ERROR(GWEN_LOGDOMAIN, "Tag for string test not found");
182 GWEN_Tag16_List_free(tagList);
183 GWEN_Buffer_free(buf);
184 return GWEN_ERROR_GENERIC;
185 }
186 else {
187 char *value;
188
190 if (value==NULL) {
191 DBG_ERROR(GWEN_LOGDOMAIN, "No string value read back");
192 GWEN_Tag16_List_free(tagList);
193 GWEN_Buffer_free(buf);
194 return GWEN_ERROR_GENERIC;
195 }
196 if (strcmp(value1, value)!=0) {
197 DBG_ERROR(GWEN_LOGDOMAIN, "value read (\"%s\") != value written (\"%s\")", value, value1);
198 free(value);
199 GWEN_Tag16_List_free(tagList);
200 GWEN_Buffer_free(buf);
201 return GWEN_ERROR_GENERIC;
202 }
203 free(value);
204 }
205
206 /* test uint32_t */
207 tag=GWEN_Tag16_List_FindFirstByTagType(tagList, 0xaa);
208 if (tag==NULL) {
209 DBG_ERROR(GWEN_LOGDOMAIN, "Tag for uint32_t test not found");
210 GWEN_Tag16_List_free(tagList);
211 GWEN_Buffer_free(buf);
212 return GWEN_ERROR_GENERIC;
213 }
214 else {
215 uint32_t value;
216
217 value=GWEN_Tag16_GetTagDataAsUint32(tag, 0);
218 if (value!=value2) {
219 DBG_ERROR(GWEN_LOGDOMAIN, "value read (%016lx) != value written (%016lx)",
220 (unsigned long int) value, (unsigned long int) value2);
221 GWEN_Tag16_List_free(tagList);
222 GWEN_Buffer_free(buf);
223 return GWEN_ERROR_GENERIC;
224 }
225 }
226
227 /* test uint64_t */
228 tag=GWEN_Tag16_List_FindFirstByTagType(tagList, 0xbb);
229 if (tag==NULL) {
230 DBG_ERROR(GWEN_LOGDOMAIN, "Tag for uint64_t test not found");
231 GWEN_Tag16_List_free(tagList);
232 GWEN_Buffer_free(buf);
233 return GWEN_ERROR_GENERIC;
234 }
235 else {
236 uint64_t value;
237
238 value=GWEN_Tag16_GetTagDataAsUint64(tag, 0);
239 if (value!=value3) {
240 DBG_ERROR(GWEN_LOGDOMAIN, "value read (%016lx) != value written (%016lx)",
241 (unsigned long int) value, (unsigned long int) value3);
242 GWEN_Tag16_List_free(tagList);
243 GWEN_Buffer_free(buf);
244 return GWEN_ERROR_GENERIC;
245 }
246 }
247
248 GWEN_Tag16_List_free(tagList);
249 GWEN_Buffer_free(buf);
250
251 return 0;
252}
253
254
255
257{
258 GWEN_BUFFER *buf;
259 GWEN_TAG16 *tag;
260 const char *value1="This is a test";
261 char *value2;
262 int startPos;
263 int rv;
264
265 buf=GWEN_Buffer_new(0, 256, 0, 1);
266
267 startPos=GWEN_Tag16_StartTagInBuffer(0xcc, buf);
268 GWEN_Buffer_AppendString(buf, value1);
269 rv=GWEN_Tag16_EndTagInBuffer(startPos, buf);
270 if (rv<0) {
271 DBG_ERROR(GWEN_LOGDOMAIN, "Error ginishing tag (%d)", rv);
272 return rv;
273 }
274
276 tag=GWEN_Tag16_fromBuffer(buf, 0);
277 if (tag==NULL) {
278 DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag from this:");
280 GWEN_Buffer_free(buf);
281 return GWEN_ERROR_GENERIC;
282 }
284 if (value2==NULL) {
285 DBG_ERROR(GWEN_LOGDOMAIN, "No value read back");
286 GWEN_Buffer_free(buf);
287 return GWEN_ERROR_GENERIC;
288 }
289 if (strcmp(value1, value2)!=0) {
290 DBG_ERROR(GWEN_LOGDOMAIN, "value read (\"%s\") != value written (\"%s\")", value2, value1);
291 free(value2);
292 GWEN_Buffer_free(buf);
293 return GWEN_ERROR_GENERIC;
294 }
295 free(value2);
296 GWEN_Buffer_free(buf);
297 return 0;
298}
299
300
301
302
303
304
305
306
307#else
308
309
311{
312 DBG_ERROR(GWEN_LOGDOMAIN, "Gwenhywfar was compiled without test code enabled.");
313 return GWEN_ERROR_GENERIC;
314}
315
316
317#endif
318
319
320
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
Definition buffer.c:663
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_GENERIC
Definition error.h:62
int test5(int argc, char **argv)
int test2(int argc, char **argv)
int test4(int argc, char **argv)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_UNUSED
#define GWENHYWFAR_CB
int test3(int argc, char **argv)
Definition libtest.m:204
int test1()
Definition libtest.m:63
void GWEN_Tag16_List_free(GWEN_TAG16_LIST *l)
#define GWEN_LOGDOMAIN
Definition logger.h:32
@ GWEN_LoggerLevel_Error
Definition logger.h:65
int GWEN_Tag16_AddTests(GWEN_TEST_MODULE *mod)
Definition tag16-t.c:310
void GWEN_Tag16_WriteStringTagToBuffer(unsigned int tagType, const char *s, GWEN_BUFFER *buf)
Definition tag16.c:181
uint64_t GWEN_Tag16_GetTagDataAsUint64(const GWEN_TAG16 *tag, uint64_t defaultValue)
Definition tag16.c:277
GWEN_TAG16 * GWEN_Tag16_fromBuffer(GWEN_BUFFER *mbuf, GWEN_UNUSED int isBerTlv)
Definition tag16.c:143
char * GWEN_Tag16_GetTagDataAsNewString(const GWEN_TAG16 *tag, const char *defaultValue)
Definition tag16.c:302
int GWEN_Tag16_StartTagInBuffer(unsigned int tagType, GWEN_BUFFER *buf)
Definition tag16.c:405
void GWEN_Tag16_WriteUint32TagToBuffer(unsigned int tagType, uint32_t data, GWEN_BUFFER *buf)
Definition tag16.c:205
uint32_t GWEN_Tag16_GetTagDataAsUint32(const GWEN_TAG16 *tag, uint32_t defaultValue)
Definition tag16.c:268
GWEN_TAG16_LIST * GWEN_Tag16_List_fromBuffer(const uint8_t *p, uint32_t l, int doCopy)
Definition tag16.c:343
int GWEN_Tag16_EndTagInBuffer(int startPos, GWEN_BUFFER *buf)
Definition tag16.c:437
const GWEN_TAG16 * GWEN_Tag16_List_FindFirstByTagType(const GWEN_TAG16_LIST *tagList, unsigned int tagType)
Definition tag16.c:311
void GWEN_Tag16_WriteUint64TagToBuffer(unsigned int tagType, uint64_t data, GWEN_BUFFER *buf)
Definition tag16.c:215
struct GWEN_TAG16 GWEN_TAG16
Definition tag16.h:35
GWEN_TEST_MODULE * GWEN_Test_Module_AddModule(GWEN_TEST_MODULE *st, const char *tName, const char *tDescr)
Definition testmodule.c:440
GWEN_TEST_MODULE * GWEN_Test_Module_AddTest(GWEN_TEST_MODULE *st, const char *tName, GWEN_TEST_MODULE_TEST_FN fn, const char *tDescr)
Definition testmodule.c:424
struct GWEN_TEST_MODULE GWEN_TEST_MODULE
Definition testmodule.h:65
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
Definition text.c:1606