Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/public-api-server/pkg/proxy/conn_test.go
2500 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package proxy
6
7
import (
8
"context"
9
"net/url"
10
"testing"
11
12
gitpod "github.com/gitpod-io/gitpod/gitpod-protocol"
13
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
14
"github.com/gitpod-io/gitpod/public-api-server/pkg/origin"
15
"github.com/golang/mock/gomock"
16
lru "github.com/hashicorp/golang-lru"
17
"github.com/stretchr/testify/require"
18
)
19
20
func TestConnectionPool(t *testing.T) {
21
ctrl := gomock.NewController(t)
22
defer ctrl.Finish()
23
srv := gitpod.NewMockAPIInterface(ctrl)
24
25
cache, err := lru.New(2)
26
require.NoError(t, err)
27
pool := &ConnectionPool{
28
cache: cache,
29
connConstructor: func(ctx context.Context, token auth.Token) (gitpod.APIInterface, error) {
30
return srv, nil
31
},
32
}
33
34
fooToken := auth.NewAccessToken("foo")
35
barToken := auth.NewAccessToken("bar")
36
bazToken := auth.NewAccessToken("baz")
37
38
_, err = pool.Get(context.Background(), fooToken)
39
require.NoError(t, err)
40
require.Equal(t, 1, pool.cache.Len())
41
42
_, err = pool.Get(context.Background(), barToken)
43
require.NoError(t, err)
44
require.Equal(t, 2, pool.cache.Len())
45
46
_, err = pool.Get(context.Background(), bazToken)
47
require.NoError(t, err)
48
require.Equal(t, 2, pool.cache.Len(), "must keep only last two connectons")
49
require.True(t, pool.cache.Contains(pool.cacheKey(barToken, "")))
50
require.True(t, pool.cache.Contains(pool.cacheKey(bazToken, "")))
51
}
52
53
func TestConnectionPool_ByDistinctOrigins(t *testing.T) {
54
ctrl := gomock.NewController(t)
55
defer ctrl.Finish()
56
srv := gitpod.NewMockAPIInterface(ctrl)
57
58
cache, err := lru.New(2)
59
require.NoError(t, err)
60
pool := &ConnectionPool{
61
cache: cache,
62
connConstructor: func(ctx context.Context, token auth.Token) (gitpod.APIInterface, error) {
63
return srv, nil
64
},
65
}
66
67
token := auth.NewAccessToken("foo")
68
69
ctxWithOriginA := origin.ToContext(context.Background(), "originA")
70
ctxWithOriginB := origin.ToContext(context.Background(), "originB")
71
72
_, err = pool.Get(ctxWithOriginA, token)
73
require.NoError(t, err)
74
require.Equal(t, 1, pool.cache.Len())
75
76
_, err = pool.Get(ctxWithOriginB, token)
77
require.NoError(t, err)
78
require.Equal(t, 2, pool.cache.Len())
79
}
80
81
func TestEndpointBasedOnToken(t *testing.T) {
82
u, err := url.Parse("wss://server:3000")
83
require.NoError(t, err)
84
85
endpointForAccessToken, err := getEndpointBasedOnToken(auth.NewAccessToken("foo"), u)
86
require.NoError(t, err)
87
require.Equal(t, "wss://server:3000/v1", endpointForAccessToken)
88
89
endpointForCookie, err := getEndpointBasedOnToken(auth.NewCookieToken("foo"), u)
90
require.NoError(t, err)
91
require.Equal(t, "wss://server:3000/gitpod", endpointForCookie)
92
}
93
94