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 
25 static int GWENHYWFAR_CB test1(GWEN_TEST_MODULE *mod);
26 static int GWENHYWFAR_CB test2(GWEN_TEST_MODULE *mod);
27 static int GWENHYWFAR_CB test3(GWEN_TEST_MODULE *mod);
28 static int GWENHYWFAR_CB test4(GWEN_TEST_MODULE *mod);
29 static 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);
65  GWEN_Buffer_Rewind(buf);
66  tag=GWEN_Tag16_fromBuffer(buf, 0);
67  if (tag==NULL) {
68  DBG_ERROR(GWEN_LOGDOMAIN, "Error parsing tag from this:");
70  GWEN_Buffer_free(buf);
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);
76  GWEN_Buffer_free(buf);
77  return GWEN_ERROR_GENERIC;
78  }
79  GWEN_Buffer_free(buf);
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);
95  GWEN_Buffer_Rewind(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);
127  GWEN_Buffer_Rewind(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);
168  GWEN_Buffer_Rewind(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 
275  GWEN_Buffer_Rewind(buf);
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 DBG_ERROR(dbg_logger, format,...)
Definition: debug.h:97
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
int test5(int argc, char **argv)
int test3(int argc, char **argv)
Definition: libtest.m:204
int GWEN_Tag16_EndTagInBuffer(int startPos, GWEN_BUFFER *buf)
Definition: tag16.c:437
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define NULL
Definition: binreloc.c:300
void GWEN_Tag16_WriteUint64TagToBuffer(unsigned int tagType, uint64_t data, GWEN_BUFFER *buf)
Definition: tag16.c:215
#define GWEN_LOGDOMAIN
Definition: logger.h:32
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int test2(int argc, char **argv)
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
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
uint32_t GWEN_Tag16_GetTagDataAsUint32(const GWEN_TAG16 *tag, uint32_t defaultValue)
Definition: tag16.c:268
char * GWEN_Tag16_GetTagDataAsNewString(const GWEN_TAG16 *tag, const char *defaultValue)
Definition: tag16.c:302
struct GWEN_TEST_MODULE GWEN_TEST_MODULE
Definition: testmodule.h:65
struct GWEN_TAG16 GWEN_TAG16
Definition: tag16.h:35
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
Definition: text.c:1606
int GWEN_Tag16_AddTests(GWEN_TEST_MODULE *mod)
Definition: tag16-t.c:310
GWEN_TAG16 * GWEN_Tag16_fromBuffer(GWEN_BUFFER *mbuf, GWEN_UNUSED int isBerTlv)
Definition: tag16.c:143
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
uint64_t GWEN_Tag16_GetTagDataAsUint64(const GWEN_TAG16 *tag, uint64_t defaultValue)
Definition: tag16.c:277
int test1()
Definition: libtest.m:63
void GWEN_Tag16_WriteUint32TagToBuffer(unsigned int tagType, uint32_t data, GWEN_BUFFER *buf)
Definition: tag16.c:205
const GWEN_TAG16 * GWEN_Tag16_List_FindFirstByTagType(const GWEN_TAG16_LIST *tagList, unsigned int tagType)
Definition: tag16.c:311
void GWEN_Tag16_WriteStringTagToBuffer(unsigned int tagType, const char *s, GWEN_BUFFER *buf)
Definition: tag16.c:181
int test4(int argc, char **argv)
GWEN_TAG16_LIST * GWEN_Tag16_List_fromBuffer(const uint8_t *p, uint32_t l, int doCopy)
Definition: tag16.c:343
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
Definition: buffer.c:663
GWEN_TEST_MODULE * GWEN_Test_Module_AddModule(GWEN_TEST_MODULE *st, const char *tName, const char *tDescr)
Definition: testmodule.c:440
int GWEN_Tag16_StartTagInBuffer(unsigned int tagType, GWEN_BUFFER *buf)
Definition: tag16.c:405
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:992
void GWEN_Tag16_List_free(GWEN_TAG16_LIST *l)