From 3067ec21fb34f46fd1683aad6d455e7d6da8f52e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 12 Apr 2002 03:26:19 +0000 Subject: - added a mangling test suite that measures the collision rate on randomised filenames - fixed several mangling bugs that the test suite pointed out (This used to be commit 858fa7efc34f6e7cdf8500900aed3f7943c91348) --- source3/torture/mangle_test.c | 162 ++++++++++++++++++++++++++++++++++++++++++ source3/torture/torture.c | 28 +++++--- 2 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 source3/torture/mangle_test.c (limited to 'source3/torture') diff --git a/source3/torture/mangle_test.c b/source3/torture/mangle_test.c new file mode 100644 index 0000000000..9024925beb --- /dev/null +++ b/source3/torture/mangle_test.c @@ -0,0 +1,162 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester - mangling test + Copyright (C) Andrew Tridgell 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static TDB_CONTEXT *tdb; + +#define NAME_LENGTH 30 + +static unsigned total, collisions; + +static BOOL test_one(struct cli_state *cli, const char *name) +{ + int fnum; + fstring shortname; + fstring name2; + NTSTATUS status; + TDB_DATA data; + + total++; + + fnum = cli_open(cli, name, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + if (fnum == -1) { + printf("open of %s failed (%s)\n", name, cli_errstr(cli)); + return False; + } + + if (!cli_close(cli, fnum)) { + printf("close of %s failed (%s)\n", name, cli_errstr(cli)); + return False; + } + + /* get the short name */ + status = cli_qpathinfo_alt_name(cli, name, shortname); + if (!NT_STATUS_IS_OK(status)) { + printf("query altname of %s failed (%s)\n", name, cli_errstr(cli)); + return False; + } + + snprintf(name2, sizeof(name2), "\\mangle_test\\%s", shortname); + if (!cli_unlink(cli, name2)) { + printf("unlink of %s (%s) failed (%s)\n", + name2, name, cli_errstr(cli)); + return False; + } + + /* see if the short name is already in the tdb */ + data = tdb_fetch_by_string(tdb, shortname); + if (data.dptr) { + /* maybe its a duplicate long name? */ + if (strcasecmp(name, data.dptr) != 0) { + /* we have a collision */ + collisions++; + printf("Collision between %s and %s -> %s\n", + name, data.dptr, shortname); + } + free(data.dptr); + } else { + /* store it for later */ + tdb_store_by_string(tdb, shortname, name, strlen(name)+1); + } + + return True; +} + + +static void gen_name(char *name) +{ + const char *chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-$~"; + unsigned max_idx = strlen(chars); + unsigned len; + int i; + char *p; + + fstrcpy(name, "\\mangle_test\\"); + p = name + strlen(name); + + len = 1 + random() % NAME_LENGTH; + + for (i=0;i Date: Fri, 12 Apr 2002 03:42:44 +0000 Subject: better mangling test. We now test that we can create by long name and delete by short name, and that we can create by short name and delete by long name our old mangling code fails this test. also tweaked the random filename generation to produce more likely collisions (This used to be commit 65609c52960c2b5938150a2fdb5290541f4e0225) --- source3/torture/mangle_test.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'source3/torture') diff --git a/source3/torture/mangle_test.c b/source3/torture/mangle_test.c index 9024925beb..7f05b953c5 100644 --- a/source3/torture/mangle_test.c +++ b/source3/torture/mangle_test.c @@ -22,7 +22,7 @@ static TDB_CONTEXT *tdb; -#define NAME_LENGTH 30 +#define NAME_LENGTH 20 static unsigned total, collisions; @@ -61,6 +61,24 @@ 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)); + return False; + } + /* see if the short name is already in the tdb */ data = tdb_fetch_by_string(tdb, shortname); if (data.dptr) { @@ -83,7 +101,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 +121,19 @@ 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 high probability of a good extension length */ + if (random() % 2 == 0) { + char *s = strrchr(p, '.'); + if (s) { + s[4] = 0; + } + } } -- cgit From 71c2943d34e6a30819d7c36d7c1d5d5eab2eb968 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 12 Apr 2002 03:54:13 +0000 Subject: nicer measurement of failures and collisions (This used to be commit 61c61f6b4f22c1ef6f837145f5e05730706cc8d4) --- source3/torture/mangle_test.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'source3/torture') diff --git a/source3/torture/mangle_test.c b/source3/torture/mangle_test.c index 7f05b953c5..2d5b3610d5 100644 --- a/source3/torture/mangle_test.c +++ b/source3/torture/mangle_test.c @@ -24,7 +24,7 @@ static TDB_CONTEXT *tdb; #define NAME_LENGTH 20 -static unsigned total, collisions; +static unsigned total, collisions, failures; static BOOL test_one(struct cli_state *cli, const char *name) { @@ -76,7 +76,9 @@ static BOOL test_one(struct cli_state *cli, const char *name) if (!cli_unlink(cli, name)) { printf("unlink2 of %s (%s) failed (%s)\n", name, name2, cli_errstr(cli)); - return False; + failures++; + cli_unlink(cli, name2); + return True; } /* see if the short name is already in the tdb */ @@ -127,6 +129,11 @@ static void gen_name(char *name) 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, '.'); @@ -173,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); } -- cgit