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,
)
}
}
}
|