github.com/pkg/sftp@v1.13.6/internal/encoding/ssh/filexfer/extended_packets_test.go (about)

     1  package sshfx
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  )
     7  
     8  type testExtendedData struct {
     9  	value uint8
    10  }
    11  
    12  func (d *testExtendedData) MarshalBinary() ([]byte, error) {
    13  	buf := NewBuffer(make([]byte, 0, 4))
    14  
    15  	buf.AppendUint8(d.value ^ 0x2a)
    16  
    17  	return buf.Bytes(), nil
    18  }
    19  
    20  func (d *testExtendedData) UnmarshalBinary(data []byte) error {
    21  	buf := NewBuffer(data)
    22  
    23  	v := buf.ConsumeUint8()
    24  	if buf.Err != nil {
    25  		return buf.Err
    26  	}
    27  
    28  	d.value = v ^ 0x2a
    29  
    30  	return nil
    31  }
    32  
    33  var _ Packet = &ExtendedPacket{}
    34  
    35  func TestExtendedPacketNoData(t *testing.T) {
    36  	const (
    37  		id              = 42
    38  		extendedRequest = "foo@example"
    39  	)
    40  
    41  	p := &ExtendedPacket{
    42  		ExtendedRequest: extendedRequest,
    43  	}
    44  
    45  	buf, err := ComposePacket(p.MarshalPacket(id, nil))
    46  	if err != nil {
    47  		t.Fatal("unexpected error:", err)
    48  	}
    49  
    50  	want := []byte{
    51  		0x00, 0x00, 0x00, 20,
    52  		200,
    53  		0x00, 0x00, 0x00, 42,
    54  		0x00, 0x00, 0x00, 11, 'f', 'o', 'o', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e',
    55  	}
    56  
    57  	if !bytes.Equal(buf, want) {
    58  		t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
    59  	}
    60  
    61  	*p = ExtendedPacket{}
    62  
    63  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
    64  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
    65  		t.Fatal("unexpected error:", err)
    66  	}
    67  
    68  	if p.ExtendedRequest != extendedRequest {
    69  		t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest)
    70  	}
    71  }
    72  
    73  func TestExtendedPacketTestData(t *testing.T) {
    74  	const (
    75  		id              = 42
    76  		extendedRequest = "foo@example"
    77  		textValue       = 13
    78  	)
    79  
    80  	const value = 13
    81  
    82  	p := &ExtendedPacket{
    83  		ExtendedRequest: extendedRequest,
    84  		Data: &testExtendedData{
    85  			value: textValue,
    86  		},
    87  	}
    88  
    89  	buf, err := ComposePacket(p.MarshalPacket(id, nil))
    90  	if err != nil {
    91  		t.Fatal("unexpected error:", err)
    92  	}
    93  
    94  	want := []byte{
    95  		0x00, 0x00, 0x00, 21,
    96  		200,
    97  		0x00, 0x00, 0x00, 42,
    98  		0x00, 0x00, 0x00, 11, 'f', 'o', 'o', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e',
    99  		0x27,
   100  	}
   101  
   102  	if !bytes.Equal(buf, want) {
   103  		t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
   104  	}
   105  
   106  	*p = ExtendedPacket{
   107  		Data: new(testExtendedData),
   108  	}
   109  
   110  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
   111  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
   112  		t.Fatal("unexpected error:", err)
   113  	}
   114  
   115  	if p.ExtendedRequest != extendedRequest {
   116  		t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest)
   117  	}
   118  
   119  	if buf, ok := p.Data.(*testExtendedData); !ok {
   120  		t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf)
   121  
   122  	} else if buf.value != value {
   123  		t.Errorf("UnmarshalPacketBody(): Data.value was %#x, but expected %#x", buf.value, value)
   124  	}
   125  
   126  	*p = ExtendedPacket{}
   127  
   128  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
   129  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
   130  		t.Fatal("unexpected error:", err)
   131  	}
   132  
   133  	if p.ExtendedRequest != extendedRequest {
   134  		t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest)
   135  	}
   136  
   137  	wantBuffer := []byte{0x27}
   138  
   139  	if buf, ok := p.Data.(*Buffer); !ok {
   140  		t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf)
   141  
   142  	} else if !bytes.Equal(buf.b, wantBuffer) {
   143  		t.Errorf("UnmarshalPacketBody(): Data was %X, but expected %X", buf.b, wantBuffer)
   144  	}
   145  }
   146  
   147  var _ Packet = &ExtendedReplyPacket{}
   148  
   149  func TestExtendedReplyNoData(t *testing.T) {
   150  	const (
   151  		id = 42
   152  	)
   153  
   154  	p := &ExtendedReplyPacket{}
   155  
   156  	buf, err := ComposePacket(p.MarshalPacket(id, nil))
   157  	if err != nil {
   158  		t.Fatal("unexpected error:", err)
   159  	}
   160  
   161  	want := []byte{
   162  		0x00, 0x00, 0x00, 5,
   163  		201,
   164  		0x00, 0x00, 0x00, 42,
   165  	}
   166  
   167  	if !bytes.Equal(buf, want) {
   168  		t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
   169  	}
   170  
   171  	*p = ExtendedReplyPacket{}
   172  
   173  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
   174  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
   175  		t.Fatal("unexpected error:", err)
   176  	}
   177  }
   178  
   179  func TestExtendedReplyPacketTestData(t *testing.T) {
   180  	const (
   181  		id        = 42
   182  		textValue = 13
   183  	)
   184  
   185  	const value = 13
   186  
   187  	p := &ExtendedReplyPacket{
   188  		Data: &testExtendedData{
   189  			value: textValue,
   190  		},
   191  	}
   192  
   193  	buf, err := ComposePacket(p.MarshalPacket(id, nil))
   194  	if err != nil {
   195  		t.Fatal("unexpected error:", err)
   196  	}
   197  
   198  	want := []byte{
   199  		0x00, 0x00, 0x00, 6,
   200  		201,
   201  		0x00, 0x00, 0x00, 42,
   202  		0x27,
   203  	}
   204  
   205  	if !bytes.Equal(buf, want) {
   206  		t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
   207  	}
   208  
   209  	*p = ExtendedReplyPacket{
   210  		Data: new(testExtendedData),
   211  	}
   212  
   213  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
   214  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
   215  		t.Fatal("unexpected error:", err)
   216  	}
   217  
   218  	if buf, ok := p.Data.(*testExtendedData); !ok {
   219  		t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf)
   220  
   221  	} else if buf.value != value {
   222  		t.Errorf("UnmarshalPacketBody(): Data.value was %#x, but expected %#x", buf.value, value)
   223  	}
   224  
   225  	*p = ExtendedReplyPacket{}
   226  
   227  	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
   228  	if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
   229  		t.Fatal("unexpected error:", err)
   230  	}
   231  
   232  	wantBuffer := []byte{0x27}
   233  
   234  	if buf, ok := p.Data.(*Buffer); !ok {
   235  		t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf)
   236  
   237  	} else if !bytes.Equal(buf.b, wantBuffer) {
   238  		t.Errorf("UnmarshalPacketBody(): Data was %X, but expected %X", buf.b, wantBuffer)
   239  	}
   240  }