t / t0081-line-buffer.shon commit git-svn: Fix git svn log --show-commit (9963e02)
   1#!/bin/sh
   2
   3test_description="Test the svn importer's input handling routines.
   4
   5These tests exercise the line_buffer library, but their real purpose
   6is to check the assumptions that library makes of the platform's input
   7routines.  Processes engaged in bi-directional communication would
   8hang if fread or fgets is too greedy.
   9
  10While at it, check that input of newlines and null bytes are handled
  11correctly.
  12"
  13. ./test-lib.sh
  14
  15test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
  16
  17generate_tens_of_lines () {
  18        tens=$1 &&
  19        line=$2 &&
  20
  21        i=0 &&
  22        while test $i -lt "$tens"
  23        do
  24                for j in a b c d e f g h i j
  25                do
  26                        echo "$line"
  27                done &&
  28                : $((i = $i + 1)) ||
  29                return
  30        done
  31}
  32
  33long_read_test () {
  34        : each line is 10 bytes, including newline &&
  35        line=abcdefghi &&
  36        echo "$line" >expect &&
  37
  38        if ! test_declared_prereq PIPE
  39        then
  40                echo >&4 "long_read_test: need to declare PIPE prerequisite"
  41                return 127
  42        fi &&
  43        tens_of_lines=$(($1 / 100 + 1)) &&
  44        lines=$(($tens_of_lines * 10)) &&
  45        readsize=$((($lines - 1) * 10 + 3)) &&
  46        copysize=7 &&
  47        rm -f input &&
  48        mkfifo input &&
  49        {
  50                (
  51                        generate_tens_of_lines $tens_of_lines "$line" &&
  52                        exec sleep 100
  53                ) >input &
  54        } &&
  55        test-line-buffer input <<-EOF >output &&
  56        binary $readsize
  57        copy $copysize
  58        EOF
  59        kill $! &&
  60        test_line_count = $lines output &&
  61        tail -n 1 <output >actual &&
  62        test_cmp expect actual
  63}
  64
  65test_expect_success 'setup: have pipes?' '
  66      rm -f frob &&
  67      if mkfifo frob
  68      then
  69                test_set_prereq PIPE
  70      fi
  71'
  72
  73test_expect_success 'hello world' '
  74        echo ">HELLO" >expect &&
  75        test-line-buffer <<-\EOF >actual &&
  76        binary 6
  77        HELLO
  78        EOF
  79        test_cmp expect actual
  80'
  81
  82test_expect_success PIPE '0-length read, no input available' '
  83        printf ">" >expect &&
  84        rm -f input &&
  85        mkfifo input &&
  86        {
  87                sleep 100 >input &
  88        } &&
  89        test-line-buffer input <<-\EOF >actual &&
  90        binary 0
  91        copy 0
  92        EOF
  93        kill $! &&
  94        test_cmp expect actual
  95'
  96
  97test_expect_success '0-length read, send along greeting' '
  98        echo ">HELLO" >expect &&
  99        test-line-buffer <<-\EOF >actual &&
 100        binary 0
 101        copy 6
 102        HELLO
 103        EOF
 104        test_cmp expect actual
 105'
 106
 107test_expect_success PIPE '1-byte read, no input available' '
 108        printf ">%s" ab >expect &&
 109        rm -f input &&
 110        mkfifo input &&
 111        {
 112                (
 113                        printf "%s" a &&
 114                        printf "%s" b &&
 115                        exec sleep 100
 116                ) >input &
 117        } &&
 118        test-line-buffer input <<-\EOF >actual &&
 119        binary 1
 120        copy 1
 121        EOF
 122        kill $! &&
 123        test_cmp expect actual
 124'
 125
 126test_expect_success PIPE 'long read (around 8192 bytes)' '
 127        long_read_test 8192
 128'
 129
 130test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' '
 131        long_read_test 65536
 132'
 133
 134test_expect_success 'read from file descriptor' '
 135        rm -f input &&
 136        echo hello >expect &&
 137        echo hello >input &&
 138        echo copy 6 |
 139        test-line-buffer "&4" 4<input >actual &&
 140        test_cmp expect actual
 141'
 142
 143test_expect_success 'skip, copy null byte' '
 144        echo Q | q_to_nul >expect &&
 145        q_to_nul <<-\EOF | test-line-buffer >actual &&
 146        skip 2
 147        Q
 148        copy 2
 149        Q
 150        EOF
 151        test_cmp expect actual
 152'
 153
 154test_expect_success 'read null byte' '
 155        echo ">QhelloQ" | q_to_nul >expect &&
 156        q_to_nul <<-\EOF | test-line-buffer >actual &&
 157        binary 8
 158        QhelloQ
 159        EOF
 160        test_cmp expect actual
 161'
 162
 163test_expect_success 'long reads are truncated' '
 164        echo ">foo" >expect &&
 165        test-line-buffer <<-\EOF >actual &&
 166        binary 5
 167        foo
 168        EOF
 169        test_cmp expect actual
 170'
 171
 172test_expect_success 'long copies are truncated' '
 173        printf "%s\n" ">" foo >expect &&
 174        test-line-buffer <<-\EOF >actual &&
 175        binary 1
 176
 177        copy 5
 178        foo
 179        EOF
 180        test_cmp expect actual
 181'
 182
 183test_expect_success 'long binary reads are truncated' '
 184        echo ">foo" >expect &&
 185        test-line-buffer <<-\EOF >actual &&
 186        binary 5
 187        foo
 188        EOF
 189        test_cmp expect actual
 190'
 191
 192test_done