Skip to content

Commit

Permalink
t0060: loosen overly strict expectations
Browse files Browse the repository at this point in the history
The dirname() tests file were developed and tested on only the five
platforms available to the developer at the time, namely: Linux (both 32
and 64bit), Windows XP 32-bit (MSVC), MinGW 32-bit and Cygwin 32-bit.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html
(i.e. the POSIX spec) says, in part:

	If the string pointed to by path consists entirely of the '/'
	character, basename() shall return a pointer to the string "/".
	If the string pointed to by path is exactly "//", it is
	implementation-defined whether "/" or "//" is returned.

The thinking behind testing precise, OS-dependent output values was to
document that different setups produce different values. However, as the
test failures on MacOSX illustrated eloquently: hardcoding pretty much each
and every setup's expectations is pretty fragile.

This is not limited to the "//" vs "/" case, of course, other inputs are
also allowed to produce multiple outputs by the POSIX specs.

So let's just test for all allowed values and be done with it. This still
documents that Git cannot rely on one particular output value in those
cases, so the intention of the original tests is still met.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Jan 15, 2016
1 parent 7d1aaa6 commit 371471c
Showing 1 changed file with 21 additions and 57 deletions.
78 changes: 21 additions & 57 deletions test-path-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ static void normalize_argv_string(const char **var, const char *input)
struct test_data {
const char *from; /* input: transform from this ... */
const char *to; /* output: ... to this. */
const char *alternative; /* output: ... or this. */
};

static int test_function(struct test_data *data, char *(*func)(char *input),
Expand All @@ -58,11 +59,18 @@ static int test_function(struct test_data *data, char *(*func)(char *input),
strcpy(buffer, data[i].from);
to = func(buffer);
}
if (strcmp(to, data[i].to)) {
if (!strcmp(to, data[i].to))
continue;
if (!data[i].alternative)
error("FAIL: %s(%s) => '%s' != '%s'\n",
funcname, data[i].from, to, data[i].to);
failed = 1;
}
else if (!strcmp(to, data[i].alternative))
continue;
else
error("FAIL: %s(%s) => '%s' != '%s', '%s'\n",
funcname, data[i].from, to, data[i].to,
data[i].alternative);
failed = 1;
}
return failed;
}
Expand All @@ -74,15 +82,9 @@ static struct test_data basename_data[] = {
{ ".", "." },
{ "..", ".." },
{ "/", "/" },
#if defined(__CYGWIN__) && !defined(NO_LIBGEN_H)
{ "//", "//" },
{ "///", "//" },
{ "////", "//" },
#else
{ "//", "/" },
{ "///", "/" },
{ "////", "/" },
#endif
{ "//", "/", "//" },
{ "///", "/", "//" },
{ "////", "/", "//" },
{ "usr", "usr" },
{ "/usr", "usr" },
{ "/usr/", "usr" },
Expand All @@ -92,7 +94,6 @@ static struct test_data basename_data[] = {
{ "usr/lib///", "lib" },

#if defined(__MINGW32__) || defined(_MSC_VER)

/* --- win32 type paths --- */
{ "\\usr", "usr" },
{ "\\usr\\", "usr" },
Expand All @@ -111,26 +112,9 @@ static struct test_data basename_data[] = {
{ "C:a", "a" },
{ "C:/", "/" },
{ "C:///", "/" },
#if defined(NO_LIBGEN_H)
{ "\\", "\\" },
{ "\\\\", "\\" },
{ "\\\\\\", "\\" },
#else

/* win32 platform variations: */
#if defined(__MINGW32__)
{ "\\", "/" },
{ "\\\\", "/" },
{ "\\\\\\", "/" },
#endif

#if defined(_MSC_VER)
{ "\\", "\\" },
{ "\\\\", "\\" },
{ "\\\\\\", "\\" },
#endif

#endif
{ "\\", "\\", "/" },
{ "\\\\", "\\", "/" },
{ "\\\\\\", "\\", "/" },
#endif
{ NULL, NULL }
};
Expand All @@ -142,14 +126,9 @@ static struct test_data dirname_data[] = {
{ ".", "." },
{ "..", "." },
{ "/", "/" },
{ "//", "//" },
#if defined(__CYGWIN__) && !defined(NO_LIBGEN_H)
{ "///", "//" },
{ "////", "//" },
#else
{ "///", "/" },
{ "////", "/" },
#endif
{ "//", "/", "//" },
{ "///", "/", "//" },
{ "////", "/", "//" },
{ "usr", "." },
{ "/usr", "/" },
{ "/usr/", "/" },
Expand All @@ -159,7 +138,6 @@ static struct test_data dirname_data[] = {
{ "usr/lib///", "usr" },

#if defined(__MINGW32__) || defined(_MSC_VER)

/* --- win32 type paths --- */
{ "\\", "\\" },
{ "\\\\", "\\\\" },
Expand All @@ -180,21 +158,7 @@ static struct test_data dirname_data[] = {
{ "C:usr/lib///", "C:usr" },
{ "\\\\\\", "\\" },
{ "\\\\\\\\", "\\" },
#if defined(NO_LIBGEN_H)
{ "C:", "C:." },
#else

/* win32 platform variations: */
#if defined(__MINGW32__)
/* the following is clearly wrong ... */
{ "C:", "." },
#endif

#if defined(_MSC_VER)
{ "C:", "C:." },
#endif

#endif
{ "C:", "C:.", "." },
#endif
{ NULL, NULL }
};
Expand Down

0 comments on commit 371471c

Please sign in to comment.