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  }