start of new file
[IRC.git] / Robust / src / Runtime / DSTM / interface / tests / testdht.c
1 #include <stdio.h>
2 #include "dht.h"
3 #include "clookup.h"
4
5 #define NUM_ITEMS 100000
6
7 int main()
8 {
9         unsigned int key;
10         unsigned int val;
11         unsigned int vals[NUM_ITEMS];
12         int retval;
13         int error;
14         chashtable_t *localHash;
15
16         dhtInit(0x80C3AF45, DHT_NO_KEY_LIMIT);
17
18         localHash = chashCreate(HASH_SIZE, LOADFACTOR);
19         srandom(time(0));
20
21         for (key = 1; key < NUM_ITEMS; key++)
22         {
23                 vals[key] = random();
24         }
25
26         sleep(5);
27
28         printf("testing dhtInsert() and dhtSearch()\n");
29
30         for (key = 0; key < NUM_ITEMS; key++)
31         {
32                 dhtInsert(key, vals[key]);
33         }
34
35         error = 0;
36         for (key = 1; key < NUM_ITEMS; key++)
37         {
38                 retval = dhtSearch(key, &val);
39                 if (retval == 1)
40                 {
41                         printf("item not found: key = %d, expected val = %d\n", key, vals[key]);
42                         error = 1;
43                 }
44                 else if (retval == -1)
45                 {
46                         printf("internal error: key = %d, expected val = %d\n", key, vals[key]);
47                         error = 1;
48                 }
49                 else if (retval == 0)
50                 {
51                         if (vals[key] != val)
52                         {
53                                 printf("unexpected value: key = %d, expected val = %d, val = %d\n", key, vals[key], val);
54                                 error = 1;
55                         }
56                 }
57         }
58         if (!error)
59                 printf("test completed successfully\n");
60         else
61                 printf("one or more errors occurred\n");
62
63         printf("(this currently fails if key = 0 OR val = 0, due to underlying hash table)\n");
64         printf("testing underlying hash table (clookup.h)\n");
65
66         for (key = 1; key < NUM_ITEMS; key++)
67         {
68                 chashInsert(localHash, key, (void *)vals[key]);
69         }
70
71         error = 0;
72         for (key = 1; key < NUM_ITEMS; key++)
73         {
74                 val = (unsigned int)chashSearch(localHash, key);
75                 if ((void *)val == NULL)
76                 {
77                         printf("item not found: key = %d, expected val = %d\n", key, vals[key]);
78                         error = 1;
79                 }
80                 else
81                 {
82                         if (vals[key] != val)
83                         {
84                                 printf("unexpected value: key = %d, expected val = %d, val = %d\n", key, vals[key], val);
85                                 error = 1;
86                         }
87                 }
88                 for (key = NUM_ITEMS; key < NUM_ITEMS + 20; key++)
89                 {
90                         val = (unsigned int)chashSearch(localHash, key);
91                         if ((void *)val != NULL)
92                         {
93                                 printf("error: returned value for key that wasn't inserted: key = %d, val = %d\n", key, val);
94                                 error = 1;
95                         }
96                 }
97         }
98
99         if (!error)
100                 printf("test completed successfully\n");
101         else
102                 printf("one or more errors occurred\n");
103
104         printf("testing dhtRemove(), removing half of the keys, and verifying that the other half is still there\n");
105         
106         for (key = 0; key < NUM_ITEMS / 2; key++)
107         {
108                 dhtRemove(key);
109         }
110         error = 0;
111         for (key = 0; key < NUM_ITEMS / 2; key++)
112         {
113                 retval = dhtSearch(key, &val);
114                 if (retval == 0)
115                 {
116                         printf("error: found removed item: key = %d, val = %d\n", key, val);
117                         error = 1;
118                 }
119                 else if (retval == -1)
120                 {
121                         printf("internal error: key = %d, val = %d\n", key, val);
122                         error = 1;
123                 }
124         }
125         for (key = NUM_ITEMS / 2; key < NUM_ITEMS; key++)
126         {
127                 retval = dhtSearch(key, &val);
128                 if (retval == 1)
129                 {
130                         printf("item not found: key = %d, expected val = %d\n", key, vals[key]);
131                         error = 1;
132                 }
133                 else if (retval == -1)
134                 {
135                         printf("internal error: key = %d, expected val = %d\n", key, vals[key]);
136                         error = 1;
137                 }
138                 else if (retval == 0)
139                 {
140                         if (vals[key] != val)
141                         {
142                                 printf("unexpected value: key = %d, expected val = %d, val = %d\n", key, vals[key], val);
143                                 error = 1;
144                         }
145                 }
146         }
147
148         if (!error)
149                 printf("test completed successfully\n");
150         else
151                 printf("one or more errors occurred\n");
152
153         sleep(5);
154
155         dhtExit();
156
157         return 0;
158 }
159