29#include <gwenhywfar/testframework.h>
33#ifdef GWENHYWFAR_ENABLE_TESTCODE
36#include <gwenhywfar/mdigest.h>
47typedef struct TEST_TYPE TEST_TYPE;
65static TEST_TYPE *TestType_new(
const char *s,
int pos);
66static void TestType_Attach(TEST_TYPE *tt);
67static void TestType_free(TEST_TYPE *tt);
69static int TestType_CalcHash(TEST_TYPE *tt);
70static int TestType_TestHash(
const TEST_TYPE *tt);
83static TEST_TYPE *createTestType(
int num);
84static void dumpTestTypeList(TEST_TYPE_LIST *ttList);
117TEST_TYPE *TestType_new(
const char *s,
int pos)
125 tt->testStringPtr=strdup(s);
126 tt->testPosition=pos;
132void TestType_Attach(TEST_TYPE *tt)
135 assert(tt->_refCounter);
137 if (tt && tt->_refCounter) {
148void TestType_free(TEST_TYPE *tt)
150 if (tt && tt->_refCounter) {
152 if (tt->_refCounter==1) {
154 if (tt->testStringPtr)
155 free(tt->testStringPtr);
166int TestType_CalcHash(TEST_TYPE *tt)
168 if (tt->testStringPtr && *(tt->testStringPtr)) {
174 (
const uint8_t *)tt->testStringPtr, strlen(tt->testStringPtr),
175 tt->testHash,
sizeof(tt->testHash));
188int TestType_TestHash(
const TEST_TYPE *tt)
190 if (tt->testStringPtr && *(tt->testStringPtr)) {
197 (
const uint8_t *)tt->testStringPtr, strlen(tt->testStringPtr),
206 if (memcmp(hash, tt->testHash,
sizeof(hash))!=0) {
216TEST_TYPE *createTestType(
int num)
219 char testString[256];
222 snprintf(testString,
sizeof(testString),
"This is test string number %d", num);
223 tt=TestType_new(testString, num);
228 rv=TestType_CalcHash(tt);
259void dumpTestTypeList(TEST_TYPE_LIST *ttList)
263 tt=TestType_List_First(ttList);
265 fprintf(stderr,
"%5d: %3d: %s\n", tt->testPosition, tt->_refCounter, tt->testStringPtr);
266 tt=TestType_List_Next(tt);
288 if (pl->refCount!=1) {
294 if (pl->maxEntries!=128) {
300 if (pl->usedEntries!=0) {
306 if (pl->steps!=128) {
313 if (pl->entryList->refCounter!=1) {
319 if (pl->entryList->storedEntries!=128) {
326 for (i=0; i<128; i++) {
327 if (pl->entryList->entries[i]!=
NULL) {
353 for (i=0; i<1024; i++) {
357 tt=createTestType(i);
366 if (pl->maxEntries!=1024) {
372 if (pl->usedEntries!=1024) {
378 for (i=0; i<1024; i++) {
389 rv=TestType_TestHash(tt);
398 for (i=0; i<1024; i++) {
430 for (i=0; i<1000; i++) {
434 tt=createTestType(i);
451 if (!(plCopy->flags & GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE)) {
458 if (!(pl->flags & GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE)) {
465 if (plCopy->entryList != pl->entryList) {
472 if (pl->entryList->refCounter!=2) {
478 for (i=1000; i<1024; i++) {
482 tt=createTestType(i);
492 if (plCopy->flags & GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE) {
493 DBG_ERROR(
GWEN_LOGDOMAIN,
"Invalid object field: flags (should have cleared GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE)");
499 if (!(pl->flags & GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE)) {
501 "Invalid object field in old list: flags (should not have cleared GWEN_SIMPLEPTRLIST_FLAGS_COPYONWRITE)");
507 if (plCopy->entryList == pl->entryList) {
514 if (pl->entryList->refCounter!=1) {
520 if (plCopy->entryList->refCounter!=1) {
526 if (plCopy->maxEntries!=1024+128) {
532 if (plCopy->usedEntries!=1024) {
538 if (pl->maxEntries!=1024) {
544 if (pl->usedEntries!=1000) {
551 for (i=0; i<1024; i++) {
563 rv=TestType_TestHash(tt);
573 for (i=0; i<1024; i++) {
604 TEST_TYPE_LIST *ttList;
613 ttList=TestType_List_new();
615 for (i=0; i<1024; i++) {
619 tt=createTestType(i);
620 TestType_List_Add(tt, ttList);
634 tt=TestType_List_First(ttList);
636 if (tt->_refCounter!=2) {
638 TestType_List_free(ttList);
643 tt=TestType_List_Next(tt);
650 for (i=0; i<1024; i++) {
657 TestType_List_free(ttList);
662 rv=TestType_TestHash(tt);
665 TestType_List_free(ttList);
677 tt=TestType_List_First(ttList);
679 if (tt->_refCounter!=1) {
681 TestType_List_free(ttList);
685 tt=TestType_List_Next(tt);
692 TestType_List_free(ttList);
709 TEST_TYPE_LIST *ttList;
718 ttList=TestType_List_new();
719 for (i=0; i<1000; i++) {
723 tt=createTestType(i);
724 TestType_List_Add(tt, ttList);
743 "Invalid object field in list: flags (should have set GWEN_SIMPLEPTRLIST_FLAGS_ATTACHTOOBJECTS)");
751 "Invalid object field in list: flags (should have set GWEN_SIMPLEPTRLIST_FLAGS_DETACHFROMOBJECTS)");
758 for (i=1000; i<1024; i++) {
762 tt=createTestType(i);
763 TestType_List_Add(tt, ttList);
774 for (i=0; i<1024; i++) {
781 TestType_List_free(ttList);
787 rv=TestType_TestHash(tt);
790 TestType_List_free(ttList);
802 tt=TestType_List_First(ttList);
805 if (tt->_refCounter!=3) {
807 dumpTestTypeList(ttList);
808 TestType_List_free(ttList);
814 if (tt->_refCounter!=2) {
816 TestType_List_free(ttList);
822 tt=TestType_List_Next(tt);
836 tt=TestType_List_First(ttList);
839 if (tt->_refCounter!=2) {
841 TestType_List_free(ttList);
847 if (tt->_refCounter!=1) {
849 TestType_List_free(ttList);
855 tt=TestType_List_Next(tt);
869 tt=TestType_List_First(ttList);
871 if (tt->_refCounter!=1) {
873 TestType_List_free(ttList);
878 tt=TestType_List_Next(tt);
885 TestType_List_free(ttList);
902 TEST_TYPE_LIST *ttList;
911 ttList=TestType_List_new();
912 for (i=0; i<1024; i++) {
916 tt=createTestType(i);
917 TestType_List_Add(tt, ttList);
936 "Invalid object field in list: flags (should have set GWEN_SIMPLEPTRLIST_FLAGS_ATTACHTOOBJECTS)");
944 "Invalid object field in list: flags (should have set GWEN_SIMPLEPTRLIST_FLAGS_DETACHFROMOBJECTS)");
955 tt=createTestType(1024);
956 TestType_List_Add(tt, ttList);
967 for (i=0; i<1024; i++) {
974 TestType_List_free(ttList);
980 rv=TestType_TestHash(tt);
983 TestType_List_free(ttList);
995 tt=TestType_List_First(ttList);
997 if (cnt==1024 || cnt==100) {
998 if (tt->_refCounter!=2) {
1000 TestType_List_free(ttList);
1007 if (tt->_refCounter!=3) {
1009 TestType_List_free(ttList);
1016 tt=TestType_List_Next(tt);
1029 if (!(tt1 && tt2 && tt1!=tt2)) {
1031 TestType_List_free(ttList);
1037 if (tt1->_refCounter!=2) {
1039 TestType_List_free(ttList);
1048 TestType_List_free(ttList);
#define DBG_INFO(dbg_logger, format, args...)
#define DBG_ERROR(dbg_logger, format, args...)
const char * GWEN_Error_SimpleToString(int i)
Returns a (very) short string describing the given GWEN error code, or "Unknown error" for unknown co...
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_GENERIC
int test5(int argc, char **argv)
int test2(int argc, char **argv)
int test4(int argc, char **argv)
int test6(int argc, char **argv)
int test3(int argc, char **argv)
#define GWEN_LIST_FINI(t, element)
#define GWEN_LIST_FUNCTIONS(t, pr)
#define GWEN_LIST_FUNCTION_DEFS(t, pr)
#define GWEN_LIST_INIT(t, element)
#define GWEN_LIST_ELEMENT(t)
int GWEN_MDigest_Digest(GWEN_MDIGEST *md, const uint8_t *srcBuf, unsigned int srcLen, uint8_t *dstBuf, unsigned int dstLen)
void GWEN_MDigest_free(GWEN_MDIGEST *md)
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Rmd160_new(void)
struct GWEN_MDIGEST GWEN_MDIGEST
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
int GWEN_SimplePtrList_AddTests(GWEN_TEST_MODULE *mod)
GWEN_SIMPLEPTRLIST_ATTACHOBJECT_FN GWEN_SimplePtrList_SetAttachObjectFn(GWEN_SIMPLEPTRLIST *pl, GWEN_SIMPLEPTRLIST_ATTACHOBJECT_FN fn)
void GWEN_SimplePtrList_free(GWEN_SIMPLEPTRLIST *pl)
int64_t GWEN_SimplePtrList_AddPtr(GWEN_SIMPLEPTRLIST *pl, void *p)
GWEN_SIMPLEPTRLIST_FREEOBJECT_FN GWEN_SimplePtrList_SetFreeObjectFn(GWEN_SIMPLEPTRLIST *pl, GWEN_SIMPLEPTRLIST_FREEOBJECT_FN fn)
int GWEN_SimplePtrList_SetPtrAt(GWEN_SIMPLEPTRLIST *pl, uint64_t idx, void *p)
void GWEN_SimplePtrList_AddFlags(GWEN_SIMPLEPTRLIST *pl, uint32_t f)
GWEN_SIMPLEPTRLIST * GWEN_SimplePtrList_LazyCopy(GWEN_SIMPLEPTRLIST *oldList)
GWEN_SIMPLEPTRLIST * GWEN_SimplePtrList_new(uint64_t startEntries, uint64_t steps)
void * GWEN_SimplePtrList_GetPtrAt(const GWEN_SIMPLEPTRLIST *pl, uint64_t idx)
struct GWEN_SIMPLEPTRLIST GWEN_SIMPLEPTRLIST
#define GWEN_SIMPLEPTRLIST_FLAGS_ATTACHTOOBJECTS
#define GWEN_SIMPLEPTRLIST_FLAGS_DETACHFROMOBJECTS
GWEN_TEST_MODULE * GWEN_Test_Module_AddModule(GWEN_TEST_MODULE *st, const char *tName, const char *tDescr)
GWEN_TEST_MODULE * GWEN_Test_Module_AddTest(GWEN_TEST_MODULE *st, const char *tName, GWEN_TEST_MODULE_TEST_FN fn, const char *tDescr)
struct GWEN_TEST_MODULE GWEN_TEST_MODULE