From d8e897c376bbf5b9f49a9031f5b3e9b0a812713f Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Thu, 17 Nov 2011 13:00:11 +0100 Subject: [PATCH] optimized the class definition stuff, add instanceOf and isObject methods and add assertion macros to use these checks --- ChangeLog | 24 +++++++++++++++++++++-- include/token/cclass.h | 34 +++++++++++++++++++++----------- src/cclass.c | 16 +++++++++++++++ src/crypt.c | 11 +---------- src/dyntype.c | 11 +---------- src/dyntype/hash.c | 11 +---------- src/packet.c | 11 +---------- tests/cclassTest.c | 19 ++++++++++++------ tests/cryptTest.c | 19 +++++++++++++----- tests/mock/class.c | 11 +---------- tests/runtest.c | 44 +++++++++++++++++++++++++++++++++++++----- tests/runtest.h | 15 ++++++++++++-- 12 files changed, 145 insertions(+), 81 deletions(-) diff --git a/ChangeLog b/ChangeLog index 38a977d..c66a0c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,26 @@ +2011-11-17 13:00:11 +0100 Georg Hopp + + * optimized the class definition stuff, add instanceOf and isObject methods and add assertion macros to use these checks (HEAD, master) + +2011-11-17 08:33:56 +0100 Georg Hopp + + * remove obsolete non conformant tests for crypt + +2011-11-17 08:31:24 +0100 Georg Hopp + + * always run checks under valgrind now. @TODO Let configure set the environment variable only if valgrind is installed. + +2011-11-17 08:29:25 +0100 Georg Hopp + + * add tests form crypt class @TODO: add assertion on length + +2011-11-17 08:27:29 +0100 Georg Hopp + + * add new assertion macros + 2011-11-16 19:32:44 +0100 Georg Hopp - * i had to remove the cool plugin stuff for my tests, as i found no working way to use this with autotools. Now all works. (HEAD, master) + * i had to remove the cool plugin stuff for my tests, as i found no working way to use this with autotools. Now all works. (origin/master, origin/HEAD) 2011-11-16 18:14:51 +0100 Georg Hopp @@ -8,7 +28,7 @@ 2011-11-16 09:09:32 +0100 Georg Hopp - * work on test <> (origin/master, origin/HEAD) + * work on test <> 2011-11-15 21:26:08 +0100 Georg Hopp diff --git a/include/token/cclass.h b/include/token/cclass.h index 660ed01..db386ed 100644 --- a/include/token/cclass.h +++ b/include/token/cclass.h @@ -22,6 +22,20 @@ #include #include +#define CCLASS_MAGIC 0xFEFE + +#define INIT_CCLASS(name, jsonConst, toJson) \ + static const struct CCLASS _##name = { \ + CCLASS_MAGIC, \ + sizeof(struct name), \ + (ctor)__construct, \ + (jCtor)jsonConst, \ + (dtor)__destruct, \ + (jTo)toJson \ + }; const struct CCLASS * const name = &_##name + + + typedef void (* ctor)(void *, va_list *); typedef void (* dtor)(void *); typedef void (* jCtor)(void *, struct json_object *); @@ -29,24 +43,22 @@ typedef struct json_object * (* jTo)(void *); struct CCLASS { + const int magic; size_t size; void (* __construct)(void * _this, va_list * params); void (* __jsonConst)(void * _this, struct json_object * json); void (* __destruct)(void * _this); struct json_object * (* __toJson)(void * _this); }; +#define CCLASS_PTR_SIZE sizeof(struct CCLASS *) +#define CCLASS_SIZE sizeof(struct CCLASS) -void * -new(const void * _class, ...); - -void * -newFromJson(const void * _class, struct json_object * json); - -void -delete(void * _object); - -struct json_object * -toJson(void * _object); +void * new(const void * _class, ...); +void * newFromJson(const void * _class, struct json_object * json); +void delete(void * _object); +struct json_object * toJson(void * _object); +int isObject(void * _object); +int instanceOf(const void * _class, void * _object); #endif//__CCLASS_H__ diff --git a/src/cclass.c b/src/cclass.c index c7201c2..12e53fb 100644 --- a/src/cclass.c +++ b/src/cclass.c @@ -82,4 +82,20 @@ toJson(void * _object) return NULL; } +int +isObject(void * _object) +{ + const struct CCLASS ** class = _object; + + return (_object && (*class) && CCLASS_MAGIC == (*class)->magic); +} + +int +instanceOf(const void * _class, void * _object) +{ + const struct CCLASS ** class = _object; + + return (_class == *class); +} + // vim: set et ts=4 sw=4: diff --git a/src/crypt.c b/src/crypt.c index 877e5a1..baf3a83 100644 --- a/src/crypt.c +++ b/src/crypt.c @@ -56,16 +56,7 @@ __destruct(struct CRYPT * _this) mcrypt_module_close(_this->mcrypt); } -static const -struct CCLASS _crypt = { - sizeof(struct CRYPT), - (ctor)__construct, - NULL, - (dtor)__destruct, - NULL -}; - -const struct CCLASS * const CRYPT = &_crypt; +INIT_CCLASS(CRYPT, NULL, NULL); void * crypt_createIv(struct CRYPT * _this) diff --git a/src/dyntype.c b/src/dyntype.c index aaa0581..91a1ecd 100644 --- a/src/dyntype.c +++ b/src/dyntype.c @@ -132,15 +132,6 @@ __toJson(struct DYNTYPE * _this) return json; } -static const -struct CCLASS _dyntype = { - sizeof(struct DYNTYPE), - (ctor)__construct, - (jCtor)__jsonConst, - (dtor)__destruct, - (jTo)__toJson -}; - -const struct CCLASS * const DYNTYPE = &_dyntype; +INIT_CCLASS(DYNTYPE, __jsonConst, __toJson); // vim: set et ts=4 sw=4: diff --git a/src/dyntype/hash.c b/src/dyntype/hash.c index 5ca672d..faba9ed 100644 --- a/src/dyntype/hash.c +++ b/src/dyntype/hash.c @@ -84,16 +84,7 @@ __toJson(struct DYNTYPE_HASH * _this) return json; } -static const -struct CCLASS _dyntype_hash = { - sizeof(struct DYNTYPE_HASH), - (ctor)__construct, - (jCtor)__jsonConst, - (dtor)__destruct, - (jTo)__toJson -}; - -const struct CCLASS * const DYNTYPE_HASH = &_dyntype_hash; +INIT_CCLASS(DYNTYPE_HASH, __jsonConst, __toJson); static void diff --git a/src/packet.c b/src/packet.c index 85e8a13..84148ab 100644 --- a/src/packet.c +++ b/src/packet.c @@ -69,16 +69,7 @@ __toJson(struct PACKET * _this) return json; } -static const -struct CCLASS _packet = { - sizeof(struct PACKET), - (ctor)__construct, - (jCtor)__jsonConst, - (dtor)__destruct, - (jTo)__toJson -}; - -const struct CCLASS * const PACKET = &_packet; +INIT_CCLASS(PACKET, __jsonConst, __toJson); struct DYNTYPE * packet_getHeader( diff --git a/tests/cclassTest.c b/tests/cclassTest.c index 1b88f9c..be24b4f 100644 --- a/tests/cclassTest.c +++ b/tests/cclassTest.c @@ -10,23 +10,28 @@ const char testname[] = "cclassTest"; struct MOCK_CLASS * mock = NULL; static -void +int __setUp() { mock = NULL; _reset(); + + return TEST_OK; } -void (* const setUp)() = __setUp; +int (* const setUp)() = __setUp; static -void +int __tearDown() { if (NULL != mock) { + ASSERT_OBJECT(mock); delete(&mock); } + + return TEST_OK; } -void (* const tearDown)() = __tearDown; +int (* const tearDown)() = __tearDown; static int @@ -34,7 +39,7 @@ testNew(void) { mock = new(MOCK_CLASS, 123); - ASSERT_NOT_NULL(mock); + ASSERT_OBJECT_NOT_NULL(mock); ASSERT_EQUAL(1, _called); ASSERT_EQUAL(123, mock_class_getValue(mock)); @@ -50,7 +55,7 @@ testNewFromJson(void) mock = newFromJson(MOCK_CLASS, json); json_object_put(json); - ASSERT_NOT_NULL(mock); + ASSERT_OBJECT_NOT_NULL(mock); ASSERT_EQUAL(1, _called); ASSERT_EQUAL(123, mock_class_getValue(mock)); @@ -82,9 +87,11 @@ testToJson(void) mock = new(MOCK_CLASS, 123); int value; + _reset(); json = toJson(mock); ASSERT_NOT_NULL(json); + value = json_object_get_int(json); json_object_put(json); diff --git a/tests/cryptTest.c b/tests/cryptTest.c index 0cd2be6..4c5e5f7 100644 --- a/tests/cryptTest.c +++ b/tests/cryptTest.c @@ -16,20 +16,29 @@ struct CRYPT * crypt = NULL; static -void +int __setUp() { crypt = new(CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); + + ASSERT_INSTANCE_OF(CRYPT, crypt); + + return TEST_OK; } -void (* const setUp)() = __setUp; +int (* const setUp)() = __setUp; static -void +int __tearDown() { - delete(&crypt); + if (NULL != crypt) { + ASSERT_OBJECT(crypt); + delete(&crypt); + } + + return TEST_OK; } -void (* const tearDown)() = __tearDown; +int (* const tearDown)() = __tearDown; static int diff --git a/tests/mock/class.c b/tests/mock/class.c index 8b5c4e4..04c6388 100644 --- a/tests/mock/class.c +++ b/tests/mock/class.c @@ -48,16 +48,7 @@ __toJson(struct MOCK_CLASS * _this) return json; } -static const -struct CCLASS _mock_class = { - sizeof(struct MOCK_CLASS), - (ctor)__construct, - (jCtor)__jsonConst, - (dtor)__destruct, - (jTo)__toJson -}; - -const struct CCLASS * const MOCK_CLASS = &_mock_class; +INIT_CCLASS(MOCK_CLASS, __jsonConst, __toJson); /** * ~~~ method implementations ~~~~~~~~ diff --git a/tests/runtest.c b/tests/runtest.c index 31afc60..92590ae 100644 --- a/tests/runtest.c +++ b/tests/runtest.c @@ -4,6 +4,8 @@ #include #include "runtest.h" +#include "token/cclass.h" + #define TEST_OK_CHAR '.' #define TEST_FAILED_CHAR 'F' @@ -16,6 +18,30 @@ const char results[3] = { TEST_ERROR_CHAR }; +int +isObjectNull(void * _object) +{ + const struct CCLASS ** class = _object; + + ASSERT_OBJECT(_object); + ASSERT_MEM_NULL(_object + CCLASS_PTR_SIZE, (*class)->size - CCLASS_PTR_SIZE); + + return TEST_OK; +} + +int +isMemNull(void * _mem, size_t size) +{ + size_t index; + + ASSERT_NOT_NULL(_mem); + + for(index=0; index