nicer measurement of failures and collisions
[sfrench/samba-autobuild/.git] / source3 / torture / mangle_test.c
index 9024925beb15376e0ea7048d54351754cac149b3..2d5b3610d557a7e5ed7d90e1091f7e6fb9cfbe89 100644 (file)
@@ -22,9 +22,9 @@
 
 static TDB_CONTEXT *tdb;
 
-#define NAME_LENGTH 30
+#define NAME_LENGTH 20
 
-static unsigned total, collisions;
+static unsigned total, collisions, failures;
 
 static BOOL test_one(struct cli_state *cli, const char *name)
 {
@@ -61,6 +61,26 @@ static BOOL test_one(struct cli_state *cli, const char *name)
                return False;
        }
 
+       /* recreate by short name */
+       fnum = cli_open(cli, name2, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
+       if (fnum == -1) {
+               printf("open2 of %s failed (%s)\n", name2, cli_errstr(cli));
+               return False;
+       }
+       if (!cli_close(cli, fnum)) {
+               printf("close of %s failed (%s)\n", name, cli_errstr(cli));
+               return False;
+       }
+
+       /* and unlink by long name */
+       if (!cli_unlink(cli, name)) {
+               printf("unlink2 of %s  (%s) failed (%s)\n", 
+                      name, name2, cli_errstr(cli));
+               failures++;
+               cli_unlink(cli, name2);
+               return True;
+       }
+
        /* see if the short name is already in the tdb */
        data = tdb_fetch_by_string(tdb, shortname);
        if (data.dptr) {
@@ -83,7 +103,7 @@ static BOOL test_one(struct cli_state *cli, const char *name)
 
 static void gen_name(char *name)
 {
-       const char *chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-$~";
+       const char *chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-$~...";
        unsigned max_idx = strlen(chars);
        unsigned len;
        int i;
@@ -103,6 +123,24 @@ static void gen_name(char *name)
        if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) {
                p[0] = '_';
        }
+
+       /* have a high probability of a common lead char */
+       if (random() % 2 == 0) {
+               p[0] = 'A';
+       }
+
+       /* and a medium probability of a common lead string */
+       if (random() % 10 == 0) {
+               strncpy(p, "ABCDE", 5);
+       }
+
+       /* and a high probability of a good extension length */
+       if (random() % 2 == 0) {
+               char *s = strrchr(p, '.');
+               if (s) {
+                       s[4] = 0;
+               }
+       }
 }
 
 
@@ -142,21 +180,22 @@ BOOL torture_mangle(int dummy)
                        break;
                }
                if (total && total % 100 == 0) {
-                       printf("collisions %u/%u  - %.2f%%\r",
-                              collisions, total, (100.0*collisions) / total);
+                       printf("collisions %u/%u  - %.2f%%   (%u failures)\r",
+                              collisions, total, (100.0*collisions) / total, failures);
                }
        }
 
+       cli_unlink(&cli, "\\mangle_test\\*");
        if (!cli_rmdir(&cli, "\\mangle_test")) {
                printf("ERROR: Failed to remove directory\n");
                return False;
        }
 
-       printf("\nTotal collisions %u/%u  - %.2f%%\n",
-              collisions, total, (100.0*collisions) / total);
+       printf("\nTotal collisions %u/%u  - %.2f%%   (%u failures)\n",
+              collisions, total, (100.0*collisions) / total, failures);
 
        torture_close_connection(&cli);
 
        printf("mangle test finished\n");
-       return True;
+       return (failures == 0);
 }