t / t9011-svn-da.shon commit builtin-am: invoke applypatch-msg hook (b8803d8)
   1#!/bin/sh
   2
   3test_description='test parsing of svndiff0 files
   4
   5Using the "test-svn-fe -d" helper, check that svn-fe correctly
   6interprets deltas using various facilities (some from the spec,
   7some only learned from practice).
   8'
   9. ./test-lib.sh
  10
  11>empty
  12printf foo >preimage
  13
  14test_expect_success 'reject empty delta' '
  15        test_must_fail test-svn-fe -d preimage empty 0
  16'
  17
  18test_expect_success 'delta can empty file' '
  19        printf "SVNQ" | q_to_nul >clear.delta &&
  20        test-svn-fe -d preimage clear.delta 4 >actual &&
  21        test_cmp empty actual
  22'
  23
  24test_expect_success 'reject svndiff2' '
  25        printf "SVN\002" >bad.filetype &&
  26        test_must_fail test-svn-fe -d preimage bad.filetype 4
  27'
  28
  29test_expect_success 'one-window empty delta' '
  30        printf "SVNQ%s" "QQQQQ" | q_to_nul >clear.onewindow &&
  31        test-svn-fe -d preimage clear.onewindow 9 >actual &&
  32        test_cmp empty actual
  33'
  34
  35test_expect_success 'reject incomplete window header' '
  36        printf "SVNQ%s" "QQQQQ" | q_to_nul >clear.onewindow &&
  37        printf "SVNQ%s" "QQ" | q_to_nul >clear.partialwindow &&
  38        test_must_fail test-svn-fe -d preimage clear.onewindow 6 &&
  39        test_must_fail test-svn-fe -d preimage clear.partialwindow 6
  40'
  41
  42test_expect_success 'reject declared delta longer than actual delta' '
  43        printf "SVNQ%s" "QQQQQ" | q_to_nul >clear.onewindow &&
  44        printf "SVNQ%s" "QQ" | q_to_nul >clear.partialwindow &&
  45        test_must_fail test-svn-fe -d preimage clear.onewindow 14 &&
  46        test_must_fail test-svn-fe -d preimage clear.partialwindow 9
  47'
  48
  49test_expect_success 'two-window empty delta' '
  50        printf "SVNQ%s%s" "QQQQQ" "QQQQQ" | q_to_nul >clear.twowindow &&
  51        test-svn-fe -d preimage clear.twowindow 14 >actual &&
  52        test_must_fail test-svn-fe -d preimage clear.twowindow 13 &&
  53        test_cmp empty actual
  54'
  55
  56test_expect_success 'noisy zeroes' '
  57        printf "SVNQ%s" \
  58                "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQ" |
  59                tr R "\200" |
  60                q_to_nul >clear.noisy &&
  61        len=$(wc -c <clear.noisy) &&
  62        test-svn-fe -d preimage clear.noisy $len &&
  63        test_cmp empty actual
  64'
  65
  66test_expect_success 'reject variable-length int in magic' '
  67        printf "SVNRQ" | tr R "\200" | q_to_nul >clear.badmagic &&
  68        test_must_fail test-svn-fe -d preimage clear.badmagic 5
  69'
  70
  71test_expect_success 'reject truncated integer' '
  72        printf "SVNQ%s%s" "QQQQQ" "QQQQRRQ" |
  73                tr R "\200" |
  74                q_to_nul >clear.fullint &&
  75        printf "SVNQ%s%s" "QQQQQ" "QQQQRR" |
  76                tr RT "\201" |
  77                q_to_nul >clear.partialint &&
  78        test_must_fail test-svn-fe -d preimage clear.fullint 15 &&
  79        test-svn-fe -d preimage clear.fullint 16 &&
  80        test_must_fail test-svn-fe -d preimage clear.partialint 15
  81'
  82
  83test_expect_success 'nonempty (but unused) preimage view' '
  84        printf "SVNQ%b" "Q\003QQQ" | q_to_nul >clear.readpreimage &&
  85        test-svn-fe -d preimage clear.readpreimage 9 >actual &&
  86        test_cmp empty actual
  87'
  88
  89test_expect_success 'preimage view: right endpoint cannot backtrack' '
  90        printf "SVNQ%b%b" "Q\003QQQ" "Q\002QQQ" |
  91                q_to_nul >clear.backtrack &&
  92        test_must_fail test-svn-fe -d preimage clear.backtrack 14
  93'
  94
  95test_expect_success 'preimage view: left endpoint can advance' '
  96        printf "SVNQ%b%b" "Q\003QQQ" "\001\002QQQ" |
  97                q_to_nul >clear.preshrink &&
  98        printf "SVNQ%b%b" "Q\003QQQ" "\001\001QQQ" |
  99                q_to_nul >clear.shrinkbacktrack &&
 100        test-svn-fe -d preimage clear.preshrink 14 >actual &&
 101        test_must_fail test-svn-fe -d preimage clear.shrinkbacktrack 14 &&
 102        test_cmp empty actual
 103'
 104
 105test_expect_success 'preimage view: offsets compared by value' '
 106        printf "SVNQ%b%b" "\001\001QQQ" "\0200Q\003QQQ" |
 107                q_to_nul >clear.noisybacktrack &&
 108        printf "SVNQ%b%b" "\001\001QQQ" "\0200\001\002QQQ" |
 109                q_to_nul >clear.noisyadvance &&
 110        test_must_fail test-svn-fe -d preimage clear.noisybacktrack 15 &&
 111        test-svn-fe -d preimage clear.noisyadvance 15 &&
 112        test_cmp empty actual
 113'
 114
 115test_expect_success 'preimage view: reject truncated preimage' '
 116        printf "SVNQ%b" "\010QQQQ" | q_to_nul >clear.lateemptyread &&
 117        printf "SVNQ%b" "\010\001QQQ" | q_to_nul >clear.latenonemptyread &&
 118        printf "SVNQ%b" "\001\010QQQ" | q_to_nul >clear.longread &&
 119        test_must_fail test-svn-fe -d preimage clear.lateemptyread 9 &&
 120        test_must_fail test-svn-fe -d preimage clear.latenonemptyread 9 &&
 121        test_must_fail test-svn-fe -d preimage clear.longread 9
 122'
 123
 124test_expect_success 'forbid unconsumed inline data' '
 125        printf "SVNQ%b%s%b%s" "QQQQ\003" "bar" "QQQQ\001" "x" |
 126                q_to_nul >inline.clear &&
 127        test_must_fail test-svn-fe -d preimage inline.clear 18 >actual
 128'
 129
 130test_expect_success 'reject truncated inline data' '
 131        printf "SVNQ%b%s" "QQQQ\003" "b" | q_to_nul >inline.trunc &&
 132        test_must_fail test-svn-fe -d preimage inline.trunc 10
 133'
 134
 135test_expect_success 'reject truncated inline data (after instruction section)' '
 136        printf "SVNQ%b%b%s" "QQ\001\001\003" "\0201" "b" | q_to_nul >insn.trunc &&
 137        test_must_fail test-svn-fe -d preimage insn.trunc 11
 138'
 139
 140test_expect_success 'copyfrom_data' '
 141        echo hi >expect &&
 142        printf "SVNQ%b%b%b" "QQ\003\001\003" "\0203" "hi\n" | q_to_nul >copydat &&
 143        test-svn-fe -d preimage copydat 13 >actual &&
 144        test_cmp expect actual
 145'
 146
 147test_expect_success 'multiple copyfrom_data' '
 148        echo hi >expect &&
 149        printf "SVNQ%b%b%b%b%b" "QQ\003\002\003" "\0201\0202" "hi\n" \
 150                "QQQ\002Q" "\0200Q" | q_to_nul >copy.multi &&
 151        len=$(wc -c <copy.multi) &&
 152        test-svn-fe -d preimage copy.multi $len >actual &&
 153        test_cmp expect actual
 154'
 155
 156test_expect_success 'incomplete multiple insn' '
 157        printf "SVNQ%b%b%b" "QQ\003\002\003" "\0203\0200" "hi\n" |
 158                q_to_nul >copy.partial &&
 159        len=$(wc -c <copy.partial) &&
 160        test_must_fail test-svn-fe -d preimage copy.partial $len
 161'
 162
 163test_expect_success 'catch attempt to copy missing data' '
 164        printf "SVNQ%b%b%s%b%s" "QQ\002\002\001" "\0201\0201" "X" \
 165                        "QQQQ\002" "YZ" |
 166                q_to_nul >copy.incomplete &&
 167        len=$(wc -c <copy.incomplete) &&
 168        test_must_fail test-svn-fe -d preimage copy.incomplete $len
 169'
 170
 171test_expect_success 'copyfrom target to repeat data' '
 172        printf foofoo >expect &&
 173        printf "SVNQ%b%b%s" "QQ\006\004\003" "\0203\0100\003Q" "foo" |
 174                q_to_nul >copytarget.repeat &&
 175        len=$(wc -c <copytarget.repeat) &&
 176        test-svn-fe -d preimage copytarget.repeat $len >actual &&
 177        test_cmp expect actual
 178'
 179
 180test_expect_success 'copyfrom target out of order' '
 181        printf foooof >expect &&
 182        printf "SVNQ%b%b%s" \
 183                "QQ\006\007\003" "\0203\0101\002\0101\001\0101Q" "foo" |
 184                q_to_nul >copytarget.reverse &&
 185        len=$(wc -c <copytarget.reverse) &&
 186        test-svn-fe -d preimage copytarget.reverse $len >actual &&
 187        test_cmp expect actual
 188'
 189
 190test_expect_success 'catch copyfrom future' '
 191        printf "SVNQ%b%b%s" "QQ\004\004\003" "\0202\0101\002\0201" "XYZ" |
 192                q_to_nul >copytarget.infuture &&
 193        len=$(wc -c <copytarget.infuture) &&
 194        test_must_fail test-svn-fe -d preimage copytarget.infuture $len
 195'
 196
 197test_expect_success 'copy to sustain' '
 198        printf XYXYXYXYXYXZ >expect &&
 199        printf "SVNQ%b%b%s" "QQ\014\004\003" "\0202\0111Q\0201" "XYZ" |
 200                q_to_nul >copytarget.sustain &&
 201        len=$(wc -c <copytarget.sustain) &&
 202        test-svn-fe -d preimage copytarget.sustain $len >actual &&
 203        test_cmp expect actual
 204'
 205
 206test_expect_success 'catch copy that overflows' '
 207        printf "SVNQ%b%b%s" "QQ\003\003\001" "\0201\0177Q" X |
 208                q_to_nul >copytarget.overflow &&
 209        len=$(wc -c <copytarget.overflow) &&
 210        test_must_fail test-svn-fe -d preimage copytarget.overflow $len
 211'
 212
 213test_expect_success 'copyfrom source' '
 214        printf foo >expect &&
 215        printf "SVNQ%b%b" "Q\003\003\002Q" "\003Q" | q_to_nul >copysource.all &&
 216        test-svn-fe -d preimage copysource.all 11 >actual &&
 217        test_cmp expect actual
 218'
 219
 220test_expect_success 'copy backwards' '
 221        printf oof >expect &&
 222        printf "SVNQ%b%b" "Q\003\003\006Q" "\001\002\001\001\001Q" |
 223                q_to_nul >copysource.rev &&
 224        test-svn-fe -d preimage copysource.rev 15 >actual &&
 225        test_cmp expect actual
 226'
 227
 228test_expect_success 'offsets are relative to window' '
 229        printf fo >expect &&
 230        printf "SVNQ%b%b%b%b" "Q\003\001\002Q" "\001Q" \
 231                "\002\001\001\002Q" "\001Q" |
 232                q_to_nul >copysource.two &&
 233        test-svn-fe -d preimage copysource.two 18 >actual &&
 234        test_cmp expect actual
 235'
 236
 237test_expect_success 'example from notes/svndiff' '
 238        printf aaaaccccdddddddd >expect &&
 239        printf aaaabbbbcccc >source &&
 240        printf "SVNQ%b%b%s" "Q\014\020\007\001" \
 241                "\004Q\004\010\0201\0107\010" d |
 242                q_to_nul >delta.example &&
 243        len=$(wc -c <delta.example) &&
 244        test-svn-fe -d source delta.example $len >actual &&
 245        test_cmp expect actual
 246'
 247
 248test_done