github.com/catandhorse/git-lfs@v2.5.2+incompatible/git/filter_process_scanner_test.go (about) 1 package git 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestFilterProcessScannerInitializesWithCorrectSupportedValues(t *testing.T) { 13 var from, to bytes.Buffer 14 15 pl := newPktline(nil, &from) 16 if err := pl.writePacketText("git-filter-client"); err != nil { 17 t.Fatalf("expected... %v", err.Error()) 18 } 19 20 require.Nil(t, pl.writePacketText("git-filter-client")) 21 require.Nil(t, pl.writePacketList([]string{"version=2"})) 22 23 fps := NewFilterProcessScanner(&from, &to) 24 err := fps.Init() 25 26 assert.Nil(t, err) 27 28 out, err := newPktline(&to, nil).readPacketList() 29 assert.Nil(t, err) 30 assert.Equal(t, []string{"git-filter-server", "version=2"}, out) 31 } 32 33 func TestFilterProcessScannerRejectsUnrecognizedInitializationMessages(t *testing.T) { 34 var from, to bytes.Buffer 35 36 pl := newPktline(nil, &from) 37 require.Nil(t, pl.writePacketText("git-filter-client-unknown")) 38 require.Nil(t, pl.writeFlush()) 39 40 fps := NewFilterProcessScanner(&from, &to) 41 err := fps.Init() 42 43 require.NotNil(t, err) 44 assert.Equal(t, "invalid filter-process pkt-line welcome message: git-filter-client-unknown", err.Error()) 45 assert.Empty(t, to.Bytes()) 46 } 47 48 func TestFilterProcessScannerRejectsUnsupportedFilters(t *testing.T) { 49 var from, to bytes.Buffer 50 51 pl := newPktline(nil, &from) 52 require.Nil(t, pl.writePacketText("git-filter-client")) 53 // Write an unsupported version 54 require.Nil(t, pl.writePacketList([]string{"version=0"})) 55 56 fps := NewFilterProcessScanner(&from, &to) 57 err := fps.Init() 58 59 require.NotNil(t, err) 60 assert.Equal(t, "filter 'version=2' not supported (your Git supports: [version=0])", err.Error()) 61 assert.Empty(t, to.Bytes()) 62 } 63 64 func TestFilterProcessScannerNegotitatesSupportedCapabilities(t *testing.T) { 65 var from, to bytes.Buffer 66 67 pl := newPktline(nil, &from) 68 require.Nil(t, pl.writePacketList([]string{ 69 "capability=clean", "capability=smudge", "capability=not-invented-yet", 70 })) 71 72 fps := NewFilterProcessScanner(&from, &to) 73 caps, err := fps.NegotiateCapabilities() 74 75 assert.Contains(t, caps, "capability=clean") 76 assert.Contains(t, caps, "capability=smudge") 77 assert.Nil(t, err) 78 79 out, err := newPktline(&to, nil).readPacketList() 80 assert.Nil(t, err) 81 assert.Equal(t, []string{"capability=clean", "capability=smudge"}, out) 82 } 83 84 func TestFilterProcessScannerDoesNotNegotitatesUnsupportedCapabilities(t *testing.T) { 85 var from, to bytes.Buffer 86 87 pl := newPktline(nil, &from) 88 // Write an unsupported capability 89 require.Nil(t, pl.writePacketList([]string{ 90 "capability=unsupported", 91 })) 92 93 fps := NewFilterProcessScanner(&from, &to) 94 caps, err := fps.NegotiateCapabilities() 95 96 require.NotNil(t, err) 97 assert.Empty(t, caps) 98 assert.Equal(t, "filter 'capability=clean' not supported (your Git supports: [capability=unsupported])", err.Error()) 99 assert.Empty(t, to.Bytes()) 100 } 101 102 func TestFilterProcessScannerReadsRequestHeadersAndPayload(t *testing.T) { 103 var from, to bytes.Buffer 104 105 pl := newPktline(nil, &from) 106 // Headers 107 require.Nil(t, pl.writePacketList([]string{ 108 "foo=bar", "other=woot", "crazy='sq',\\$x=.bin", 109 })) 110 // Multi-line packet 111 require.Nil(t, pl.writePacketText("first")) 112 require.Nil(t, pl.writePacketText("second")) 113 require.Nil(t, pl.writeFlush()) 114 115 req, err := readRequest(NewFilterProcessScanner(&from, &to)) 116 117 assert.Nil(t, err) 118 assert.Equal(t, req.Header["foo"], "bar") 119 assert.Equal(t, req.Header["other"], "woot") 120 assert.Equal(t, req.Header["crazy"], "'sq',\\$x=.bin") 121 122 payload, err := ioutil.ReadAll(req.Payload) 123 assert.Nil(t, err) 124 assert.Equal(t, []byte("first\nsecond\n"), payload) 125 } 126 127 func TestFilterProcessScannerRejectsInvalidHeaderPackets(t *testing.T) { 128 from := bytes.NewBuffer([]byte{ 129 0x30, 0x30, 0x30, 0x34, // 0004 (invalid packet length) 130 }) 131 132 req, err := readRequest(NewFilterProcessScanner(from, nil)) 133 134 require.NotNil(t, err) 135 assert.Equal(t, "Invalid packet length.", err.Error()) 136 137 assert.Nil(t, req) 138 } 139 140 func TestFilterProcessScannerWritesLists(t *testing.T) { 141 var to bytes.Buffer 142 143 fps := NewFilterProcessScanner(nil, &to) 144 err := fps.WriteList([]string{"hello", "goodbye"}) 145 146 assert.NoError(t, err) 147 assert.Equal(t, "000ahello\n000cgoodbye\n0000", to.String()) 148 } 149 150 // readRequest performs a single scan operation on the given 151 // `*FilterProcessScanner`, "s", and returns: an error if there was one, or a 152 // request if there was one. If neither, it returns (nil, nil). 153 func readRequest(s *FilterProcessScanner) (*Request, error) { 154 s.Scan() 155 156 if err := s.Err(); err != nil { 157 return nil, err 158 } 159 160 return s.Request(), nil 161 }