Welcome to mirror list, hosted at ThFree Co, Russian Federation.

send_pack_test.go « stats « git « internal - gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6dd126e85c356b2382994ea1b1002fb3b0c1b449 (plain)
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)
	})
}