1package openssh
2
3import (
4	"bytes"
5	"testing"
6
7	sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer"
8)
9
10var _ sshfx.PacketMarshaller = &FSyncExtendedPacket{}
11
12func init() {
13	RegisterExtensionFSync()
14}
15
16func TestFSyncExtendedPacket(t *testing.T) {
17	const (
18		id     = 42
19		handle = "somehandle"
20	)
21
22	ep := &FSyncExtendedPacket{
23		Handle: handle,
24	}
25
26	data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil))
27	if err != nil {
28		t.Fatal("unexpected error:", err)
29	}
30
31	want := []byte{
32		0x00, 0x00, 0x00, 40,
33		200,
34		0x00, 0x00, 0x00, 42,
35		0x00, 0x00, 0x00, 17, 'f', 's', 'y', 'n', 'c', '@', 'o', 'p', 'e', 'n', 's', 's', 'h', '.', 'c', 'o', 'm',
36		0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e',
37	}
38
39	if !bytes.Equal(data, want) {
40		t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want)
41	}
42
43	var p sshfx.ExtendedPacket
44
45	// UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed.
46	if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil {
47		t.Fatal("unexpected error:", err)
48	}
49
50	if p.ExtendedRequest != extensionFSync {
51		t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extensionFSync)
52	}
53
54	ep, ok := p.Data.(*FSyncExtendedPacket)
55	if !ok {
56		t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *FSyncExtendedPacket", p.Data)
57	}
58
59	if ep.Handle != handle {
60		t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", ep.Handle, handle)
61	}
62}
63