• J
    t0081 (line-buffer): add buffering tests · d280f683
    Jonathan Nieder 提交于
    POSIX makes the behavior of read(2) from a pipe fairly clear: a read
    from an empty pipe will block until there is data available and any
    other read will not block, prefering to return a partial result.
    Likewise, fread(3) and fgets(3) are clearly specified to act as
    though implemented by calling fgetc(3) in a simple loop.  But the
    buffering behavior of fgetc is less clear.
    
    Luckily, no sane platform is going to implement fgetc by calling the
    equivalent of read(2) more than once.  fgetc has to be able to
    return without filling its buffer to preserve errno when errors are
    encountered anyway.  So let's assume the simpler behavior (trust) but
    add some tests to catch insane platforms that violate that when they
    come (verify).
    
    First check that fread can handle a 0-length read from an empty fifo.
    Because open(O_RDONLY) blocks until the writing end is open, open the
    writing end of the fifo in advance in a subshell.
    
    Next try short inputs from a pipe that is not filled all the way.
    
    Lastly (two tests) try very large inputs from a pipe that will not fit
    in the relevant buffers.  The first of these tests reads a little
    more than 8192 bytes, which is BUFSIZ (the size of stdio's buffers)
    on this Linux machine.  The second reads a little over 64 KiB (the
    pipe capacity on Linux) and is not run unless requested by setting
    the GIT_REMOTE_SVN_TEST_BIG_FILES environment variable.
    Signed-off-by: NJonathan Nieder <jrnieder@gmail.com>
    d280f683
test-line-buffer.c 1.9 KB