1 /** @brief Unit-test for DRD's vector clock implementation. */
2 
3 
4 #include <assert.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include "drd/drd_vc.c"
9 
10 
11 /* Replacements for Valgrind core functionality. */
12 
VG_(malloc)13 void* VG_(malloc)(const HChar* cc, SizeT nbytes)
14 { return malloc(nbytes); }
VG_(realloc)15 void* VG_(realloc)(const HChar* cc, void* p, SizeT size)
16 { return realloc(p, size); }
VG_(free)17 void  VG_(free)(void* p)
18 { return free(p); }
VG_(assert_fail)19 void  VG_(assert_fail)(Bool isCore, const HChar* assertion, const HChar* file,
20                        Int line, const HChar* function, const HChar* format,
21                        ...)
22 {
23   fprintf(stderr,
24           "%s:%u: %s%sAssertion `%s' failed.\n",
25           file,
26           line,
27           function ? (char*)function : "",
28           function ? ": " : "",
29           assertion);
30   fflush(stdout);
31   fflush(stderr);
32   abort();
33 }
34 
VG_(memset)35 void* VG_(memset)(void *s, Int c, SizeT sz)
36 { return memset(s, c, sz); }
VG_(memcpy)37 void* VG_(memcpy)(void *d, const void *s, SizeT sz)
38 { return memcpy(d, s, sz); }
VG_(memcmp)39 Int VG_(memcmp)(const void* s1, const void* s2, SizeT n)
40 { return memcmp(s1, s2, n); }
VG_(printf)41 UInt VG_(printf)(const HChar *format, ...)
42 { UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); return ret; }
VG_(snprintf)43 UInt VG_(snprintf)(HChar* buf, Int size, const HChar *format, ...)
44 { UInt ret; va_list vargs; va_start(vargs, format); ret = vsnprintf(buf, size, format, vargs); va_end(vargs); return ret; }
VG_(strlen)45 SizeT VG_(strlen)(const HChar* str) { return strlen(str); }
VG_(message)46 UInt VG_(message)(VgMsgKind kind, const HChar* format, ...)
47 { UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); printf("\n"); return ret; }
DRD_(is_suppressed)48 Bool DRD_(is_suppressed)(const Addr a1, const Addr a2)
49 { assert(0); }
50 
51 
52 /* Actual unit test */
53 
vc_unittest(void)54 static void vc_unittest(void)
55 {
56   int i;
57   char *str;
58   VectorClock vc1;
59   VCElem vc1elem[] = { { 3, 7 }, { 5, 8 }, };
60   VectorClock vc2;
61   VCElem vc2elem[] = { { 1, 4 }, { 3, 9 }, };
62   VectorClock vc3;
63   VCElem vc4elem[] = { { 1, 3 }, { 2, 1 }, };
64   VectorClock vc4;
65   VCElem vc5elem[] = { { 1, 4 }, };
66   VectorClock vc5;
67 
68   DRD_(vc_init)(&vc1, vc1elem, sizeof(vc1elem)/sizeof(vc1elem[0]));
69   DRD_(vc_init)(&vc2, vc2elem, sizeof(vc2elem)/sizeof(vc2elem[0]));
70   DRD_(vc_init)(&vc3, 0, 0);
71   DRD_(vc_init)(&vc4, vc4elem, sizeof(vc4elem)/sizeof(vc4elem[0]));
72   DRD_(vc_init)(&vc5, vc5elem, sizeof(vc5elem)/sizeof(vc5elem[0]));
73 
74   DRD_(vc_combine)(&vc3, &vc1);
75   DRD_(vc_combine)(&vc3, &vc2);
76 
77   fprintf(stderr, "vc1: %s", (str = DRD_(vc_aprint)(&vc1)));
78   free(str);
79   fprintf(stderr, "\nvc2: %s", (str = DRD_(vc_aprint)(&vc2)));
80   free(str);
81   fprintf(stderr, "\nvc3: %s", (str = DRD_(vc_aprint)(&vc3)));
82   free(str);
83   fprintf(stderr, "\n");
84   fprintf(stderr, "vc_lte(vc1, vc2) = %d, vc_lte(vc1, vc3) = %d,"
85           " vc_lte(vc2, vc3) = %d\nvc_lte(",
86           DRD_(vc_lte)(&vc1, &vc2), DRD_(vc_lte)(&vc1, &vc3),
87           DRD_(vc_lte)(&vc2, &vc3));
88   fprintf(stderr, "%s", (str = DRD_(vc_aprint)(&vc4)));
89   free(str);
90   fprintf(stderr, ", ");
91   fprintf(stderr, "%s", (str = DRD_(vc_aprint)(&vc5)));
92   free(str);
93   fprintf(stderr, ") = %d sw %d\n",
94           DRD_(vc_lte)(&vc4, &vc5), DRD_(vc_lte)(&vc5, &vc4));
95 
96   for (i = 0; i < 64; i++)
97     DRD_(vc_reserve)(&vc1, i);
98   for (i = 64; i > 0; i--)
99     DRD_(vc_reserve)(&vc1, i);
100 
101   DRD_(vc_cleanup)(&vc1);
102   DRD_(vc_cleanup)(&vc2);
103   DRD_(vc_cleanup)(&vc3);
104 }
105 
main(int argc,char ** argv)106 int main(int argc, char** argv)
107 {
108   vc_unittest();
109   return 0;
110 }
111