t / t0081-line-buffer.shon commit Merge branch 'js/maint-stash-index-copy' (281ee1d)
   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                        sleep 100
  53                } >input &
  54        } &&
  55        test-line-buffer input <<-EOF >output &&
  56        read $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        read 6
  77        HELLO
  78        EOF
  79        test_cmp expect actual
  80'
  81
  82test_expect_success PIPE '0-length read, no input available' '
  83        >expect &&
  84        rm -f input &&
  85        mkfifo input &&
  86        {
  87                sleep 100 >input &
  88        } &&
  89        test-line-buffer input <<-\EOF >actual &&
  90        read 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        read 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                        sleep 100
 116                } >input &
 117        } &&
 118        test-line-buffer input <<-\EOF >actual &&
 119        read 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 'buffer_read_string copes with null byte' '
 144        >expect &&
 145        q_to_nul <<-\EOF | test-line-buffer >actual &&
 146        read 2
 147        Q
 148        EOF
 149        test_cmp expect actual
 150'
 151
 152test_expect_success 'skip, copy null byte' '
 153        echo Q | q_to_nul >expect &&
 154        q_to_nul <<-\EOF | test-line-buffer >actual &&
 155        skip 2
 156        Q
 157        copy 2
 158        Q
 159        EOF
 160        test_cmp expect actual
 161'
 162
 163test_expect_success 'read null byte' '
 164        echo ">QhelloQ" | q_to_nul >expect &&
 165        q_to_nul <<-\EOF | test-line-buffer >actual &&
 166        binary 8
 167        QhelloQ
 168        EOF
 169        test_cmp expect actual
 170'
 171
 172test_expect_success 'long reads are truncated' '
 173        echo foo >expect &&
 174        test-line-buffer <<-\EOF >actual &&
 175        read 5
 176        foo
 177        EOF
 178        test_cmp expect actual
 179'
 180
 181test_expect_success 'long copies are truncated' '
 182        printf "%s\n" "" foo >expect &&
 183        test-line-buffer <<-\EOF >actual &&
 184        read 1
 185
 186        copy 5
 187        foo
 188        EOF
 189        test_cmp expect actual
 190'
 191
 192test_expect_success 'long binary reads are truncated' '
 193        echo ">foo" >expect &&
 194        test-line-buffer <<-\EOF >actual &&
 195        binary 5
 196        foo
 197        EOF
 198        test_cmp expect actual
 199'
 200
 201test_done