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 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* VG_(malloc)(HChar* cc, SizeT nbytes) 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ return malloc(nbytes); } 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* VG_(realloc)(HChar* cc, void* p, SizeT size) 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ return realloc(p, size); } 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(free)(void* p) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ return free(p); } 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(assert_fail)(Bool isCore, const Char* assertion, const Char* file, 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int line, const Char* 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; } 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt VG_(snprintf)(Char* 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; } 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSizeT VG_(strlen)(const Char* 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