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