On 11/09/17 11:31, Adam Dinwoodie wrote: > On Sat, Sep 09, 2017 at 02:13:32PM +0100, Ramsay Jones wrote: >> I ran the test-suite on the 'pu' branch last night (simply because >> that was what I had built at the time!), which resulted in a PASS, >> but t6120 was showing a 'TODO passed' for #52. > > Confirmed, I also see this unexpected pass. > >> This is a test introduced by Michael's 'mg/name-rev-tests-with-short-stack' >> branch, which uses 'ulimit -s' to try and force a stack overflow. >> Unfortunately, 'ulimit -s' seems to have no effect on cygwin. I created >> a test program (see below) to eat up the stack and tried running it >> with various ulimit values (128, 12, 8), but it always seg-faulted >> at the same stack-frame. (after using approx 2MB stack space). > > Yes, Cygwin does not implement the ulimit API from the Single Unix > Specification, per https://cygwin.com/cygwin-api/std-notimpl.html. I Isn't that ulimit(3) not ulimit the bash built-in - which would more than likely be implemented by {get,set}rlimit(). (I haven't looked to find out, obviously!). > suspect the Bash builtin still exists because (a) nobody has bothered to > remove it, (b) including it avoids breaking scripts that assume it > exists but don't particularly rely on its output being sensical, or > (c) both. (d) it seems to provide useful information on some of the limits anyway. >> So, it looks like all ULIMIT_STACK_SIZE tests need to be disabled >> on cygwin. I also wonder about the ULIMIT_FILE_DESCRIPTORS tests, >> but haven't looked into it. >> >> Given that 'ulimit' is a bash built-in, this may also be a problem >> on MinGW and Git-For-Windows, but I can't test on those platforms. > > I'll leave this to the relevant folks to test; I don't have a useful > test environment for those either. That said, I'll note the comment in > t6120 says the ULIMIT_STACK_SIZE prerequisite excludes running the test > on Windows, so I assume it's not a problem there. I suspect that was a guess. ;-) > On Sun, Sep 10, 2017 at 05:58:49PM +0100, Ramsay Jones wrote: >> On 10/09/17 13:27, Michael J Gruber wrote: >>> So, I guess, short of testing the effect of "ulimit -s" with another >>> expensive test, it's best to simply set these prerequisites based on >>> "uname -s". >> >> Yes, I was going to suggest adding !CYGWIN to the test(s) (or perhaps >> to the 'test_lazy_prereq' expression(s)). > > Given the issue is Cygwin not implementing ulimit at all, but Cygwin > Bash pretending everything's fine, I think handling this as a special > case for Cygwin seems like the correct approach. Something like the > below, based on the existing code in test-lib.sh for the PIPE prereq? > > -- >8 -- > diff --git a/t/test-lib.sh b/t/test-lib.sh > index 83f5d3dd2..376cd91ae 100644 > --- a/t/test-lib.sh > +++ b/t/test-lib.sh > @@ -1166,14 +1166,32 @@ test_lazy_prereq UNZIP ' > test $? -ne 127 > ' > > +# On Cygwin, ulimit has no effect because the underlying API hasn't been > +# implemented. Just fail if trying to do something with ulimit. > run_with_limited_cmdline () { > - (ulimit -s 128 && "$@") > + case $(uname -s) in > + CYGWIN*) > + false > + ;; > + *) > + (ulimit -s 128 && "$@") > + ;; > + esac > } > > test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true' > > +# On Cygwin, ulimit has no effect because the underlying API hasn't been > +# implemented. Just fail if trying to do something with ulimit. > run_with_limited_stack () { > - (ulimit -s 128 && "$@") > + case $(uname -s) in > + CYGWIN*) > + false > + ;; > + *) > + (ulimit -s 128 && "$@") > + ;; > + esac > } > > test_lazy_prereq ULIMIT_STACK_SIZE 'run_with_limited_stack true' > What about the other uses of ulimit? (No, I still haven't tried ulimit with open file descriptors - I will assume it doesn't work). I was thinking something more like this: $ git diff diff --git a/t/test-lib.sh b/t/test-lib.sh index 83f5d3dd2..6c939708a 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -1009,6 +1009,11 @@ case $uname_s in GIT_TEST_CMP=mingw_test_cmp ;; *CYGWIN*) + # the ulimit bash built-in is ineffective + # but always succeeds, so always fail instead + ulimit () { + false + } test_set_prereq POSIXPERM test_set_prereq EXECKEEPSPID test_set_prereq CYGWIN $ This assumes that 'ulimit -n 32' fails to limit the number of open files, of course. ATB, Ramsay Jones