1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
package stats
import (
"bytes"
"errors"
"testing"
"time"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest"
)
func TestSendPack_Parse(t *testing.T) {
t.Run("valid input", func(t *testing.T) {
var progress []byte
sendPack := &SendPack{
ReportProgress: func(p []byte) {
progress = append(progress, p...)
},
}
var response bytes.Buffer
startTime := time.Now()
gittest.WritePktlineString(t, &response, "\x01000eunpack ok\n0015ok refs/heads/branch\n0000")
gittest.WritePktlineString(t, &response, "\x010013ok refs/heads/other0000\n")
gittest.WritePktlineString(t, &response, "\x02progress-bytes")
gittest.WritePktlineFlush(t, &response)
err := sendPack.Parse(&response)
require.NoError(t, err)
endTime := time.Now()
require.Equal(t, 4, sendPack.packets)
require.Equal(t, 44, sendPack.largestPacketSize)
for _, band := range []string{"pack", "progress"} {
require.True(t, startTime.Before(sendPack.multiband[band].firstPacket))
require.True(t, endTime.After(sendPack.multiband[band].firstPacket))
sendPack.multiband[band].firstPacket = startTime
}
require.Equal(t, &bandInfo{
firstPacket: startTime,
size: 73,
packets: 2,
}, sendPack.multiband["pack"])
require.Equal(t, &bandInfo{
firstPacket: startTime,
size: 15,
packets: 1,
}, sendPack.multiband["progress"])
require.Equal(t, &bandInfo{}, sendPack.multiband["error"])
require.Equal(t, "progress-bytes", string(progress))
})
t.Run("data after flush", func(t *testing.T) {
var response bytes.Buffer
gittest.WritePktlineString(t, &response, "\x01000eunpack ok\n0000")
gittest.WritePktlineFlush(t, &response)
gittest.WritePktlineString(t, &response, "\x01somethingsomething")
err := (&SendPack{}).Parse(&response)
require.Equal(t, errors.New("received extra packet after flush"), err)
})
t.Run("unpack error", func(t *testing.T) {
var response bytes.Buffer
gittest.WritePktlineString(t, &response, "\x010011unpack error\n0000")
err := (&SendPack{}).Parse(&response)
require.Equal(t, errors.New("expected unpack ok, got \"unpack error\\n\""), err)
})
t.Run("error sideband", func(t *testing.T) {
var response bytes.Buffer
gittest.WritePktlineString(t, &response, "\x01000eunpack ok\n0000")
gittest.WritePktlineString(t, &response, "\x03error-bytes")
gittest.WritePktlineFlush(t, &response)
err := (&SendPack{}).Parse(&response)
require.Equal(t, errors.New("received error: \"error-bytes\""), err)
})
t.Run("failed reference update", func(t *testing.T) {
var response bytes.Buffer
gittest.WritePktlineString(t, &response, "\x01000eunpack ok\n0000")
gittest.WritePktlineString(t, &response, "\x010014ok refs/heads/branch0000")
gittest.WritePktlineString(t, &response, "\x010021ng refs/heads/feature failure0000")
gittest.WritePktlineFlush(t, &response)
err := (&SendPack{}).Parse(&response)
require.Equal(t, errors.New("reference update failed: \"ng refs/heads/feature failure\""), err)
})
}
|