File: channel_settings_test.go

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (172 lines) | stat: -rw-r--r-- 5,305 bytes parent folder | download
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package api

import (
	"net/http"
	"testing"

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

func channel(url string, subprotocols ...string) *ChannelSettings {
	return &ChannelSettings{
		Url:            url,
		Subprotocols:   subprotocols,
		MaxSessionTime: 0,
	}
}

func ca(channel *ChannelSettings) *ChannelSettings {
	channel = channel.Clone()
	channel.CAPem = `-----BEGIN CERTIFICATE-----
MIIDJzCCAg+gAwIBAgIUVIL4Kds+1NAurWOrbruWOED104wwDQYJKoZIhvcNAQEL
BQAwIzEhMB8GA1UEAwwYd29ya2hvcnNlLXdlYnNvY2tldC10ZXN0MB4XDTIyMDMw
MjE2Mjk1MloXDTIzMDMwMjE2Mjk1MlowIzEhMB8GA1UEAwwYd29ya2hvcnNlLXdl
YnNvY2tldC10ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtvDg
SlvuPROo6BeyjRVLYfS93rHV0bC+dm4waYFZpf+0nfiajXa5oZM+I6P3Vlim6OFg
kkq1KX8X4ZftEOdsA2dKgaELpsaIOYeeKgvWQgF7+oxCB9CBt67wpI6s8oWUTe2O
mvQqicPdZ53pbv+qRPJcfsckWXWHFM99lOJmeMoA56VoZNNrbmeDPX4+um2fr6Cp
pJ7pJ2UkkJeAWTAZHsYNJClLuIAw7J/AjXJf7gWQkUO2BFKgxC618Un2aQqw+EAX
N81Nn2lPqxsgu1y5VLOng7ZxpvxpDEpsRQoe+sglee+pbMqbpI1OC7tvr6Nvop4H
BmYkHxDDe00JVJXRLwIDAQABo1MwUTAdBgNVHQ4EFgQUnfnpeFXJwCtr3odLWcQa
Fe50ZeIwHwYDVR0jBBgwFoAUnfnpeFXJwCtr3odLWcQaFe50ZeIwDwYDVR0TAQH/
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAXJzX6qcWIRff/k6Vt5OugvGWPYqg
dl2cc/usxmM42q7RfFcgvePjHN0hDTMJFgC8//vmm+i1oTh36ULZebeKH6HyN6gj
wj2a+xDElqRSVkO2xy8LNX5AsI0n+5G/oxVX7cH9eW16zRVntZrQg+4Fc6K6as0l
qF8ccAdMixYh6obn1ij3ThZNwhMTDloQ50LI+ydZpBXPn+LugmpcP6VSE3Wz98/s
FZuUBARp/QnNJO/2eWIZ1K+W/e9U31QhxFxM4niNS21NsZ6yqd/IWrR76Mkxv1PI
h7UpUazMISSqd/AvvZ8XDiAlsHCuppx3AJ4tzE73mdHP5Sf2DWhx/hwuZg==
-----END CERTIFICATE-----
`

	return channel
}

func timeout(channel *ChannelSettings) *ChannelSettings {
	channel = channel.Clone()
	channel.MaxSessionTime = 600

	return channel
}

func header(channel *ChannelSettings, values ...string) *ChannelSettings {
	if len(values) == 0 {
		values = []string{"Dummy Value"}
	}

	channel = channel.Clone()
	channel.Header = http.Header{
		"Header": values,
	}

	return channel
}

func TestClone(t *testing.T) {
	a := ca(header(channel("ws:", "", "")))
	b := a.Clone()

	if a == b {
		t.Fatalf("Address of cloned channel didn't change")
	}

	if &a.Subprotocols == &b.Subprotocols {
		t.Fatalf("Address of cloned subprotocols didn't change")
	}

	if &a.Header == &b.Header {
		t.Fatalf("Address of cloned header didn't change")
	}
}

func TestValidate(t *testing.T) {
	for i, tc := range []struct {
		channel *ChannelSettings
		valid   bool
		msg     string
	}{
		{nil, false, "nil channel"},
		{channel("", ""), false, "empty URL"},
		{channel("ws:"), false, "empty subprotocols"},
		{channel("ws:", "foo"), true, "any subprotocol"},
		{channel("ws:", "foo", "bar"), true, "multiple subprotocols"},
		{channel("ws:", ""), true, "websocket URL"},
		{channel("wss:", ""), true, "secure websocket URL"},
		{channel("http:", ""), false, "HTTP URL"},
		{channel("https:", ""), false, " HTTPS URL"},
		{ca(channel("ws:", "")), true, "any CA pem"},
		{header(channel("ws:", "")), true, "any headers"},
		{ca(header(channel("ws:", ""))), true, "PEM and headers"},
	} {
		if err := tc.channel.Validate(); (err != nil) == tc.valid {
			t.Fatalf("test case %d: "+tc.msg+": valid=%v: %s: %+v", i, tc.valid, err, tc.channel)
		}
	}
}

func TestDialer(t *testing.T) {
	channel := channel("ws:", "foo")
	dialer := channel.Dialer()

	if len(dialer.Subprotocols) != len(channel.Subprotocols) {
		t.Fatalf("Subprotocols don't match: %+v vs. %+v", channel.Subprotocols, dialer.Subprotocols)
	}

	for i, subprotocol := range channel.Subprotocols {
		if dialer.Subprotocols[i] != subprotocol {
			t.Fatalf("Subprotocols don't match: %+v vs. %+v", channel.Subprotocols, dialer.Subprotocols)
		}
	}

	channel = ca(channel)
	dialer = channel.Dialer()

	subjectOfTestCertificate := []byte{48, 35, 49, 33, 48, 31, 6, 3, 85, 4, 3, 12, 24, 119, 111, 114, 107, 104, 111, 114, 115, 101, 45, 119, 101, 98, 115, 111, 99, 107, 101, 116, 45, 116, 101, 115, 116}
	//lint:ignore SA1019 Ignore the deprecation warnings
	// nolint:staticcheck // Ignore the deprecation warnings
	require.Contains(t, dialer.TLSClientConfig.RootCAs.Subjects(), subjectOfTestCertificate)
}

func TestIsEqual(t *testing.T) {
	chann := channel("ws:", "foo")

	channHeader2 := header(chann, "extra")
	channHeader3 := header(chann)
	channHeader3.Header.Add("Extra", "extra")

	channCa2 := ca(chann)
	channCa2.CAPem = "other value"

	for i, tc := range []struct {
		channelA *ChannelSettings
		channelB *ChannelSettings
		expected bool
	}{
		{nil, nil, true},
		{chann, nil, false},
		{nil, chann, false},
		{chann, chann, true},
		{chann.Clone(), chann.Clone(), true},
		{chann, channel("foo:"), false},
		{chann, channel(chann.Url), false},
		{header(chann), header(chann), true},
		{channHeader2, channHeader2, true},
		{channHeader3, channHeader3, true},
		{header(chann), channHeader2, false},
		{header(chann), channHeader3, false},
		{header(chann), chann, false},
		{chann, header(chann), false},
		{ca(chann), ca(chann), true},
		{ca(chann), chann, false},
		{chann, ca(chann), false},
		{ca(header(chann)), ca(header(chann)), true},
		{channCa2, ca(chann), false},
		{chann, timeout(chann), false},
	} {
		if actual := tc.channelA.IsEqual(tc.channelB); tc.expected != actual {
			t.Fatalf(
				"test case %d: Comparison:\n-%+v\n+%+v\nexpected=%v: actual=%v",
				i, tc.channelA, tc.channelB, tc.expected, actual,
			)
		}
	}
}