Commit d8e897c376bbf5b9f49a9031f5b3e9b0a812713f
1 parent
1fb326bc
optimized the class definition stuff, add instanceOf and isObject methods and ad…
…d assertion macros to use these checks
Showing
12 changed files
with
145 additions
and
81 deletions
1 | +2011-11-17 13:00:11 +0100 Georg Hopp | ||
2 | + | ||
3 | + * optimized the class definition stuff, add instanceOf and isObject methods and add assertion macros to use these checks (HEAD, master) | ||
4 | + | ||
5 | +2011-11-17 08:33:56 +0100 Georg Hopp | ||
6 | + | ||
7 | + * remove obsolete non conformant tests for crypt | ||
8 | + | ||
9 | +2011-11-17 08:31:24 +0100 Georg Hopp | ||
10 | + | ||
11 | + * always run checks under valgrind now. @TODO Let configure set the environment variable only if valgrind is installed. | ||
12 | + | ||
13 | +2011-11-17 08:29:25 +0100 Georg Hopp | ||
14 | + | ||
15 | + * add tests form crypt class @TODO: add assertion on length | ||
16 | + | ||
17 | +2011-11-17 08:27:29 +0100 Georg Hopp | ||
18 | + | ||
19 | + * add new assertion macros | ||
20 | + | ||
1 | 2011-11-16 19:32:44 +0100 Georg Hopp | 21 | 2011-11-16 19:32:44 +0100 Georg Hopp |
2 | 22 | ||
3 | - * 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) | 23 | + * 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) |
4 | 24 | ||
5 | 2011-11-16 18:14:51 +0100 Georg Hopp | 25 | 2011-11-16 18:14:51 +0100 Georg Hopp |
6 | 26 | ||
@@ -8,7 +28,7 @@ | @@ -8,7 +28,7 @@ | ||
8 | 28 | ||
9 | 2011-11-16 09:09:32 +0100 Georg Hopp | 29 | 2011-11-16 09:09:32 +0100 Georg Hopp |
10 | 30 | ||
11 | - * work on test <<framework>> (origin/master, origin/HEAD) | 31 | + * work on test <<framework>> |
12 | 32 | ||
13 | 2011-11-15 21:26:08 +0100 Georg Hopp | 33 | 2011-11-15 21:26:08 +0100 Georg Hopp |
14 | 34 |
@@ -22,6 +22,20 @@ | @@ -22,6 +22,20 @@ | ||
22 | #include <sys/types.h> | 22 | #include <sys/types.h> |
23 | #include <json/json.h> | 23 | #include <json/json.h> |
24 | 24 | ||
25 | +#define CCLASS_MAGIC 0xFEFE | ||
26 | + | ||
27 | +#define INIT_CCLASS(name, jsonConst, toJson) \ | ||
28 | + static const struct CCLASS _##name = { \ | ||
29 | + CCLASS_MAGIC, \ | ||
30 | + sizeof(struct name), \ | ||
31 | + (ctor)__construct, \ | ||
32 | + (jCtor)jsonConst, \ | ||
33 | + (dtor)__destruct, \ | ||
34 | + (jTo)toJson \ | ||
35 | + }; const struct CCLASS * const name = &_##name | ||
36 | + | ||
37 | + | ||
38 | + | ||
25 | typedef void (* ctor)(void *, va_list *); | 39 | typedef void (* ctor)(void *, va_list *); |
26 | typedef void (* dtor)(void *); | 40 | typedef void (* dtor)(void *); |
27 | typedef void (* jCtor)(void *, struct json_object *); | 41 | typedef void (* jCtor)(void *, struct json_object *); |
@@ -29,24 +43,22 @@ typedef struct json_object * (* jTo)(void *); | @@ -29,24 +43,22 @@ typedef struct json_object * (* jTo)(void *); | ||
29 | 43 | ||
30 | 44 | ||
31 | struct CCLASS { | 45 | struct CCLASS { |
46 | + const int magic; | ||
32 | size_t size; | 47 | size_t size; |
33 | void (* __construct)(void * _this, va_list * params); | 48 | void (* __construct)(void * _this, va_list * params); |
34 | void (* __jsonConst)(void * _this, struct json_object * json); | 49 | void (* __jsonConst)(void * _this, struct json_object * json); |
35 | void (* __destruct)(void * _this); | 50 | void (* __destruct)(void * _this); |
36 | struct json_object * (* __toJson)(void * _this); | 51 | struct json_object * (* __toJson)(void * _this); |
37 | }; | 52 | }; |
53 | +#define CCLASS_PTR_SIZE sizeof(struct CCLASS *) | ||
54 | +#define CCLASS_SIZE sizeof(struct CCLASS) | ||
38 | 55 | ||
39 | -void * | ||
40 | -new(const void * _class, ...); | ||
41 | - | ||
42 | -void * | ||
43 | -newFromJson(const void * _class, struct json_object * json); | ||
44 | - | ||
45 | -void | ||
46 | -delete(void * _object); | ||
47 | - | ||
48 | -struct json_object * | ||
49 | -toJson(void * _object); | 56 | +void * new(const void * _class, ...); |
57 | +void * newFromJson(const void * _class, struct json_object * json); | ||
58 | +void delete(void * _object); | ||
59 | +struct json_object * toJson(void * _object); | ||
60 | +int isObject(void * _object); | ||
61 | +int instanceOf(const void * _class, void * _object); | ||
50 | 62 | ||
51 | #endif//__CCLASS_H__ | 63 | #endif//__CCLASS_H__ |
52 | 64 |
@@ -82,4 +82,20 @@ toJson(void * _object) | @@ -82,4 +82,20 @@ toJson(void * _object) | ||
82 | return NULL; | 82 | return NULL; |
83 | } | 83 | } |
84 | 84 | ||
85 | +int | ||
86 | +isObject(void * _object) | ||
87 | +{ | ||
88 | + const struct CCLASS ** class = _object; | ||
89 | + | ||
90 | + return (_object && (*class) && CCLASS_MAGIC == (*class)->magic); | ||
91 | +} | ||
92 | + | ||
93 | +int | ||
94 | +instanceOf(const void * _class, void * _object) | ||
95 | +{ | ||
96 | + const struct CCLASS ** class = _object; | ||
97 | + | ||
98 | + return (_class == *class); | ||
99 | +} | ||
100 | + | ||
85 | // vim: set et ts=4 sw=4: | 101 | // vim: set et ts=4 sw=4: |
@@ -56,16 +56,7 @@ __destruct(struct CRYPT * _this) | @@ -56,16 +56,7 @@ __destruct(struct CRYPT * _this) | ||
56 | mcrypt_module_close(_this->mcrypt); | 56 | mcrypt_module_close(_this->mcrypt); |
57 | } | 57 | } |
58 | 58 | ||
59 | -static const | ||
60 | -struct CCLASS _crypt = { | ||
61 | - sizeof(struct CRYPT), | ||
62 | - (ctor)__construct, | ||
63 | - NULL, | ||
64 | - (dtor)__destruct, | ||
65 | - NULL | ||
66 | -}; | ||
67 | - | ||
68 | -const struct CCLASS * const CRYPT = &_crypt; | 59 | +INIT_CCLASS(CRYPT, NULL, NULL); |
69 | 60 | ||
70 | void * | 61 | void * |
71 | crypt_createIv(struct CRYPT * _this) | 62 | crypt_createIv(struct CRYPT * _this) |
@@ -132,15 +132,6 @@ __toJson(struct DYNTYPE * _this) | @@ -132,15 +132,6 @@ __toJson(struct DYNTYPE * _this) | ||
132 | return json; | 132 | return json; |
133 | } | 133 | } |
134 | 134 | ||
135 | -static const | ||
136 | -struct CCLASS _dyntype = { | ||
137 | - sizeof(struct DYNTYPE), | ||
138 | - (ctor)__construct, | ||
139 | - (jCtor)__jsonConst, | ||
140 | - (dtor)__destruct, | ||
141 | - (jTo)__toJson | ||
142 | -}; | ||
143 | - | ||
144 | -const struct CCLASS * const DYNTYPE = &_dyntype; | 135 | +INIT_CCLASS(DYNTYPE, __jsonConst, __toJson); |
145 | 136 | ||
146 | // vim: set et ts=4 sw=4: | 137 | // vim: set et ts=4 sw=4: |
@@ -84,16 +84,7 @@ __toJson(struct DYNTYPE_HASH * _this) | @@ -84,16 +84,7 @@ __toJson(struct DYNTYPE_HASH * _this) | ||
84 | return json; | 84 | return json; |
85 | } | 85 | } |
86 | 86 | ||
87 | -static const | ||
88 | -struct CCLASS _dyntype_hash = { | ||
89 | - sizeof(struct DYNTYPE_HASH), | ||
90 | - (ctor)__construct, | ||
91 | - (jCtor)__jsonConst, | ||
92 | - (dtor)__destruct, | ||
93 | - (jTo)__toJson | ||
94 | -}; | ||
95 | - | ||
96 | -const struct CCLASS * const DYNTYPE_HASH = &_dyntype_hash; | 87 | +INIT_CCLASS(DYNTYPE_HASH, __jsonConst, __toJson); |
97 | 88 | ||
98 | static | 89 | static |
99 | void | 90 | void |
@@ -69,16 +69,7 @@ __toJson(struct PACKET * _this) | @@ -69,16 +69,7 @@ __toJson(struct PACKET * _this) | ||
69 | return json; | 69 | return json; |
70 | } | 70 | } |
71 | 71 | ||
72 | -static const | ||
73 | -struct CCLASS _packet = { | ||
74 | - sizeof(struct PACKET), | ||
75 | - (ctor)__construct, | ||
76 | - (jCtor)__jsonConst, | ||
77 | - (dtor)__destruct, | ||
78 | - (jTo)__toJson | ||
79 | -}; | ||
80 | - | ||
81 | -const struct CCLASS * const PACKET = &_packet; | 72 | +INIT_CCLASS(PACKET, __jsonConst, __toJson); |
82 | 73 | ||
83 | struct DYNTYPE * | 74 | struct DYNTYPE * |
84 | packet_getHeader( | 75 | packet_getHeader( |
@@ -10,23 +10,28 @@ const char testname[] = "cclassTest"; | @@ -10,23 +10,28 @@ const char testname[] = "cclassTest"; | ||
10 | struct MOCK_CLASS * mock = NULL; | 10 | struct MOCK_CLASS * mock = NULL; |
11 | 11 | ||
12 | static | 12 | static |
13 | -void | 13 | +int |
14 | __setUp() | 14 | __setUp() |
15 | { | 15 | { |
16 | mock = NULL; | 16 | mock = NULL; |
17 | _reset(); | 17 | _reset(); |
18 | + | ||
19 | + return TEST_OK; | ||
18 | } | 20 | } |
19 | -void (* const setUp)() = __setUp; | 21 | +int (* const setUp)() = __setUp; |
20 | 22 | ||
21 | static | 23 | static |
22 | -void | 24 | +int |
23 | __tearDown() | 25 | __tearDown() |
24 | { | 26 | { |
25 | if (NULL != mock) { | 27 | if (NULL != mock) { |
28 | + ASSERT_OBJECT(mock); | ||
26 | delete(&mock); | 29 | delete(&mock); |
27 | } | 30 | } |
31 | + | ||
32 | + return TEST_OK; | ||
28 | } | 33 | } |
29 | -void (* const tearDown)() = __tearDown; | 34 | +int (* const tearDown)() = __tearDown; |
30 | 35 | ||
31 | static | 36 | static |
32 | int | 37 | int |
@@ -34,7 +39,7 @@ testNew(void) | @@ -34,7 +39,7 @@ testNew(void) | ||
34 | { | 39 | { |
35 | mock = new(MOCK_CLASS, 123); | 40 | mock = new(MOCK_CLASS, 123); |
36 | 41 | ||
37 | - ASSERT_NOT_NULL(mock); | 42 | + ASSERT_OBJECT_NOT_NULL(mock); |
38 | ASSERT_EQUAL(1, _called); | 43 | ASSERT_EQUAL(1, _called); |
39 | ASSERT_EQUAL(123, mock_class_getValue(mock)); | 44 | ASSERT_EQUAL(123, mock_class_getValue(mock)); |
40 | 45 | ||
@@ -50,7 +55,7 @@ testNewFromJson(void) | @@ -50,7 +55,7 @@ testNewFromJson(void) | ||
50 | mock = newFromJson(MOCK_CLASS, json); | 55 | mock = newFromJson(MOCK_CLASS, json); |
51 | json_object_put(json); | 56 | json_object_put(json); |
52 | 57 | ||
53 | - ASSERT_NOT_NULL(mock); | 58 | + ASSERT_OBJECT_NOT_NULL(mock); |
54 | ASSERT_EQUAL(1, _called); | 59 | ASSERT_EQUAL(1, _called); |
55 | ASSERT_EQUAL(123, mock_class_getValue(mock)); | 60 | ASSERT_EQUAL(123, mock_class_getValue(mock)); |
56 | 61 | ||
@@ -82,9 +87,11 @@ testToJson(void) | @@ -82,9 +87,11 @@ testToJson(void) | ||
82 | mock = new(MOCK_CLASS, 123); | 87 | mock = new(MOCK_CLASS, 123); |
83 | int value; | 88 | int value; |
84 | 89 | ||
90 | + _reset(); | ||
85 | json = toJson(mock); | 91 | json = toJson(mock); |
86 | 92 | ||
87 | ASSERT_NOT_NULL(json); | 93 | ASSERT_NOT_NULL(json); |
94 | + | ||
88 | value = json_object_get_int(json); | 95 | value = json_object_get_int(json); |
89 | json_object_put(json); | 96 | json_object_put(json); |
90 | 97 |
@@ -16,20 +16,29 @@ struct CRYPT * crypt = NULL; | @@ -16,20 +16,29 @@ struct CRYPT * crypt = NULL; | ||
16 | 16 | ||
17 | 17 | ||
18 | static | 18 | static |
19 | -void | 19 | +int |
20 | __setUp() | 20 | __setUp() |
21 | { | 21 | { |
22 | crypt = new(CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); | 22 | crypt = new(CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); |
23 | + | ||
24 | + ASSERT_INSTANCE_OF(CRYPT, crypt); | ||
25 | + | ||
26 | + return TEST_OK; | ||
23 | } | 27 | } |
24 | -void (* const setUp)() = __setUp; | 28 | +int (* const setUp)() = __setUp; |
25 | 29 | ||
26 | static | 30 | static |
27 | -void | 31 | +int |
28 | __tearDown() | 32 | __tearDown() |
29 | { | 33 | { |
30 | - delete(&crypt); | 34 | + if (NULL != crypt) { |
35 | + ASSERT_OBJECT(crypt); | ||
36 | + delete(&crypt); | ||
37 | + } | ||
38 | + | ||
39 | + return TEST_OK; | ||
31 | } | 40 | } |
32 | -void (* const tearDown)() = __tearDown; | 41 | +int (* const tearDown)() = __tearDown; |
33 | 42 | ||
34 | static | 43 | static |
35 | int | 44 | int |
@@ -48,16 +48,7 @@ __toJson(struct MOCK_CLASS * _this) | @@ -48,16 +48,7 @@ __toJson(struct MOCK_CLASS * _this) | ||
48 | return json; | 48 | return json; |
49 | } | 49 | } |
50 | 50 | ||
51 | -static const | ||
52 | -struct CCLASS _mock_class = { | ||
53 | - sizeof(struct MOCK_CLASS), | ||
54 | - (ctor)__construct, | ||
55 | - (jCtor)__jsonConst, | ||
56 | - (dtor)__destruct, | ||
57 | - (jTo)__toJson | ||
58 | -}; | ||
59 | - | ||
60 | -const struct CCLASS * const MOCK_CLASS = &_mock_class; | 51 | +INIT_CCLASS(MOCK_CLASS, __jsonConst, __toJson); |
61 | 52 | ||
62 | /** | 53 | /** |
63 | * ~~~ method implementations ~~~~~~~~ | 54 | * ~~~ method implementations ~~~~~~~~ |
@@ -4,6 +4,8 @@ | @@ -4,6 +4,8 @@ | ||
4 | #include <sys/types.h> | 4 | #include <sys/types.h> |
5 | 5 | ||
6 | #include "runtest.h" | 6 | #include "runtest.h" |
7 | +#include "token/cclass.h" | ||
8 | + | ||
7 | 9 | ||
8 | #define TEST_OK_CHAR '.' | 10 | #define TEST_OK_CHAR '.' |
9 | #define TEST_FAILED_CHAR 'F' | 11 | #define TEST_FAILED_CHAR 'F' |
@@ -16,6 +18,30 @@ const char results[3] = { | @@ -16,6 +18,30 @@ const char results[3] = { | ||
16 | TEST_ERROR_CHAR | 18 | TEST_ERROR_CHAR |
17 | }; | 19 | }; |
18 | 20 | ||
21 | +int | ||
22 | +isObjectNull(void * _object) | ||
23 | +{ | ||
24 | + const struct CCLASS ** class = _object; | ||
25 | + | ||
26 | + ASSERT_OBJECT(_object); | ||
27 | + ASSERT_MEM_NULL(_object + CCLASS_PTR_SIZE, (*class)->size - CCLASS_PTR_SIZE); | ||
28 | + | ||
29 | + return TEST_OK; | ||
30 | +} | ||
31 | + | ||
32 | +int | ||
33 | +isMemNull(void * _mem, size_t size) | ||
34 | +{ | ||
35 | + size_t index; | ||
36 | + | ||
37 | + ASSERT_NOT_NULL(_mem); | ||
38 | + | ||
39 | + for(index=0; index<size && 0 == ((char *)_mem)[index]; index++); | ||
40 | + | ||
41 | + ASSERT_EQUAL(size, index); | ||
42 | + | ||
43 | + return TEST_OK; | ||
44 | +} | ||
19 | 45 | ||
20 | int | 46 | int |
21 | main(int argc, char * argv[]) | 47 | main(int argc, char * argv[]) |
@@ -29,16 +55,24 @@ main(int argc, char * argv[]) | @@ -29,16 +55,24 @@ main(int argc, char * argv[]) | ||
29 | printf("running tests for %s\n", testname); | 55 | printf("running tests for %s\n", testname); |
30 | 56 | ||
31 | for (index=0; index<count; index++) { | 57 | for (index=0; index<count; index++) { |
32 | - int result; | 58 | + int result, _setUp = 0; // initialize setup to false |
33 | 59 | ||
34 | if (NULL != setUp) { | 60 | if (NULL != setUp) { |
35 | - setUp(); | 61 | + if (TEST_OK == (result = setUp())) { |
62 | + _setUp = 1; // we successfully set up the test | ||
63 | + } | ||
64 | + } | ||
65 | + | ||
66 | + if (_setUp) { | ||
67 | + result = tests[index](); | ||
36 | } | 68 | } |
37 | 69 | ||
38 | - result = tests[index](); | 70 | + if (_setUp && NULL != tearDown) { |
71 | + int _tearDown = tearDown(); | ||
39 | 72 | ||
40 | - if (NULL != setUp) { | ||
41 | - tearDown(); | 73 | + if ((! TEST_OK == _tearDown) && TEST_OK == result) { |
74 | + result = _tearDown; | ||
75 | + } | ||
42 | } | 76 | } |
43 | 77 | ||
44 | switch (result) { | 78 | switch (result) { |
@@ -19,10 +19,18 @@ enum RESULT_TYPES { | @@ -19,10 +19,18 @@ enum RESULT_TYPES { | ||
19 | if(0 != memcmp((val1), (val2), (size))) return TEST_FAILED | 19 | if(0 != memcmp((val1), (val2), (size))) return TEST_FAILED |
20 | #define ASSERT_MEM_NOT_EQUAL(val1,val2,size) \ | 20 | #define ASSERT_MEM_NOT_EQUAL(val1,val2,size) \ |
21 | if(0 == memcmp((val1), (val2), (size))) return TEST_FAILED | 21 | if(0 == memcmp((val1), (val2), (size))) return TEST_FAILED |
22 | +#define ASSERT_MEM_NULL(val, size) if (! isMemNull((val), (size))) return TEST_FAILED | ||
23 | +#define ASSERT_MEM_NOT_NULL(val, size) \ | ||
24 | + if (isMemNull((val), (size))) return TEST_FAILED | ||
22 | #define ASSERT_STRING_EQUAL(val1,val2) \ | 25 | #define ASSERT_STRING_EQUAL(val1,val2) \ |
23 | if(0 != strcmp((val1), (val2))) return TEST_FAILED | 26 | if(0 != strcmp((val1), (val2))) return TEST_FAILED |
24 | #define ASSERT_STRING_NOT_EQUAL(val1,val2) \ | 27 | #define ASSERT_STRING_NOT_EQUAL(val1,val2) \ |
25 | if(0 == strcmp((val1), (val2))) return TEST_FAILED | 28 | if(0 == strcmp((val1), (val2))) return TEST_FAILED |
29 | +#define ASSERT_OBJECT(val) if (! isObject((val))) return TEST_FAILED | ||
30 | +#define ASSERT_OBJECT_NULL(val) if (! isObjectNull((val))) return TEST_FAILED | ||
31 | +#define ASSERT_OBJECT_NOT_NULL(val) if (isObjectNull((val))) return TEST_FAILED | ||
32 | +#define ASSERT_INSTANCE_OF(class, val) \ | ||
33 | + if (! instanceOf((class), (val))) return TEST_FAILED | ||
26 | 34 | ||
27 | 35 | ||
28 | typedef int (* const testfunc)(void); | 36 | typedef int (* const testfunc)(void); |
@@ -32,8 +40,11 @@ extern const char testname[]; | @@ -32,8 +40,11 @@ extern const char testname[]; | ||
32 | extern testfunc tests[]; | 40 | extern testfunc tests[]; |
33 | extern const size_t count; | 41 | extern const size_t count; |
34 | 42 | ||
35 | -extern void (* const setUp)(); | ||
36 | -extern void (* const tearDown)(); | 43 | +extern int (* const setUp)(); |
44 | +extern int (* const tearDown)(); | ||
45 | + | ||
46 | +int isMemNull(void * _mem, size_t size); | ||
47 | +int isObjectNull(void * _object); | ||
37 | 48 | ||
38 | #endif//__RUNTEST_h__ | 49 | #endif//__RUNTEST_h__ |
39 | // vim: set et ts=4 sw=4: | 50 | // vim: set et ts=4 sw=4: |
Please
register
or
login
to post a comment