$19 GRAYBYTE WORDPRESS FILE MANAGER $77

SERVER : in-mum-web1330.main-hosting.eu #1 SMP Mon Feb 10 22:45:17 UTC 2025
SERVER IP : 88.222.243.76 | ADMIN IP 216.73.216.215
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/go/pkg/mod/github.com/hashicorp/memberlist@v0.5.0/

HOME
Current File : /opt/go/pkg/mod/github.com/hashicorp/memberlist@v0.5.0//label_test.go
package memberlist

import (
	"bytes"
	"io"
	"net"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestAddLabelHeaderToPacket(t *testing.T) {
	type testcase struct {
		buf          []byte
		label        string
		expectPacket []byte
		expectErr    string
	}

	run := func(t *testing.T, tc testcase) {
		got, err := AddLabelHeaderToPacket(tc.buf, tc.label)
		if tc.expectErr != "" {
			require.Error(t, err)
			require.Contains(t, err.Error(), tc.expectErr)
		} else {
			require.NoError(t, err)
			require.Equal(t, tc.expectPacket, got)
		}
	}

	longLabel := strings.Repeat("a", 255)

	cases := map[string]testcase{
		"nil buf with no label": testcase{
			buf:          nil,
			label:        "",
			expectPacket: nil,
		},
		"nil buf with label": testcase{
			buf:          nil,
			label:        "foo",
			expectPacket: append([]byte{byte(hasLabelMsg), 3}, []byte("foo")...),
		},
		"message with label": testcase{
			buf:          []byte("something"),
			label:        "foo",
			expectPacket: append([]byte{byte(hasLabelMsg), 3}, []byte("foosomething")...),
		},
		"message with no label": testcase{
			buf:          []byte("something"),
			label:        "",
			expectPacket: []byte("something"),
		},
		"message with almost too long label": testcase{
			buf:          []byte("something"),
			label:        longLabel,
			expectPacket: append([]byte{byte(hasLabelMsg), 255}, []byte(longLabel+"something")...),
		},
		"label too long by one byte": testcase{
			buf:       []byte("something"),
			label:     longLabel + "x",
			expectErr: `label "` + longLabel + `x" is too long`,
		},
	}

	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			run(t, tc)
		})
	}
}

func TestRemoveLabelHeaderFromPacket(t *testing.T) {
	type testcase struct {
		buf          []byte
		expectLabel  string
		expectPacket []byte
		expectErr    string
	}

	run := func(t *testing.T, tc testcase) {
		gotBuf, gotLabel, err := RemoveLabelHeaderFromPacket(tc.buf)
		if tc.expectErr != "" {
			require.Error(t, err)
			require.Contains(t, err.Error(), tc.expectErr)
		} else {
			require.NoError(t, err)
			require.Equal(t, tc.expectPacket, gotBuf)
			require.Equal(t, tc.expectLabel, gotLabel)
		}
	}

	cases := map[string]testcase{
		"empty buf": testcase{
			buf:          []byte{},
			expectLabel:  "",
			expectPacket: []byte{},
		},
		"ping with no label": testcase{
			buf:          buildBuffer(t, pingMsg, "blah"),
			expectLabel:  "",
			expectPacket: buildBuffer(t, pingMsg, "blah"),
		},
		"error with no label": testcase{ // 2021-10: largest standard message type
			buf:          buildBuffer(t, errMsg, "blah"),
			expectLabel:  "",
			expectPacket: buildBuffer(t, errMsg, "blah"),
		},
		"v1 encrypt with no label": testcase{ // 2021-10: highest encryption version
			buf:          buildBuffer(t, maxEncryptionVersion, "blah"),
			expectLabel:  "",
			expectPacket: buildBuffer(t, maxEncryptionVersion, "blah"),
		},
		"buf too small for label": testcase{
			buf:       buildBuffer(t, hasLabelMsg, "x"),
			expectErr: `cannot decode label; packet has been truncated`,
		},
		"buf too small for label size": testcase{
			buf:       buildBuffer(t, hasLabelMsg),
			expectErr: `cannot decode label; packet has been truncated`,
		},
		"label empty": testcase{
			buf:       buildBuffer(t, hasLabelMsg, 0, "x"),
			expectErr: `label header cannot be empty when present`,
		},
		"label truncated": testcase{
			buf:       buildBuffer(t, hasLabelMsg, 2, "x"),
			expectErr: `cannot decode label; packet has been truncated`,
		},
		"ping with label": testcase{
			buf:          buildBuffer(t, hasLabelMsg, 3, "abc", pingMsg, "blah"),
			expectLabel:  "abc",
			expectPacket: buildBuffer(t, pingMsg, "blah"),
		},
		"error with label": testcase{ // 2021-10: largest standard message type
			buf:          buildBuffer(t, hasLabelMsg, 3, "abc", errMsg, "blah"),
			expectLabel:  "abc",
			expectPacket: buildBuffer(t, errMsg, "blah"),
		},
		"v1 encrypt with label": testcase{ // 2021-10: highest encryption version
			buf:          buildBuffer(t, hasLabelMsg, 3, "abc", maxEncryptionVersion, "blah"),
			expectLabel:  "abc",
			expectPacket: buildBuffer(t, maxEncryptionVersion, "blah"),
		},
	}

	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			run(t, tc)
		})
	}
}

func TestAddLabelHeaderToStream(t *testing.T) {
	type testcase struct {
		label      string
		expectData []byte
		expectErr  string
	}

	suffixData := "EXTRA DATA"

	run := func(t *testing.T, tc testcase) {
		server, client := net.Pipe()
		defer server.Close()
		defer client.Close()

		var (
			dataCh = make(chan []byte, 1)
			errCh  = make(chan error, 1)
		)
		go func() {
			var buf bytes.Buffer
			_, err := io.Copy(&buf, server)
			if err != nil {
				errCh <- err
			}
			dataCh <- buf.Bytes()
		}()

		err := AddLabelHeaderToStream(client, tc.label)
		if tc.expectErr != "" {
			require.Error(t, err)
			require.Contains(t, err.Error(), tc.expectErr)
			return
		}
		require.NoError(t, err)

		client.Write([]byte(suffixData))
		client.Close()

		expect := make([]byte, 0, len(suffixData)+len(tc.expectData))
		expect = append(expect, tc.expectData...)
		expect = append(expect, suffixData...)

		select {
		case err := <-errCh:
			require.NoError(t, err)
		case got := <-dataCh:
			require.Equal(t, expect, got)
		}
	}

	longLabel := strings.Repeat("a", 255)

	cases := map[string]testcase{
		"no label": testcase{
			label:      "",
			expectData: nil,
		},
		"with label": testcase{
			label:      "foo",
			expectData: buildBuffer(t, hasLabelMsg, 3, "foo"),
		},
		"almost too long label": testcase{
			label:      longLabel,
			expectData: buildBuffer(t, hasLabelMsg, 255, longLabel),
		},
		"label too long by one byte": testcase{
			label:     longLabel + "x",
			expectErr: `label "` + longLabel + `x" is too long`,
		},
	}

	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			run(t, tc)
		})
	}
}

func TestRemoveLabelHeaderFromStream(t *testing.T) {
	type testcase struct {
		buf         []byte
		expectLabel string
		expectData  []byte
		expectErr   string
	}

	run := func(t *testing.T, tc testcase) {
		server, client := net.Pipe()
		defer server.Close()
		defer client.Close()

		var (
			errCh = make(chan error, 1)
		)
		go func() {
			_, err := server.Write(tc.buf)
			if err != nil {
				errCh <- err
			}
			server.Close()
		}()

		newConn, gotLabel, err := RemoveLabelHeaderFromStream(client)
		if tc.expectErr != "" {
			require.Error(t, err)
			require.Contains(t, err.Error(), tc.expectErr)
			return
		}
		require.NoError(t, err)

		gotBuf, err := io.ReadAll(newConn)
		require.NoError(t, err)

		require.Equal(t, tc.expectData, gotBuf)
		require.Equal(t, tc.expectLabel, gotLabel)
	}

	cases := map[string]testcase{
		"empty buf": testcase{
			buf:         []byte{},
			expectLabel: "",
			expectData:  []byte{},
		},
		"ping with no label": testcase{
			buf:         buildBuffer(t, pingMsg, "blah"),
			expectLabel: "",
			expectData:  buildBuffer(t, pingMsg, "blah"),
		},
		"error with no label": testcase{ // 2021-10: largest standard message type
			buf:         buildBuffer(t, errMsg, "blah"),
			expectLabel: "",
			expectData:  buildBuffer(t, errMsg, "blah"),
		},
		"v1 encrypt with no label": testcase{ // 2021-10: highest encryption version
			buf:         buildBuffer(t, maxEncryptionVersion, "blah"),
			expectLabel: "",
			expectData:  buildBuffer(t, maxEncryptionVersion, "blah"),
		},
		"buf too small for label": testcase{
			buf:       buildBuffer(t, hasLabelMsg, "x"),
			expectErr: `cannot decode label; stream has been truncated`,
		},
		"buf too small for label size": testcase{
			buf:       buildBuffer(t, hasLabelMsg),
			expectErr: `cannot decode label; stream has been truncated`,
		},
		"label empty": testcase{
			buf:       buildBuffer(t, hasLabelMsg, 0, "x"),
			expectErr: `label header cannot be empty when present`,
		},
		"label truncated": testcase{
			buf:       buildBuffer(t, hasLabelMsg, 2, "x"),
			expectErr: `cannot decode label; stream has been truncated`,
		},
		"ping with label": testcase{
			buf:         buildBuffer(t, hasLabelMsg, 3, "abc", pingMsg, "blah"),
			expectLabel: "abc",
			expectData:  buildBuffer(t, pingMsg, "blah"),
		},
		"error with label": testcase{ // 2021-10: largest standard message type
			buf:         buildBuffer(t, hasLabelMsg, 3, "abc", errMsg, "blah"),
			expectLabel: "abc",
			expectData:  buildBuffer(t, errMsg, "blah"),
		},
		"v1 encrypt with label": testcase{ // 2021-10: highest encryption version
			buf:         buildBuffer(t, hasLabelMsg, 3, "abc", maxEncryptionVersion, "blah"),
			expectLabel: "abc",
			expectData:  buildBuffer(t, maxEncryptionVersion, "blah"),
		},
	}

	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			run(t, tc)
		})
	}
}

func buildBuffer(t *testing.T, stuff ...interface{}) []byte {
	var buf bytes.Buffer
	for _, item := range stuff {
		switch x := item.(type) {
		case int:
			x2 := uint(x)
			if x2 > 255 {
				t.Fatalf("int is too big")
			}
			buf.WriteByte(byte(x2))
		case byte:
			buf.WriteByte(byte(x))
		case messageType:
			buf.WriteByte(byte(x))
		case encryptionVersion:
			buf.WriteByte(byte(x))
		case string:
			buf.Write([]byte(x))
		case []byte:
			buf.Write(x)
		default:
			t.Fatalf("unexpected type %T", item)
		}
	}
	return buf.Bytes()
}

func TestLabelOverhead(t *testing.T) {
	require.Equal(t, 0, labelOverhead(""))
	require.Equal(t, 3, labelOverhead("a"))
	require.Equal(t, 9, labelOverhead("abcdefg"))
}

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
25 Jan 2024 4.43 PM
root / root
0755
.github
--
25 Jan 2024 4.43 PM
root / root
0555
internal
--
25 Jan 2024 4.43 PM
root / root
0555
test
--
25 Jan 2024 4.43 PM
root / root
0555
.gitignore
0.264 KB
25 Jan 2024 4.43 PM
root / root
0444
.golangci.yml
2.646 KB
25 Jan 2024 4.43 PM
root / root
0444
LICENSE
15.603 KB
25 Jan 2024 4.43 PM
root / root
0444
Makefile
0.654 KB
25 Jan 2024 4.43 PM
root / root
0444
README.md
3.12 KB
25 Jan 2024 4.43 PM
root / root
0444
alive_delegate.go
0.577 KB
25 Jan 2024 4.43 PM
root / root
0444
awareness.go
1.9 KB
25 Jan 2024 4.43 PM
root / root
0444
awareness_test.go
0.915 KB
25 Jan 2024 4.43 PM
root / root
0444
broadcast.go
3.233 KB
25 Jan 2024 4.43 PM
root / root
0444
broadcast_test.go
0.564 KB
25 Jan 2024 4.43 PM
root / root
0444
config.go
15.32 KB
25 Jan 2024 4.43 PM
root / root
0444
config_test.go
2.171 KB
25 Jan 2024 4.43 PM
root / root
0444
conflict_delegate.go
0.367 KB
25 Jan 2024 4.43 PM
root / root
0444
delegate.go
1.808 KB
25 Jan 2024 4.43 PM
root / root
0444
event_delegate.go
1.873 KB
25 Jan 2024 4.43 PM
root / root
0444
go.mod
0.714 KB
25 Jan 2024 4.43 PM
root / root
0444
go.sum
4.714 KB
25 Jan 2024 4.43 PM
root / root
0444
integ_test.go
1.972 KB
25 Jan 2024 4.43 PM
root / root
0444
keyring.go
4.399 KB
25 Jan 2024 4.43 PM
root / root
0444
keyring_test.go
3.626 KB
25 Jan 2024 4.43 PM
root / root
0444
label.go
4.724 KB
25 Jan 2024 4.43 PM
root / root
0444
label_test.go
9.289 KB
25 Jan 2024 4.43 PM
root / root
0444
logging.go
0.443 KB
25 Jan 2024 4.43 PM
root / root
0444
logging_test.go
0.782 KB
25 Jan 2024 4.43 PM
root / root
0444
memberlist.go
22.886 KB
25 Jan 2024 4.43 PM
root / root
0444
memberlist_test.go
49.766 KB
25 Jan 2024 4.43 PM
root / root
0444
merge_delegate.go
0.557 KB
25 Jan 2024 4.43 PM
root / root
0444
mock_transport.go
4.287 KB
25 Jan 2024 4.43 PM
root / root
0444
net.go
38.072 KB
25 Jan 2024 4.43 PM
root / root
0444
net_test.go
20.005 KB
25 Jan 2024 4.43 PM
root / root
0444
net_transport.go
10.031 KB
25 Jan 2024 4.43 PM
root / root
0444
peeked_conn.go
1.558 KB
25 Jan 2024 4.43 PM
root / root
0444
ping_delegate.go
0.63 KB
25 Jan 2024 4.43 PM
root / root
0444
queue.go
11.117 KB
25 Jan 2024 4.43 PM
root / root
0444
queue_test.go
6.806 KB
25 Jan 2024 4.43 PM
root / root
0444
security.go
5.315 KB
25 Jan 2024 4.43 PM
root / root
0444
security_test.go
1.474 KB
25 Jan 2024 4.43 PM
root / root
0444
state.go
37.886 KB
25 Jan 2024 4.43 PM
root / root
0444
state_test.go
62.422 KB
25 Jan 2024 4.43 PM
root / root
0444
suspicion.go
4.197 KB
25 Jan 2024 4.43 PM
root / root
0444
suspicion_test.go
4.392 KB
25 Jan 2024 4.43 PM
root / root
0444
tag.sh
0.39 KB
25 Jan 2024 4.43 PM
root / root
0444
todo.md
0.206 KB
25 Jan 2024 4.43 PM
root / root
0444
transport.go
5.372 KB
25 Jan 2024 4.43 PM
root / root
0444
transport_test.go
5.192 KB
25 Jan 2024 4.43 PM
root / root
0444
util.go
8.501 KB
25 Jan 2024 4.43 PM
root / root
0444
util_test.go
8.381 KB
25 Jan 2024 4.43 PM
root / root
0444

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF