Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the trace library and fixed a few source of potential bugs in heap.
[simgrid.git] / testsuite / xbt / dict_crash.c
1 /* $Id$ */
2
3 /* dict_crash - A crash test for dictionnaries                              */
4
5 /* Authors: Martin Quinson                                                  */
6 /* Copyright (C) 2003 the OURAGAN project.                                  */
7
8 /* This program is free software; you can redistribute it and/or modify it
9    under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #include <gras.h>
12 #include <time.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15
16 #define NB_ELM 20000
17 #define SIZEOFKEY 1024
18
19 static void print_str(void *str);
20 static void print_str(void *str) {
21   printf("%s",(char*)str);
22 }
23
24 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"Logging specific to this test");
25
26 static xbt_error_t traverse(xbt_dict_t head) {
27   xbt_dict_cursor_t cursor=NULL;
28   char *key;
29   char *data;
30
31   xbt_dict_foreach(head,cursor,key,data) {
32     /*    printf("   Seen:  %s=%s\n",key,data); */
33     xbt_assert2 (!strcmp(key,data),
34       "Key(%s) != value(%s). Abording\n",key,data);
35   }
36   return no_error;
37 }
38
39 static xbt_error_t countelems(xbt_dict_t head,int*count) {
40   xbt_dict_cursor_t cursor;
41   char *key;
42   void *data;
43   *count=0;
44
45   xbt_dict_foreach(head,cursor,key,data) {
46     (*count)++;
47   }
48   return no_error;
49 }
50
51 int main(int argc,char **argv) {
52   xbt_error_t errcode;
53   xbt_dict_t head=NULL;
54   int i,j,k, nb;
55   char *key;
56   void *data;
57
58   xbt_init_defaultlog(&argc,argv,"dict.thresh=verbose");
59   srand((unsigned int)time(NULL));
60
61   printf("Dictionnary: CRASH test:\n");
62   printf(" Fill the struct, count its elems and frees the structure (x20)\n");
63   printf(" using 1000 elements with %d chars long randomized keys.\n",SIZEOFKEY);
64   printf(" (a point is a test)\n");
65
66   for (i=0;i<20;i++) {
67     head=xbt_dict_new();
68     if (i%10) printf("."); else printf("%d",i/10); fflush(stdout);
69     nb=0;
70     for (j=0;j<1000;j++) {
71       if (!(key=malloc(SIZEOFKEY))) {
72         fprintf(stderr,"Out of memory\n");
73         return 1;
74       }
75
76       for (k=0;k<SIZEOFKEY-1;k++)
77         key[k]=rand() % ('z' - 'a') + 'a';
78       key[k]='\0';
79       /*      printf("[%d %s]\n",j,key); */
80       xbt_dict_set(head,key,key,&free);
81     }
82     nb=0;
83     /*    xbt_dict_dump(head,(void (*)(void*))&printf); */
84     TRYFAIL(countelems(head,&nb));
85     if (nb != 1000) {
86        printf ("\nI found %d elements, and not 1000\n",nb);
87        abort();
88     }     
89     TRYFAIL(traverse(head));
90     xbt_dict_free(&head);
91     xbt_dict_free(&head);
92   }
93
94
95   head=xbt_dict_new();
96   printf("\n Fill 20 000 elements, with keys being the number of element\n");
97   printf("  (a point is 1 000 elements)\n");
98   for (j=0;j<NB_ELM;j++) {
99     if (!(j%1000)) {
100       printf("."); 
101       fflush(stdout);
102     }
103     if (!(key=malloc(10))) {
104       fprintf(stderr,"Out of memory\n");
105       abort();
106     }
107     
108     sprintf(key,"%d",j);
109     xbt_dict_set(head,key,key,&free);
110   }
111
112   printf("\n Count the elements (retrieving the key and data for each): \n");
113   TRYFAIL(countelems(head,&i));
114
115   printf(" There is %d elements\n",i);
116   printf("\n Search my 20 000 elements 20 times. (a point is a test)\n");
117   if (!(key=malloc(10))) {
118     fprintf(stderr,"Out of memory\n");
119     abort();
120   } 
121   for (i=0;i<20;i++) {
122     if (i%10) printf("."); else printf("%d",i/10); fflush(stdout);
123     for (j=0;j<NB_ELM;j++) {
124       
125       sprintf(key,"%d",j);
126       TRYFAIL(xbt_dict_get(head,key,&data));
127       if (strcmp(key,(char*)data)) {
128         printf("key=%s != data=%s\n",key,(char*)data);
129         abort();
130       }
131     }
132   }
133   free(key);
134
135   printf("\n Remove my 20 000 elements. (a point is 10 000 elements)\n");
136   if (!(key=malloc(10))) {
137     fprintf(stderr,"Out of memory\n");
138     abort();
139   }
140   for (j=0;j<NB_ELM;j++) {
141     if (!(j%10000)) printf("."); fflush(stdout);
142     
143     sprintf(key,"%d",j);
144     TRYFAIL(xbt_dict_remove(head,key));
145   }
146   printf("\n");
147   free(key);
148
149   
150   printf("\n Free the structure (twice)\n");
151   xbt_dict_free(&head);
152   xbt_dict_free(&head);
153   
154   xbt_exit();
155   return 0;
156 }